欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > 计算机视觉-轮廓分割实验报告

计算机视觉-轮廓分割实验报告

2025/3/18 20:00:27 来源:https://blog.csdn.net/qq_55882840/article/details/143435172  浏览:    关键词:计算机视觉-轮廓分割实验报告

实验五  轮廓分割实验

一、实验目的

  1. 了解图像处理中的轮廓分割和主动轮廓分割的基本原理与方法。
  2. 学会使用轮廓检测和主动轮廓模型(蛇)进行图像轮廓的提取与分割。
  3. 掌握Python及相关图像处理库的使用方法。

二、实验内容和要求

1.实验内容:

轮廓分割:

  • 导入并预处理实验图像(灰度化、平滑等)。
  • 使用边缘检测算法(如Canny)进行边缘检测。
  • 提取图像中的轮廓。

主动轮廓分割:

  • 初始化主动轮廓模型(蛇)的起始轮廓。
  • 使用主动轮廓模型优化轮廓位置以获得目标对象的准确轮廓。
  • 比较主动轮廓方法与单纯边缘检测方法的效果。

2.基本要求:

  • 正确安装并配置Python环境及相关库(如OpenCV、scikit-image、matplotlib等)。
  • 样本图片需保证清晰度和分辨率适中。
  • 编写代码并运行,成功实现图像的轮廓分割和主动轮廓分割。
  • 对比实验结果,编写实验报告,并分析结果。

三、实验设备

        实验设备主要有:计算机、OpenCV库

四、实验原理

        分水岭算法是由S.Beucher  F.Meyer最早引入图像分割领域,它的基本思想是来源于测地学上的侧线重构,其内容是把图像看做是测地学上的拓扑地貌。进行分水岭模型计算的比较经典的算法是L  Vincent提出的,在该算法中首先是对每个像素的灰度级进行从低到高排序,然后用等级对垒模拟淹没,初始时,等级队列中为淹没的初始点,在从低到高实现淹没的过程中,对每一个局部极小值在H阶高度的影响域采用先进先出(FIFO)结构进行判断及标注,直到最后一个值被淹没,从而正确划分各个区域。

整个洪水淹没的循环迭代过程可以通过以下两个步骤表示:

分水岭算法的优点:

  1. 分水岭算法对于图像中由于像素差别较小而产生微弱边缘具有良好的响应,可以得到封闭连续的边缘,而且可以保证在照明,阴影等影响下分割边缘的封闭性和连续性
  2. 分水岭算法对于目标物体之间或者是目标物体同背景物体之间粘连的情况有较好的处理效果。能够较好的分割这类目标物体。
  3. 图像内部的阴暗变化对于分水岭算法影响较小,可以在一定程度上减小由于阴暗带来的图像分割影响

五、实验步骤

1.轮廓分割

#1.轮廓分割
#导入必要的库
import cv2
import numpy as np
# 读取图像文件
src_img = cv2.imread("C:\\Users\\aslon\\Desktop\\louna.jpg")
# 检查图像是否成功加载
if src_img is None:print("Failed to load image")
else:# 显示原始图像cv2.imshow("原图", src_img)# 转换为灰度图像gray_img = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)# 应用阈值处理,将灰度图像转换为二值图像_, threshold_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)cv2.imshow("1", threshold_img)# 创建形态学操作的内核kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))# 腐蚀操作eroded_img = cv2.erode(threshold_img, kernel, iterations=1)# 膨胀操作dilated_img = cv2.dilate(eroded_img, kernel, iterations=2)cv2.imshow("膨胀", dilated_img)# 边缘检测canny_img = cv2.Canny(dilated_img, 150, 255)# 寻找轮廓contours, _ = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 创建与原始图像相同大小的空白图像dst_img = np.zeros_like(src_img)# 生成随机颜色rng = np.random.default_rng(12345)# 绘制轮廓for i in range(len(contours)):color = tuple(rng.integers(0, 256, size=3).tolist())cv2.drawContours(dst_img, contours, i, color, 1)# 显示包含轮廓的图像cv2.imshow("轮廓图", dst_img)# 等待按键按下并关闭所有窗口cv2.waitKey(0)cv2.destroyAllWindows()

实验原图:

代码执行结果:

 

六、实验总结

1、对比不同方法(如 Sobel、Canny、阈值分割)的轮廓分割效果。

        观察哪种方法能够更准确地提取目标物体的轮廓,例如,Canny 算子通常在边缘检测的准确性和完整性上表现较好,但可能会受到阈值选择的影响;Sobel 算子相对简单,但边缘可能较粗且不连续;阈值分割在目标与背景灰度差异明显的情况下效果较好,否则可能会出现分割错误。

2、观察轮廓提取的准确性和完整性。

        检查提取的轮廓是否完整地包含了目标物体的边界,是否存在轮廓断裂、多余轮廓或误提取的情况。如果存在问题,可以考虑调整边缘检测的参数(如 Canny 算子的阈值)、阈值分割的阈值或者尝试其他的预处理方法(如滤波去除噪声)来改善分割效果。

3、评估分割对后续应用的适用性。

        思考分割后的轮廓是否满足后续处理(如目标识别、形状分析等)的要求。例如,如果需要对目标物体的形状进行精确测量,那么轮廓的准确性和分辨率就非常重要;如果是用于目标分类,那么轮廓能够突出目标的特征形状即可。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词