离线
|
食管内镜图像预处理-生成掩膜图像
消化内镜图像分析需要首先获取 ROI 感兴趣区,这样在后续的处理中能有效避免 ROI 区域外的像素的影响,降低运算的复杂度。
前言
选取食管内镜图像最能反映光照情况的红色通道灰度图进行处理,包括两步:
1、阈值二值化处理和形态学运算。
2、最大区域的空洞填充,小连通区域去除。
通过利用食管内镜图像的红色通道做了mask 掩膜图,得到满意的结果。
处理代码如下:
- # 提取食管内镜图像的掩膜
- import cv2
- import numpy as np
- # 红色通道二值化
- def get_mask(img_red, T):
- # 以像素值20为阈值二值化图像
- ret, img_threshold = cv2.threshold(img_red, T, 255, cv2.THRESH_BINARY)
- # 创建半径为3的圆形结构元素做kernel
- kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))
- # 对ROI区进行开运算,去除图像中的文字区域
- img_erode = cv2.erode(img_threshold, kernel, iterations=1)
- img = cv2.dilate(img_erode, kernel, iterations=1)
- return img
- path = r'D:\research\data\WLI\568.jpg'
- img_ori = cv2.imread(path)
- # 分离通道
- b, g, r = cv2.split(img_ori)
- # 获得红色通道的掩膜图
- img_red_mask = get_mask(r, 20)
- # 找出二值化图的边界
- _, contours, hierarchy = cv2.findContours(img_red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- # 找到最大区域并填充
- area = []
- for i in range(len(contours)):
- area.append(cv2.contourArea(contours[i]))
- if area[i] < 1e5:
- # 去除小区域
- cv2.drawContours(img_red_mask, [contours[i]], 0, 0, -1)
- max_idx = np.argmax(area)
- cv2.fillConvexPoly(img_red_mask, contours[max_idx], 255)
- # 显示掩膜图像
- cv2.imshow('redm', img_red_mask)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- # 保存掩膜图
- cv2.imwrite('./mask/1_mask.png', img_red_mask)
复制代码 2.读入数据
结果1:
原始图像:
处理后:
结果2:
原始图像:
处理后:
总结
显示结果2,主要是因为图像下缘有非目标区域的条状,所以程序中的以下语句就是为了解决此类图像。
- if area[i] < 1e5:
- # 去除小区域
- cv2.drawContours(img_red_mask, [contours[i]], 0, 0, -1)
复制代码 来源:https://blog.csdn.net/ZhuiMengLQG/article/details/109486352
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|