首页 数字经济

OpenCV 图像处理技巧:高效边界填充与精准阈值分割

分类:数字经济
字数: (6118)
阅读: (2990)
内容摘要:OpenCV 图像处理技巧:高效边界填充与精准阈值分割,

在图像处理过程中,经常会遇到需要对图像进行边界填充和阈值分割的情况。例如,在进行图像金字塔操作时,我们需要对图像进行边界填充,防止图像边缘信息丢失;又如,在进行目标检测时,我们需要对图像进行阈值分割,将目标从背景中分离出来。本文将深入探讨 OpenCV 中边界填充和阈值分割的原理、方法和应用,并提供实战代码示例,帮助你解决实际问题。

边界填充:解决图像边缘的困扰

图像的边界填充是指在图像的边缘添加额外的像素,以扩展图像的尺寸。这在很多图像处理算法中都是必要的,比如卷积操作、图像金字塔等。如果不进行边界填充,边缘像素的计算结果可能会不准确,导致图像出现伪影。

OpenCV 中的边界填充方法

OpenCV 提供了多种边界填充方法,可以通过 cv2.copyMakeBorder() 函数实现。

OpenCV 图像处理技巧:高效边界填充与精准阈值分割
import cv2
import numpy as np

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

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

# 使用不同的边界填充类型
replicate = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REPLICATE) # 复制边缘像素
reflect = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REFLECT)   # 反射边缘像素
reflect101 = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REFLECT_101) # 反射边缘像素,不包含边缘像素
wrap = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_WRAP)     # 循环填充
constant = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[255, 0, 0]) # 使用常量填充

# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Replicate', replicate)
cv2.imshow('Reflect', reflect)
cv2.imshow('Reflect101', reflect101)
cv2.imshow('Wrap', wrap)
cv2.imshow('Constant', constant)

cv2.waitKey(0)
cv2.destroyAllWindows()

参数解释:

  • src:输入图像。
  • top, bottom, left, right:上下左右边界的填充宽度。
  • borderType:边界填充类型,包括 cv2.BORDER_REPLICATEcv2.BORDER_REFLECTcv2.BORDER_REFLECT_101cv2.BORDER_WRAPcv2.BORDER_CONSTANT 等。
  • value:当 borderTypecv2.BORDER_CONSTANT 时,指定填充的颜色值。

边界填充类型的选择

不同的边界填充类型适用于不同的场景。

OpenCV 图像处理技巧:高效边界填充与精准阈值分割
  • cv2.BORDER_REPLICATE:复制边缘像素,适用于图像边缘信息比较重要的场景。
  • cv2.BORDER_REFLECT:反射边缘像素,适用于图像边缘具有对称性的场景。
  • cv2.BORDER_REFLECT_101:反射边缘像素,但不包含边缘像素,可以减少伪影。
  • cv2.BORDER_WRAP:循环填充,适用于图像具有周期性的场景。
  • cv2.BORDER_CONSTANT:使用常量填充,适用于需要指定填充颜色的场景。

阈值分割:提取目标的关键一步

阈值分割是一种简单而有效的图像分割方法,它根据像素的灰度值将图像分割成不同的区域。在 OpenCV 中,可以使用 cv2.threshold() 函数实现阈值分割。

OpenCV 中的阈值分割方法

import cv2
import numpy as np

# 读取图像
img = cv2.imread('test.jpg', 0) # 以灰度图读取

# 简单阈值
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

# 自适应阈值
th6 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th7 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

# Otsu's 二值化
ret, th8 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示结果
cv2.imshow('Original', img)
cv2.imshow('THRESH_BINARY', thresh1)
cv2.imshow('THRESH_BINARY_INV', thresh2)
cv2.imshow('THRESH_TRUNC', thresh3)
cv2.imshow('THRESH_TOZERO', thresh4)
cv2.imshow('THRESH_TOZERO_INV', thresh5)
cv2.imshow('ADAPTIVE_THRESH_MEAN_C', th6)
cv2.imshow('ADAPTIVE_THRESH_GAUSSIAN_C', th7)
cv2.imshow('Otsu', th8)

cv2.waitKey(0)
cv2.destroyAllWindows()

参数解释:

OpenCV 图像处理技巧:高效边界填充与精准阈值分割
  • src:输入图像(灰度图)。
  • thresh:阈值。
  • maxval:最大值,当像素值大于(或小于)阈值时,设置的像素值。
  • type:阈值分割类型,包括 cv2.THRESH_BINARYcv2.THRESH_BINARY_INVcv2.THRESH_TRUNCcv2.THRESH_TOZEROcv2.THRESH_TOZERO_INV 等。

阈值分割类型的选择

  • cv2.THRESH_BINARY:如果像素值大于阈值,则设置为最大值,否则设置为 0。
  • cv2.THRESH_BINARY_INV:如果像素值大于阈值,则设置为 0,否则设置为最大值。
  • cv2.THRESH_TRUNC:如果像素值大于阈值,则设置为阈值,否则保持不变。
  • cv2.THRESH_TOZERO:如果像素值大于阈值,则保持不变,否则设置为 0。
  • cv2.THRESH_TOZERO_INV:如果像素值大于阈值,则设置为 0,否则保持不变。

除了基本的阈值分割方法,OpenCV 还提供了自适应阈值分割(cv2.adaptiveThreshold())和 Otsu's 二值化(cv2.THRESH_OTSU)。自适应阈值分割可以根据图像的局部区域动态调整阈值,适用于光照不均匀的场景。Otsu's 二值化可以自动计算最佳阈值,适用于目标和背景对比度明显的场景。

在实际应用中,可以根据图像的特点选择合适的阈值分割方法。例如,对于光照均匀的图像,可以使用简单的阈值分割方法;对于光照不均匀的图像,可以使用自适应阈值分割方法;对于目标和背景对比度明显的图像,可以使用 Otsu's 二值化。

OpenCV 图像处理技巧:高效边界填充与精准阈值分割

掌握 OpenCV 的边界填充和阈值分割技术,可以为后续的图像处理和分析打下坚实的基础。例如,可以将阈值分割后的图像用于轮廓检测、目标跟踪等应用。此外,在使用 Nginx 部署图像处理服务时,合理的配置反向代理和负载均衡,可以有效地提高服务的并发连接数和稳定性。常见的配置工具如宝塔面板,可以简化 Nginx 的配置过程,但需要注意安全配置,防止出现漏洞。

OpenCV 图像处理技巧:高效边界填充与精准阈值分割

转载请注明出处: 程序员脱发日记

本文的链接地址: http://m.acea2.store/article/20542.html

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

()
您可能对以下文章感兴趣
评论
  • 柠檬精 3 天前
    讲的真不错,边界填充那块正是我需要的,感谢!
  • 重庆小面 4 天前
    好详细的教程,收藏了慢慢学习!
  • 红豆沙 5 天前
    阈值分割那里,Otsu 算法确实很实用,之前一直手动调阈值,太麻烦了。