食管内镜图像预处理-生成掩膜图像
消化内镜图像分析需要首先获取 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)