目录
二二、图像积分
计算图像的积分图像 (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,所以在显示时会有信息损失。实际应用时,不需要进行这种转换。
应用场景
积分图像在许多图像处理任务中非常有用,特别是在需要快速计算图像块和的场景。以下是一些常见的应用场景:
- 快速图像块和计算:在任意大小的矩形区域内快速计算像素值的总和。
- 特征提取:如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
函数来进行图像修复。根据具体的应用需求,可以选择合适的修复算法来实现图像的恢复和处理。