微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何填充不连续的线

如何解决如何填充不连续的线

我目前正在将静脉查找器设备作为个人项目进行开发。我已经能够使用中值滤波器,高斯滤波器,otsu的二值化处理直到这一点(attached image)的静脉图像......我想知道是否有任何方法可以填充线条的间隙,以便静脉更加明显。我正在使用 OpenCV 和 scipy。

我认为扩张/侵蚀方法不是最好的,因为静脉必须具有完全相同的宽度。该设备旨在找到人眼不可见的静脉,如果护士向右侧或左侧注射一点,他们不会将其注射到静脉中。我已经使用我正在使用的代码和结果 (step by step) 更新了帖子。我试图尽可能地代表血管化。我已经绘制了图像,因此您可以了解我在寻找什么painted image

#LOAD IMAGE
img = cv2.imread('images/cropped.jpg')

#APPLY CLAHE
lab_img = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
l,a,b = cv2.split(lab_img)
clahe1 = cv2.createCLAHE(clipLimit=25.0,tileGridSize=(8,8))
clahe1_img = clahe1.apply(l)
updated_lab_img21 = cv2.merge((clahe1_img,b))
lab_img = cv2.cvtColor(updated_lab_img21,cv2.COLOR_LAB2BGR)
lab_img = cv2.cvtColor(updated_lab_img21,cv2.COLOR_BGR2GRAY)

#MEDIAN FILTER
median = cv2.medianBlur(lab_img,3)
#GAUSSIAN FILTER
gblur = cv2.GaussianBlur(median,(3,3),0.5)

#WEINER FILTER (DEBLURRING)
filtered_img = wiener(gblur,(1,1))

#OTSU BINARIZATION
filtered_img=filtered_img.astype("uint8")
ret2,otsu = cv2.threshold(filtered_img,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

#MEDIAN FILTER SECOND TIME
median2 = cv2.medianBlur(otsu,5)

titles = ['Original','CLAHE','Gaussian','Median','Wiener','OTSU','Final image']
images = [img,lab_img,gblur,median,filtered_img,otsu,median2]

for i in range(7):
    plt.subplot(2,4,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

解决方法

我无法解决您的具体问题,但我可以提出一种在不影响通道边缘的情况下摆脱小规格的方法。

如果您使用 findContours 并屏蔽掉小部分,它将清理图像中的孤立区域。

去斑前

enter image description here

去除黑斑后

enter image description here

去除白斑后

enter image description here

import cv2

# cut out small contours
def despeckle(mask,cutoff):
    # find contours
    _,contours,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE);

    # cut out small stuff
    cleaned = mask.copy();
    small_contours = [];
    for contour in contours:
        area = cv2.contourArea(contour);
        if area < cutoff:
            small_contours.append(contour);
    cv2.drawContours(cleaned,small_contours,-1,(0),-1);
    return cleaned;

# load image
img = cv2.imread("orig.png");
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY);

# improve contrast
clahe = cv2.createCLAHE(clipLimit=25.0,tileGridSize=(8,8));
contrast = clahe.apply(gray);

# threshold
thresh = cv2.adaptiveThreshold(contrast,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,101,2);

# median
mask = cv2.medianBlur(thresh,3);
inverted = cv2.bitwise_not(mask);

# despeckle black
mask = cv2.bitwise_not(despeckle(inverted,500));

# despeckle white
mask = despeckle(mask,500);

# show
cv2.imshow("image",img);
cv2.imshow("mask",mask);
cv2.waitKey(0);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。