图像分割算法
一、opencv 图像分割
在OpenCV中,图像分割有多种方法,下面列举几种常见的并给出代码示例、原理说明及使用场景:
1. 阈值分割(Global Thresholding)
原理:基于像素强度设置一个阈值,将图像的每个像素点根据其灰度值与阈值比较,将其划分为前景或背景。适用于具有明显二值特征的图像。
import cv2
# 加载灰度图像
img_gray = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
# 设定阈值
threshold_value = 127
# 使用全局阈值进行分割
_, binary_img = cv2.threshold(img_gray, threshold_value, 255, cv2.THRESH_BINARY)
# 显示结果
cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用场景:文档扫描识别、简单的物体边缘提取等。
2. Otsu’s Binarization
原理:自动选择最佳阈值以最大化前景和背景之间的类间方差。适用于光照不均匀但对象与背景对比明显的图像。
# 使用Otsu's方法自动计算阈值
_, binary_img = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 显示结果
cv2.imshow('Otsu Thresholded Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用场景:细胞学分析、医学影像处理等需要自适应阈值的情况。
3. 颜色空间分割
原理:通过颜色模型(如HSV、Lab等)对特定颜色范围内的区域进行分割。
# 加载彩色图像并转换到HSV色彩空间
img_color = cv2.imread('input.jpg')
hsv = cv2.cvtColor(img_color, cv2.COLOR_BGR2HSV)
# 定义感兴趣的颜色范围
lower_red = (0, 50, 50)
upper_red = (10, 255, 255)
# 应用inRange函数进行分割
mask = cv2.inRange(hsv, lower_red, upper_red)
# 进行位运算得到目标区域
red_only = cv2.bitwise_and(img_color, img_color, mask=mask)
# 显示结果
cv2.imshow('Red Pixels', red_only)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用场景:从复杂背景下分离特定颜色的物体,如交通标志检测、水果采摘机器人视觉系统等。
4. 分水岭算法(Watershed Algorithm)
原理:模拟地形分水岭过程,将图像视为地形,最低点标记为已知类别,然后通过扩展边界来达到分割不同区域的目的。适用于重叠且连通性复杂的物体分割。
# 预处理:加载图像、转为灰度图、高斯滤波、边缘保持二值化等
gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (3, 3), 0)
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV