在我编写代码的工具中,第一个处理步骤是找到4个大的黑色方块的外角的坐标。然后它们将被用来做一个单形变换,以便对图像进行倾斜/取消旋转(即透视变换),最终得到一个矩形图像。下面是一个-rotated and noise-input(download link here)的示例:
为了只保留大的正方形,我使用了morphological transformations类似的关闭/打开:
import cv2, numpy as np
img = cv2.imread('rotatednoisy-cropped.png', cv2.IMREAD_GRAYSCALE)
kernel = np.ones((30, 30), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imwrite('output.png', img)
输入文件(download link):
形态变换后的输出:
问题:输出的方块不再是正方形,因此方块左上角的坐标将根本不精确!在
我可以减小内核的大小,但这样会保留更多不需要的小元素。在
问题:如何更好地检测正方形的角点?
注:
由于morphological closing只是一种膨胀+侵蚀,我找到了罪魁祸首:
^{pr2}$完成此步骤后,仍然可以:
那么
img = cv2.erode(img, kernel, iterations = 1)
给予
再也不行了!
你可以尝试搜索并过滤出你的特定轮廓(黑色矩形),然后用一个键对它们进行排序。然后为每个轮廓选择极值点(左、右、上、下),你就会得到这些点。请注意,此方法仅适用于此图片,如果图片是在其他方向被保护的,则必须相应地更改代码。我不是专家,但我希望这能有所帮助。在
结果:
您可以在二值化后使用适当的阈值将方块提取为单个斑点,并根据大小选择适当的方块。你也可以先用中值滤波器去噪。在
然后,一个紧密旋转的边界矩形将为您提供角点(您可以通过在凸面外壳上运行旋转卡钳来获得它)。在
有关如何反扭曲图像的详细说明,请参见this link。在
相关问题 更多 >
编程相关推荐