Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检测某些对象的边缘_Python_Opencv_Edge Detection - Fatal编程技术网

Python 如何检测某些对象的边缘

Python 如何检测某些对象的边缘,python,opencv,edge-detection,Python,Opencv,Edge Detection,我最近决定自学计算机视觉,所以我只知道图像处理的基础知识。我决定尝试一个希望很简单的练习:在与此类似的图片中检测瓷砖: 我知道我可以使用Hough变换来查找每个瓷砖中的圆,稍后我将使用它使算法更加健壮,但目前我正在努力查找瓷砖的轮廓 我的第一次尝试是调整图像大小、模糊图像、使其灰度化并应用canny。那么,瓷砖就是那些有四条边和一定长宽比的轮廓。这对大多数图片中的大多数瓷砖都适用,但在这张图片中,由于背景中的白色扬声器(它不认为它有四个面),顶部的瓷砖似乎不起作用: 然后,我发现并决定尝试模

我最近决定自学计算机视觉,所以我只知道图像处理的基础知识。我决定尝试一个希望很简单的练习:在与此类似的图片中检测瓷砖:

我知道我可以使用Hough变换来查找每个瓷砖中的圆,稍后我将使用它使算法更加健壮,但目前我正在努力查找瓷砖的轮廓

我的第一次尝试是调整图像大小、模糊图像、使其灰度化并应用canny。那么,瓷砖就是那些有四条边和一定长宽比的轮廓。这对大多数图片中的大多数瓷砖都适用,但在这张图片中,由于背景中的白色扬声器(它不认为它有四个面),顶部的瓷砖似乎不起作用:

然后,我发现并决定尝试模糊我的图像,然后从金字塔的更高层次上减去模糊的插值版本,虽然现在边缘更加清晰,但背景的粗糙度也被突出显示:

blurred_gray = cv2.GaussianBlur(
    cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY), (5, 5), 0)
blurred_gray_recons = cv2.pyrUp(cv2.pyrDown(blurred_gray))
edged = blurred_gray - blurred_gray_recons
cv2.imshow('Edged', edged)


在这些情况下,如何可靠地执行边缘检测?请注意,背景颜色并不总是相同的。

正如我们所看到的,与背景相比,瓷砖是如此的白。所以,尝试对原始(模糊的)灰度图像设置阈值,这样我们就可以分离高光瓷砖区域。@消音器想到了这一点,但一般来说,背景不会总是与瓷砖有如此明显的不同。在具有动态背景的图像中,阈值和边缘检测很少给出好的结果。使用神经网络和/或基于特征的检测可以获得更好的结果。@Zindard我的计划不是完全依赖于边缘检测,而是将其与Hough变换结合用于其他特征检测,使用瓷砖的纵横比。。。我很感激你的建议,我会仔细研究的,但我只是在学习基本知识,所以我希望有一个更简单的解决方案。在你的第二种方法中,你正在执行一个增强噪音的测试。如果您使用的是Canny,这可能会很有用。您可以使用
opencv
尝试的其他方法包括形态学操作(先关闭,然后打开,增加内核半径),用于展平背景纹理、s、聚类(例如kmeans)等。正如我们所看到的,与背景相比,瓷砖非常白。所以,尝试对原始(模糊的)灰度图像设置阈值,这样我们就可以分离高光瓷砖区域。@消音器想到了这一点,但一般来说,背景不会总是与瓷砖有如此明显的不同。在具有动态背景的图像中,阈值和边缘检测很少给出好的结果。使用神经网络和/或基于特征的检测可以获得更好的结果。@Zindard我的计划不是完全依赖于边缘检测,而是将其与Hough变换结合用于其他特征检测,使用瓷砖的纵横比。。。我很感激你的建议,我会仔细研究的,但我只是在学习基本知识,所以我希望有一个更简单的解决方案。在你的第二种方法中,你正在执行一个增强噪音的测试。如果您使用的是Canny,这可能会很有用。您可以使用
opencv
尝试的其他方法包括形态学操作(先关闭,然后随着内核半径的增大而打开),用于展平背景纹理、纹理、聚类(例如kmeans)等。
blurred_gray = cv2.GaussianBlur(
    cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY), (5, 5), 0)
blurred_gray_recons = cv2.pyrUp(cv2.pyrDown(blurred_gray))
edged = blurred_gray - blurred_gray_recons
cv2.imshow('Edged', edged)