杭州滨江的网站建设公司,韩国比分预测,深圳效果好的免费网站建设,网站建设 人天价格OpenCV 图像分割教程
OpenCV 是一个非常强大的计算机视觉库#xff0c;支持各种图像处理任务。图像分割是 OpenCV 支持的一个重要功能#xff0c;它用于将图像划分为不同的区域#xff0c;识别感兴趣的部分。我们将通过介绍 OpenCV 中的图像分割方法#xff0c;包括基础功…OpenCV 图像分割教程
OpenCV 是一个非常强大的计算机视觉库支持各种图像处理任务。图像分割是 OpenCV 支持的一个重要功能它用于将图像划分为不同的区域识别感兴趣的部分。我们将通过介绍 OpenCV 中的图像分割方法包括基础功能、进阶功能和高级功能来帮助你理解和掌握图像分割的应用。
官方文档链接
OpenCV 官方文档 一、OpenCV 库概述
1.1 什么是 OpenCV
OpenCVOpen Source Computer Vision Library是一个开源的计算机视觉和机器学习软件库。它为实时图像处理任务提供了数百种高效的工具和算法并广泛应用于领域如图像处理、视频分析、机器学习、增强现实等。
1.2 OpenCV 的架构
核心模块提供基本的数据结构和工具。图像处理模块支持各种图像变换和滤波操作。对象检测模块支持基于深度学习的检测算法。视频分析模块支持运动检测、跟踪和背景分割。机器学习模块提供各种经典的机器学习算法。 二、基础功能阈值分割
阈值分割是最简单的一种图像分割方法它通过将图像的像素值与某个阈值进行比较来区分前景和背景。该方法适用于图像的亮度差异明显的情况。
2.1 基础 API 介绍
cv2.threshold() 是 OpenCV 提供的主要阈值分割函数。其语法为
retval, dst cv2.threshold(src, thresh, maxval, type)src输入图像灰度图。thresh阈值。maxval当像素值大于阈值时分配给它的值。type阈值类型如二值化、反二值化等。
2.2 代码示例
import cv2
import numpy as np# 读取灰度图像
image cv2.imread(example.jpg, 0)# 应用全局阈值
ret, thresh1 cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 显示原图和阈值分割后的图像
cv2.imshow(Original Image, image)
cv2.imshow(Thresholded Image, thresh1)cv2.waitKey(0)
cv2.destroyAllWindows()解释
该代码将图像读取为灰度图然后应用全局阈值分割所有像素值大于127的部分被设置为255白色小于127的部分被设置为0黑色。 三、进阶功能自适应阈值与 Otsu 分割
对于具有复杂光照条件的图像全局阈值方法可能效果不好。自适应阈值和 Otsu 方法可以帮助处理更复杂的场景。
3.1 自适应阈值
自适应阈值根据图像的局部区域计算阈值更适用于光照不均匀的图像。
cv2.adaptiveThreshold() 的语法为
dst cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)adaptiveMethod使用的自适应阈值算法常用 cv2.ADAPTIVE_THRESH_MEAN_C 或 cv2.ADAPTIVE_THRESH_GAUSSIAN_C。blockSize计算局部阈值的邻域大小。C从平均值或加权平均值中减去的常数。
3.2 Otsu 分割
Otsu 方法可以自动计算最优阈值用于二值化。
ret2, th2 cv2.threshold(image, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)3.3 代码示例
import cv2# 读取灰度图像
image cv2.imread(example.jpg, 0)# Otsu 阈值分割
ret2, th2 cv2.threshold(image, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)# 自适应阈值分割
th3 cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# 显示分割结果
cv2.imshow(Otsu Threshold, th2)
cv2.imshow(Adaptive Threshold, th3)cv2.waitKey(0)
cv2.destroyAllWindows()解释
使用 Otsu 方法自动计算最佳阈值二值化图像。自适应阈值则根据局部区域计算阈值适合处理光照不均的图像。 四、高级功能分水岭算法
分水岭算法是一种更复杂的图像分割方法通常用于分割重叠物体。
4.1 分水岭算法的工作原理
分水岭算法将图像视为一个地形图图像的亮度值表示高程算法将找到各个低谷区域的边界进行分割。
4.2 使用分水岭算法的步骤
预处理图像如应用高斯模糊。使用阈值或其他方法生成二值图像。通过距离变换生成标记图像。应用分水岭算法进行分割。
4.3 代码示例
import cv2
import numpy as np# 读取图像
image cv2.imread(example.jpg)
gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 阈值化处理
ret, thresh cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU)# 去除噪声
kernel np.ones((3,3), np.uint8)
opening cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations2)# 确定背景
sure_bg cv2.dilate(opening, kernel, iterations3)# 确定前景
dist_transform cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)# 标记未确定区域
sure_fg np.uint8(sure_fg)
unknown cv2.subtract(sure_bg, sure_fg)# 标记
ret, markers cv2.connectedComponents(sure_fg)# 加 1 确保背景是 1 而不是 0
markers markers 1# 标记未知区域为 0
markers[unknown 255] 0# 应用分水岭算法
markers cv2.watershed(image, markers)
image[markers -1] [255, 0, 0]# 显示结果
cv2.imshow(Watershed Result, image)
cv2.waitKey(0)
cv2.destroyAllWindows()解释
通过形态学操作去除噪声确定前景和背景。使用距离变换识别前景区域。分水岭算法处理图像最终得到边界。 总结
我们介绍了 OpenCV 中的几种图像分割方法从最基础的阈值分割到进阶的自适应阈值和 Otsu 方法再到高级的分水岭算法。根据不同的应用场景选择合适的分割方法是关键。