食管内镜图像预处理-生成掩膜图像mask

食管内镜图像预处理-生成掩膜图像

消化内镜图像分析需要首先获取 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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值