Python OpenCV中的侵蚀和膨胀返回白色

时间:2016-09-25 19:41:33

标签: python opencv image-processing

我正在尝试使用透析和ertion

例如,像这样:

dialated = cv2.dilate(edgesCopy, cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3)), iterations = 1)

输入是一个uint8图像,其值仅为0和255,如

所示
threshold, thresholdedEdges = cv2.threshold(edges, 220, 255, cv2.THRESH_BINARY_INV);

输出只是一个白色图像。我不明白这个原因。

整个代码是

   imageSize = img.shape
    if len(imageSize) != 2:#color
        print "got a color image - quitting"
        return

    cv2.imshow("im1", img)
    cv2.moveWindow("im1", 60, 50)

    gaussianBlur = cv2.GaussianBlur(img, (5, 5), 0)
    # cv2.imshow("gaussianBlur", gaussianBlur)
    # cv2.moveWindow("gaussianBlur", 260, 50)

    medianBlur = cv2.medianBlur(gaussianBlur, 5)
    # cv2.imshow("medianBlur", medianBlur)
    # cv2.moveWindow("medianBlur", 460, 50)

    minGradientValueThreshold = 225
    maxGradientValueThreshold = 150
    edges = cv2.Canny(medianBlur, minGradientValueThreshold, maxGradientValueThreshold)
    cv2.imshow("edges", edges)
    cv2.moveWindow("edges", 660, 50)

    # Threshold.
    # Set values equal to or above 220 to 0.
    # Set values below 220 to 255.

    threshold, thresholdedEdges = cv2.threshold(edges, 220, 1, cv2.THRESH_BINARY_INV);

    edgesCopy = thresholdedEdges.copy()

    #close the edges before floodfilling, to avoid filing the background
    # closing = cv2.morphologyEx(floodFilledImage, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)))  DOESN'T WORK
    dialated = cv2.dilate(edgesCopy, cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3)), iterations = 1)

    cv2.imshow("dialated", dialated)
    cv2.moveWindow("dialated", 60, 250)

    eroded = cv2.erode(dialated, cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3)), iterations = 1)

    closing = eroded

    cv2.imshow("closing", closing)
    cv2.moveWindow("closing", 60, 250)

1 个答案:

答案 0 :(得分:2)

canny边缘检测的结果是具有厚度为1的二进制边缘的图像。您正在使用阈值设置cv2.THRESH_BINARY_INV对此边缘(这不是必需的)进行阈值处理,这意味着阈值结果得到值1,其中像素低于阈值,0高于0。这种阈值处理的结果自然是几乎带有黑线的白色图像 - >你实际上只是反转了canny边缘检测器的结果。将这样的图像放大最终会产生完全白色的图像(无论输入图像实际是什么)。

我建议你跳过阈值步骤!

如果您想要进行阈值处理,请使用THRESH_BINARY并将maxval设置为255.我还认为每个cv2.waitKey()之后应该有cv2.imshow()函数调用(至少在我的情况下它不会显示任何其他内容。)