首页 文章

在opencv中填充轮廓

提问于
浏览
0

我'm trying to identify contours using a Canny filter in openCV and fill the contours, in order to create a mask. I'得到了这种起始形象:
preprocessed image

我正在尝试识别图像中的所有特征,绘制轮廓并填充它们 . 我正在尝试使用openCV中的代码实现它:

img = cv2.imread(os.path.join(fName,f), 0)  
img = cv2.GaussianBlur(img,(5,5),0)
cv2.bilateralFilter(img, 9, 150,450)
edge = np.zeros((img.shape[0] + 2, img.shape[1] + 2), np.uint8)
edge = cv2.Canny(img, 500, 300, apertureSize=5)
cont, heir = cv2.findContours(edge.copy(), cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in cont]
cv2.morphologyEx(img, cv2.MORPH_CLOSE, np.ones((5,5), dtype='uint8'))
cv2.drawContours(img, contours, -1, 255, -1)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis

大多数情况下,我很难!) . 不幸的是,我不是用整洁的轮廓填充白色,而是得到更像这样的东西:
image with edges detected

有什么想法吗?显然,我需要更好地关闭边缘,并调整我的一些Canny参数,但我真的可以使用一些指导 .

谢谢!

编辑:阈值处理并没有很好地创建我想要的那种面具,或者:
Binary Thresholding
我认为我的'bright'点不喜欢能够在黑色背景上有白点 .

码:

img = cv2.imread(os.path.join(fName,f), 0)
    cv2.bilateralFilter(img, 9, 90,16)
    #img = cv2.GaussianBlur(img,(5,5),0)
    #binImg = np.zeros((img.shape[0], img.shape[1]), np.uint8)   
    binImg = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,           cv2.THRESH_BINARY, 25, 2)
    #binImg = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    #newimg = np.multiply(img, np.divide(edge, 255.0))    
    plt.imshow(binImg, cmap = 'gray', interpolation = 'bicubic')
    plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
    #plt.show()

3 回答

  • 1

    你是什么意思“识别轮廓”和“识别所有功能”?如果你只需要明亮的图像部分的掩模,你不需要找到轮廓,然后填写它们显示的这种图像,只需使用任何类型的阈值,你将有所需的二进制掩码 .

  • 1

    如果你想让它或多或少参数独立,我会建议以下管道: -

    • 做一个超像素分段 . 我建议:https://github.com/PSMM/SLIC-Superpixels

    • 对于每个超像素,计算平均亮度/强度 .

    • 阈值(自动或某种巧妙的方式)来获得明亮的超像素 .

    • 相应地创建遮罩

  • 2

    对于它的 Value ,二元面具是更好的方法 . 谢谢你的建议 . 它只是意味着玩一些参数 . 对于这些功能,我发现以下代码:

    img = cv2.imread(os.path.join(fName,f), 0)
    cv2.bilateralFilter(img, 9, 90,16)
    img = cv2.GaussianBlur(img,(5,5),0)
    #binImg = np.zeros((img.shape[0], img.shape[1]), np.uint8)   
    binImg = cv2.adaptiveThreshold(img, 1, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 55, -3)
    #cv2.bilateralFilter(binImg, 9, 90,16)
    #binImg = cv2.GaussianBlur(binImg, (3,3), 0)
    #ret, binImg = cv2.threshold(img, 35000, 1, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    plt.imshow(binImg, cmap = 'gray', interpolation = 'bicubic')
    plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
    

    产生我正在寻找的那种面具:
    Successful

    所以,我要结束这个问题了 .

相关问题