目录
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,所以在显示时会有信息损失。实际应用时,不需要进行这种转换。
应用场景
积分图像在许多图像处理任务中非常有用,特别是在需要快速计算图像块和的场景。以下是一些常见的应用场景:
- 快速图像块和计算:在任意大小的矩形区域内快速计算像素值的总和。
- 特征提取:如Haar特征提取。
- 图像滤波:如快速均值滤波。
快速计算图像块和的示例
假设我们需要计算图像中一个矩形区域的和,使用积分图像可以大大加速这一过程。
# 定义矩形区域的左上角和右下角坐标 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
函数来进行图像修复。根据具体的应用需求,可以选择合适的修复算法来实现图像的恢复和处理。