首页 > 解决方案 > 从黑白图像中获取矩形的角

问题描述

假设我们有以下黑白图像 ( 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
    ]
]

标签: pythonopencv

解决方案


有几种可能:

  • 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 形态学。


推荐阅读