【图像分割算法】

图像分割算法

一、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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stsdddd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值