Python OpenCV中的腐蚀和膨胀返回白色
我正在试着使用拨号和拨号 例如,像这样:Python OpenCV中的腐蚀和膨胀返回白色,python,opencv,image-processing,Python,Opencv,Image Processing,我正在试着使用拨号和拨号 例如,像这样: 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); 然而,输出只是一个白色图像。我
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)
canny边缘检测的结果是具有厚度为1的二值边缘的图像。您正在使用阈值设置
cv2.THRESH\u BINARY\u INV
对这些边缘进行阈值化(顺便说一句,这是不需要的),这意味着阈值结果得到值1,其中像素小于阈值,大于阈值时为0。这种阈值化的结果自然几乎是带黑线的白色图像->实际上,您只是反转canny边缘检测器的结果。放大这样的图像最终会得到完全白色的图像(不管输入图像实际上是什么)
我建议你跳过阈值步骤
如果仍要执行阈值设置,请使用
THRESH_BINARY
并将maxval
设置为255。我还认为在每次cv2.imshow()
函数调用之后都应该有cv2.waitKey()
(至少在我的情况下,它不会显示任何其他内容)。canny边缘检测的结果是具有厚度为1的二值边缘的图像。您正在使用阈值设置cv2.THRESH\u BINARY\u INV
对这些边缘进行阈值化(顺便说一句,这是不需要的),这意味着阈值结果得到值1,其中像素小于阈值,大于阈值时为0。这种阈值化的结果自然几乎是带黑线的白色图像->实际上,您只是反转canny边缘检测器的结果。放大这样的图像最终会得到完全白色的图像(不管输入图像实际上是什么)
我建议你跳过阈值步骤
如果仍要执行阈值设置,请使用
THRESH_BINARY
并将maxval
设置为255。我还认为在每次cv2.imshow()
函数调用之后都应该有cv2.waitKey()
(至少在我的情况下,它没有显示任何其他内容)。我可以问一下,为什么用不同的滤镜模糊图像两次?我可以问一下,为什么用不同的滤镜模糊图像两次?