opencv—常用函数学习_“干货“_8

avatar
作者
筋斗云
阅读量:3

目录

二二、图像积分

计算图像的积分图像 (integral)

解释

应用场景

快速计算图像块和的示例

二三、图像边界处理

使用 copyMakeBorder 添加图像边界

解释

边界类型示例

二四、图像修复

使用 inpaint 进行图像修复

解释

实际应用

去除图像中的水印示例

http://t.csdnimg.cn/i8pqt —— opencv—常用函数学习_“干货“_总(VIP)

散的正在一部分一部分发,不需要VIP。

资料整理不易,有用话给个赞和收藏吧。


二二、图像积分

        在OpenCV中,图像积分是计算图像中某一矩形区域内所有像素值的总和。积分图像(也称为积分图)是一种加速某些图像处理操作的技术,如快速计算图像块的和。OpenCV提供了integral函数来计算积分图像。

图像积分函数
integral计算积分图像

计算图像的积分图像 (integral)
import cv2 import numpy as np  # 读取图像并转换为灰度图 image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)  # 计算积分图像 integral_image = cv2.integral(image)  # 显示原图像和积分图像 cv2.imshow('Original Image', image) cv2.imshow('Integral Image', integral_image.astype(np.uint8))  # 显示时转换为uint8类型 cv2.waitKey(0) cv2.destroyAllWindows()  # 打印积分图像 print("Integral Image:\n", integral_image) 

解释

  • integral函数:计算积分图像。积分图像中的每个元素表示原图像中从(0,0)到该位置的矩形区域内所有像素值的总和。
  • 显示积分图像:为了显示积分图像,我们将其转换为uint8类型,但要注意,积分图像中的值通常会大于255,所以在显示时会有信息损失。实际应用时,不需要进行这种转换。

应用场景

        积分图像在许多图像处理任务中非常有用,特别是在需要快速计算图像块和的场景。以下是一些常见的应用场景:

  1. 快速图像块和计算:在任意大小的矩形区域内快速计算像素值的总和。
  2. 特征提取:如Haar特征提取。
  3. 图像滤波:如快速均值滤波。

快速计算图像块和的示例

        假设我们需要计算图像中一个矩形区域的和,使用积分图像可以大大加速这一过程。

# 定义矩形区域的左上角和右下角坐标 top_left = (10, 10) bottom_right = (50, 50)  # 使用积分图像计算矩形区域的和 sum_rect = (integral_image[bottom_right[1], bottom_right[0]] -             integral_image[top_left[1] - 1, bottom_right[0]] -             integral_image[bottom_right[1], top_left[0] - 1] +             integral_image[top_left[1] - 1, top_left[0] - 1])  print("Sum of the rectangle:", sum_rect) 

        在这个示例中,通过使用积分图像,我们可以在常数时间内计算任意矩形区域内的像素值和,而不需要遍历整个区域。

        通过这些示例,可以看到如何使用OpenCV中的integral函数来计算积分图像,并使用积分图像进行快速图像处理操作。根据具体的应用需求,可以灵活运用积分图像来实现高效的图像处理任务。

二三、图像边界处理

        在OpenCV中,边界处理是图像处理中的一个重要步骤。通过添加边界,可以解决图像卷积和滤波过程中出现的边界效应问题。OpenCV提供了一个函数 copyMakeBorder 来实现图像边界的添加。

图像边界处理函数
copyMakeBorder在图像周围添加边界

使用 copyMakeBorder 添加图像边界
import cv2 import numpy as np  # 读取图像 image = cv2.imread('path_to_image.jpg')  # 设置边界大小 top, bottom, left, right = 10, 10, 10, 10  # 添加边界 bordered_image = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[255, 0, 0])  # 显示原图像和添加边界后的图像 cv2.imshow('Original Image', image) cv2.imshow('Bordered Image', bordered_image) cv2.waitKey(0) cv2.destroyAllWindows() 

解释

  • copyMakeBorder函数:在图像的四周添加边界。该函数的参数如下:
    • src:输入图像。
    • top:顶边界的大小。
    • bottom:底边界的大小。
    • left:左边界的大小。
    • right:右边界的大小。
    • borderType:边界类型,可以是以下几种:
      • cv2.BORDER_CONSTANT:常量边界,填充指定的常量值。
      • cv2.BORDER_REFLECT:反射边界,边界元素被镜像反射。
      • cv2.BORDER_REFLECT_101:反射边界,但不重复边界元素。
      • cv2.BORDER_REPLICATE:复制边界,边界元素被复制。
      • cv2.BORDER_WRAP:环绕边界,边界元素被环绕。
    • value:在使用cv2.BORDER_CONSTANT时,填充的常量值。

边界类型示例

        下面是一些不同边界类型的示例代码:

# 常量边界 constant_border = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[255, 0, 0])  # 反射边界 reflect_border = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_REFLECT)  # 反射边界101 reflect_101_border = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_REFLECT_101)  # 复制边界 replicate_border = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_REPLICATE)  # 环绕边界 wrap_border = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_WRAP)  # 显示不同类型的边界处理效果 cv2.imshow('Constant Border', constant_border) cv2.imshow('Reflect Border', reflect_border) cv2.imshow('Reflect 101 Border', reflect_101_border) cv2.imshow('Replicate Border', replicate_border) cv2.imshow('Wrap Border', wrap_border) cv2.waitKey(0) cv2.destroyAllWindows() 

        这些示例展示了如何使用OpenCV中的copyMakeBorder函数来添加不同类型的边界。根据具体的应用需求,可以选择合适的边界类型来实现图像处理任务中的边界处理。

二四、图像修复

        在OpenCV中,图像修复(Inpainting)是一种用来恢复损坏图像或去除图像中不需要部分的技术。OpenCV提供了inpaint函数来实现这一功能。这个函数可以根据图像中周围的像素来填补缺失或受损的区域,从而使图像恢复原貌。

图像修复函数
inpaint对图像进行修复

使用 inpaint 进行图像修复
import cv2 import numpy as np  # 读取图像 image = cv2.imread('path_to_image.jpg')  # 创建掩码,白色表示需要修复的区域 mask = np.zeros(image.shape[:2], dtype=np.uint8) mask[100:150, 100:150] = 255  # 这是一个示例区域  # 使用Navier-Stokes算法进行图像修复 restored_image_ns = cv2.inpaint(image, mask, 3, cv2.INPAINT_NS)  # 使用Telea算法进行图像修复 restored_image_telea = cv2.inpaint(image, mask, 3, cv2.INPAINT_TELEA)  # 显示原图像、掩码和修复后的图像 cv2.imshow('Original Image', image) cv2.imshow('Mask', mask) cv2.imshow('Restored Image (Navier-Stokes)', restored_image_ns) cv2.imshow('Restored Image (Telea)', restored_image_telea) cv2.waitKey(0) cv2.destroyAllWindows() 

解释

  • 创建掩码:首先,我们创建一个与图像大小相同的掩码,其中白色(255)表示需要修复的区域,黑色(0)表示不需要修复的区域。
  • inpaint函数:使用cv2.inpaint函数对图像进行修复,该函数有四个参数:
    • src:输入图像。
    • inpaintMask:掩码图像,指定需要修复的区域。
    • inpaintRadius:修复的半径。
    • flags:修复算法,可以选择cv2.INPAINT_NS(Navier-Stokes算法)或cv2.INPAINT_TELEA(Telea算法)。

实际应用

        图像修复在实际中有广泛的应用场景,包括去除图像中的水印、修复老照片中的破损部分、去除图像中的不需要对象等。

去除图像中的水印示例
# 读取图像和创建掩码 image = cv2.imread('path_to_image_with_watermark.jpg') mask = cv2.imread('path_to_watermark_mask.jpg', cv2.IMREAD_GRAYSCALE)  # 使用Telea算法进行图像修复 restored_image = cv2.inpaint(image, mask, 3, cv2.INPAINT_TELEA)  # 显示原图像、掩码和修复后的图像 cv2.imshow('Original Image', image) cv2.imshow('Mask', mask) cv2.imshow('Restored Image', restored_image) cv2.waitKey(0) cv2.destroyAllWindows() 

        通过这些示例,可以看到如何使用OpenCV中的inpaint函数来进行图像修复。根据具体的应用需求,可以选择合适的修复算法来实现图像的恢复和处理。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!