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

目录

二二、图像积分

计算图像的积分图像 (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函数来进行图像修复。根据具体的应用需求,可以选择合适的修复算法来实现图像的恢复和处理。

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值