python - 从黑白图像中获取矩形的角
问题描述
假设我们有以下黑白图像 ( image.png
):
OpenCV2
我们使用以下代码加载图像:
import cv2
img = cv2.imread('image.png')
我们如何检测图像中所有白色矩形的角?我们可以假设所有矩形都平行于图像的角。
这种情况下的结果应为以下形式(res[0]
左矩形和res[1]
右矩形):
res = [
[
(20, 30), # upper left
(40, 30), # upper right
(20, 80), # bottom left
(40, 80) # bottom right
],
[
(100, 20), # upper left
(140, 20), # upper right
(100, 70), # bottom left
(140, 70) # bottom right
]
]
解决方案
有几种可能:
- “ Harris Corner Detector”擅长寻找角落 - 见这里
- 你可以使用 OpenCV 的findContours()
- 你可以使用“Hit-or-Miss” 形态来寻找角落
- 您可以将图像与内核卷积并查找特定的输出
所以,看看最后一个选项,如果我们在图像上滑动一个 2x2 像素内核,并将内核下面的每个元素乘以 1,然后将它们加在一起,然后找到总和达到 255 的所有像素,那将是一个 2x2 的正方形,其中只有一个像素是白色的 - 那是一个角落:
import cv2
import numpy as np
# Load image as greyscale
im = cv2.imread('tZHHE.png',cv2.IMREAD_GRAYSCALE)
# Make a 2x2 kernel of ones
kernel = np.ones((2,2), dtype=np.uint8)
# Convolve the image with the kernel
res = cv2.filter2D(im.astype(np.int16), -1, kernel)
# Get coordinates of points where the sum of the 2x2 window comes to 255
corners = np.where(res==255)
样本输出
(array([101, 101, 118, 118, 166, 166, 174, 174]),
array([274, 307, 117, 134, 274, 307, 117, 134]))
查看“Hit-or-Miss”形态学方法,我将直接在终端中使用ImageMagick执行此操作,但您也可以使用其他 Python 库同样执行此操作:
magick tZHHE.png -alpha off -morphology HMT Corners result.png
与往常一样,我要感谢 Anthony Thyssen 提供的上面链接的ImageMagick示例。我们正在寻找具有“Hit-or-Miss”形态的这些特定形状:
关键词:Python、OpenCV、图像处理、卷积、角点检测、角点检测器、角点检测、ImageMagick Hit-or-Miss 形态学。
推荐阅读
- python - 如何在组中获得表达式的单个部分?
- postgresql - 关系“表名”不存在,但在 FROM 中设置
- hive - MAX() OVER () with order by 2 columns 函数产生不一致的结果 Hive
- python - 尝试在 CSV 中查找和替换时内存不足
- c# - 为什么 DI 为两个不同的范围返回相同的 DbContext?
- c++ - 如何查看向量内部的内容?
- javascript - 如何在 Hyperledger Fabric 中更新资产之前检查条件
- arrays - 从缺少元素的二叉树到python中的二维数组
- android - 从 Android Studio 运行本机应用程序时出现 Gradle 同步问题
- amazon-web-services - 我可以使用冰川存储类从已删除文件夹中恢复 S3 对象吗