首页 短视频

玩转 OpenCV:图像边界填充与阈值分割硬核实战

分类:短视频
字数: (2624)
阅读: (5978)
内容摘要:玩转 OpenCV:图像边界填充与阈值分割硬核实战,

在图像处理项目中,经常会遇到图像尺寸不匹配或者需要对图像进行预处理的情况,这时 OpenCV 的边界填充和阈值分割技术就显得尤为重要。今天,我们就来深入探讨这两个功能,并分享一些我在实际项目中的经验和教训。

边界填充:解决图像尺寸不匹配的难题

边界填充,顾名思义,就是在图像的边缘填充像素,以改变图像的尺寸或创建特定的效果。 OpenCV 提供了多种边界填充模式,例如:

玩转 OpenCV:图像边界填充与阈值分割硬核实战
  • cv2.BORDER_CONSTANT:使用常量值填充。
  • cv2.BORDER_REPLICATE:复制边缘像素进行填充。
  • cv2.BORDER_REFLECT:反射边缘像素进行填充。
  • cv2.BORDER_REFLECT_101:反射边缘像素,但不包括边缘像素本身。
  • cv2.BORDER_WRAP:类似于图像平铺。

代码示例

import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')

# 定义填充大小
top, bottom, left, right = 50, 50, 50, 50

# 使用常量值填充
img_constant = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0]) # 黑色填充

# 使用复制边缘像素填充
img_replicate = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REPLICATE)

# 显示图像
cv2.imshow('Original', img)
cv2.imshow('Constant', img_constant)
cv2.imshow('Replicate', img_replicate)
cv2.waitKey(0)
cv2.destroyAllWindows()

实战避坑

  • 填充值的选择:使用 cv2.BORDER_CONSTANT 时,填充值的选择非常重要,需要根据实际情况进行调整。如果填充值与图像本身的颜色分布差异过大,可能会引入明显的边界,影响后续处理效果。
  • 不同填充模式的适用场景:不同的填充模式适用于不同的场景。例如,cv2.BORDER_REPLICATE 适合于需要保持图像边缘信息的情况下使用,而 cv2.BORDER_REFLECT 则适合于需要创建平滑过渡效果的情况下使用。

阈值分割:提取图像中的目标区域

阈值分割是一种简单但有效的图像分割方法,它根据像素的灰度值将图像分割成不同的区域。 OpenCV 提供了多种阈值分割方法,例如:

玩转 OpenCV:图像边界填充与阈值分割硬核实战
  • cv2.THRESH_BINARY:大于阈值的像素设置为最大值,小于阈值的像素设置为 0。
  • cv2.THRESH_BINARY_INV:与 cv2.THRESH_BINARY 相反。
  • cv2.THRESH_TRUNC:大于阈值的像素设置为阈值,小于阈值的像素保持不变。
  • cv2.THRESH_TOZERO:大于阈值的像素保持不变,小于阈值的像素设置为 0。
  • cv2.THRESH_TOZERO_INV:与 cv2.THRESH_TOZERO 相反。

代码示例

import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 灰度图

# 阈值分割
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 阈值 127

# 显示图像
cv2.imshow('Original', img)
cv2.imshow('Threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

自适应阈值

对于光照不均匀的图像,可以使用自适应阈值分割方法。 OpenCV 提供了两种自适应阈值分割方法:

玩转 OpenCV:图像边界填充与阈值分割硬核实战
  • cv2.ADAPTIVE_THRESH_MEAN_C:阈值为相邻区域的平均值减去一个常数。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值为相邻区域的高斯加权平均值减去一个常数。
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 自适应阈值分割
thresh_mean = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2) # 块大小 11,常数 2
thresh_gaussian = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

# 显示图像
cv2.imshow('Original', img)
cv2.imshow('Adaptive Mean', thresh_mean)
cv2.imshow('Adaptive Gaussian', thresh_gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

实战避坑

  • 阈值的选择:阈值的选择至关重要,需要根据图像的灰度值分布进行调整。可以使用直方图来分析图像的灰度值分布,从而选择合适的阈值。
  • 自适应阈值的参数调整:自适应阈值分割方法的参数(例如块大小和常数)需要根据图像的局部光照情况进行调整。如果块大小过小,可能会引入噪声;如果块大小过大,可能会导致分割不准确。

OpenCV 图像处理实战总结

OpenCV 提供了丰富的图像处理功能,熟练掌握这些功能可以帮助我们解决各种图像处理问题。 在实际项目中,需要根据具体情况选择合适的算法和参数,并不断尝试和调整,才能达到最佳的处理效果。例如,在视频监控系统中,前端摄像头采集的视频流,后端服务器通常采用 Nginx 做反向代理,均衡多个应用服务器的负载,如果服务器CPU资源紧张,还可以使用宝塔面板等工具优化配置,当然,优化算法本身才是王道。希望这篇文章能帮助你更好地理解和使用 OpenCV 的边界填充和阈值分割技术。

玩转 OpenCV:图像边界填充与阈值分割硬核实战

玩转 OpenCV:图像边界填充与阈值分割硬核实战

转载请注明出处: 青衫落拓

本文的链接地址: http://m.acea4.store/blog/436614.SHTML

本文最后 发布于2026-04-03 10:15:01,已经过了24天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 咕咕咕 5 天前
    写得真不错,正好解决了我图片尺寸不对齐的问题,感谢!
  • 山西刀削面 15 小时前
    请问博主,如果在高并发场景下,如何优化 OpenCV 的图像处理性能?
  • 路过的酱油 1 天前
    请问博主,如果在高并发场景下,如何优化 OpenCV 的图像处理性能?