我正在尝试使用透析和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)
答案 0 :(得分:2)
canny边缘检测的结果是具有厚度为1的二进制边缘的图像。您正在使用阈值设置cv2.THRESH_BINARY_INV
对此边缘(这不是必需的)进行阈值处理,这意味着阈值结果得到值1,其中像素低于阈值,0高于0。这种阈值处理的结果自然是几乎带有黑线的白色图像 - >你实际上只是反转了canny边缘检测器的结果。将这样的图像放大最终会产生完全白色的图像(无论输入图像实际是什么)。
我建议你跳过阈值步骤!
如果您想要进行阈值处理,请使用THRESH_BINARY
并将maxval
设置为255.我还认为每个cv2.waitKey()
之后应该有cv2.imshow()
函数调用(至少在我的情况下它不会显示任何其他内容。)