首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >血管图像处理问题

血管图像处理问题
EN

Stack Overflow用户
提问于 2016-04-19 07:38:21
回答 2查看 1.7K关注 0票数 13

我试图从图像中提取血管,为此,我首先对图像进行均衡化,应用CLAHE直方图获得以下结果:

代码语言:javascript
复制
        clahe = cv2.createCLAHE(clipLimit=100.0, tileGridSize=(100,100))
        self.cl1 = clahe.apply(self.result_array)
        self.cl1 = 255 - self.cl1

然后我用OTSU阈值提取血管,但做得不好:

代码语言:javascript
复制
self.ret, self.thresh = cv2.threshold(self.cl1, 0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        kernel = np.ones((1,1),np.float32)/1
        self.thresh = cv2.erode(self.thresh, kernel, iterations=3)
        self.thresh = cv2.dilate(self.thresh, kernel, iterations=3)

结果如下:

很明显有很多噪音。我试过使用中间模糊,但它只是聚集噪音,并使它成为一个斑点,在一些地方。我该如何去除噪音来获取血管呢?

这是我试图从其中提取血管的原始图像:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-24 09:54:51

获得真正好的结果是一个困难的问题(你可能需要对血管的结构和噪声进行建模),但你仍然可以做得比过滤更好。

在Canny边缘检测器的启发下,解决这类问题的一种方法是使用两个阈值-- [hi,low]和将具有响应r的像素p分类为属于血管V的(r > lo && p的邻居之一在V中)。

同时,在滤波方面,双侧滤波和均值偏移滤波对有噪图像都有很好的效果。

代码语言:javascript
复制
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
kernel5 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
kernel7 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7))
t_lo = 136
t_hi = 224

blured = cv2.pyrMeanShiftFiltering(img, 3, 9)
#blured = cv2.bilateralFilter(img, 9, 32, 72)

clahe = cv2.createCLAHE(clipLimit=128.0, tileGridSize=(64, 64))
cl1 = clahe.apply(blured)
cl1 = 255 - cl1

ret, thresh_hi = cv2.threshold(cl1, t_hi, 255, cv2.THRESH_TOZERO)
ret, thresh_lo = cv2.threshold(cl1, t_lo, 255, cv2.THRESH_TOZERO)

低阈值图像

Hi阈值图像

筹备和清理:

代码语言:javascript
复制
current = np.copy(thresh_hi)
prev = np.copy(current)
prev[:] = 0
current = cv2.morphologyEx(current, cv2.MORPH_OPEN, kernel5)
iter_num = 0
max_iter = 1000

不是最有效的方法.但易于实施:

代码语言:javascript
复制
while np.sum(current - prev) > 0 and iter_num < max_iter:
    iter_num = iter_num+1
    prev = np.copy(current)
    current = cv2.dilate(current, kernel3)
    current[np.where(thresh_lo == 0)] = 0

初始掩模

去除小气泡:

代码语言:javascript
复制
contours, hierarchy = cv2.findContours(current, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
    area = cv2.contourArea(contour)
    if area < 256:
        cv2.drawContours( current, [contour], 0, [0,0,0], -1 )

去除小气泡后

形态清理:

代码语言:javascript
复制
opening = cv2.morphologyEx(current, cv2.MORPH_OPEN, kernel7)   
cl1[np.where(opening == 0)] = 0

结果

这绝不是最优的,但我认为它应该为您提供足够的启动工具。

票数 11
EN

Stack Overflow用户

发布于 2016-04-23 05:34:33

如何:高通(图像减去高斯平滑与西格玛12),然后阈值(126),然后小目标抑制(小于300个像素的对象被删除)?

(我用了你的上一张照片)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36711627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档