一、实验目的
用OpenCV编写一个基于分水岭算法的图像分割程序能对肺部医学图像进行分割,辅助医生进行病情诊断,强化和巩固学生对图像分割知识的掌握和灵活应用。
二、实验要求
1、用OpenCV编写一个基于分水岭算法的图像分割程序,能对获取的肺部医学图像进行分割;
2、认真撰写实验报告,要求说明实验原理,对实验过程叙述清楚,关键代码给出注释,对实验结果给出合理解释,实验分析部分则需要指出实验结果优劣的原因以及如何进一步提高实验性能的方法或手段。
3、利用python版的OpenCV编写代码。
三、实验过程
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('CV-Pictures/qizi.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换为灰度图
ret,imgthresh = cv2.threshold(gray,0,255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) #Otsu阈值处理,转化为二值图
kernel = np.ones((3,3),np.uint8) #定义形态变换卷积核
imgopen = cv2.morphologyEx(imgthresh,cv2.MORPH_OPEN,
kernel,iterations=2) #形态变换:开运算
imgbg = cv2.dilate(imgopen,kernel,iterations=3) #膨胀操作,确定背景
imgdist = cv2.distanceTransform(imgopen,cv2.DIST_L2,0) #距离转换,用去确定前景
ret,imgfg = cv2.threshold(imgdist,
0.7*imgdist.max(),255,2) #对距离转换结果进行阈值处理
imgfg = np.uint8(imgfg) #转换为整数,获得前景
ret,markers = cv2.connectedComponents(imgfg) #标记阈值处理结果
unknown = cv2.subtract(imgbg,imgfg) #确定位置未知区域
markers = markers + 1 #加1使背景不为0
markers[unknown == 255] = 0 #将未知区域设置为0
imgwater = cv2.watershed(img,markers) #执行分水岭算法分割图像
plt.imshow(imgwater) #以灰度图像格式显示匹配结果
plt.title('watershed')
plt.axis('off')
plt.show()
img[imgwater == -1] = [0,255,0] #将原图中被标记点设置为绿色
cv2.imshow('watershed',img) #显示分割结果
cv2.waitKey(0)
四、实验结果
实验结果如下图所示:
五、实验分析
1.本实验采用分水岭算法。分水岭(Watershed)是基于地理形态的分析的图像分割算法,模仿地理结构(比如山川、沟壑,盆地)来实现对不同物体的分类。
2.在图像处理中,我们首先读取图片,将图片转化为灰度图,再根据OSTU阈值二值化图像。通过定义卷积核,以及图像的开运算去除图像的边缘干扰,一方面通过膨胀运算识别出背景,另一方面通过距离转换及阈值处理再转化为整数获得前景。标记前景阈值处理结果,根据前景背景确定未知区域,对背景和未知区域区分,执行分水岭算法分割图像。分别显示匹配结果和被标记点的图。
六、代码文件
小程序员将代码文件和相关素材整理到了百度网盘里,因为文件大小基本不大,大家也不用担心限速问题。后期小程序员有能力的话,将在gitee或者github上上传相关素材。