我有一个带有白点的二进制图像。如何使用OpenCV识别并在这些点周围绘制正方形?
问题在于这些点非常小,到目前为止,所有尝试都未能找到所有点。
这是输入图像:
这是我感兴趣的结果:
是否可以使用OpenCV功能? 如果不是,(由于大小),最有效的方法是什么?
答案 0 :(得分:0)
在尺寸为5的图像上应用dilate。
如果点之间的距离<10,则将它们连接成一个大的 点。
如果距离> 10,则将按原样分隔。
Find contours上的结果。
获取每个轮廓的minAreaRect。
完成。
答案 1 :(得分:0)
使用以下方法可以找到解决方案。
解决方案的完整代码:
import cv2
import numpy as np
img = cv2.imread('test.jpg', 0)
output_img = img.copy()
cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU,img)
kernel = np.ones((50,70), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
im2,contours, hier = cv2.findContours(img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
# get the bounding rect
x, y, w, h = cv2.boundingRect(c)
# draw a white rectangle to visualize the bounding rect
cv2.rectangle(output_img, (x, y), (x + w, y + h), 255, 1)
cv2.imshow('output',output_img)
cv2.waitKey(0)
首先,您必须根据需要创建一个内核。
更大的内核大小,属于群集的点将更高。
然后使用cv2.dilate
方法,您应该使用
创建的内核。
之后,您应该找到膨胀图像的轮廓并获得 这些轮廓的边界矩形。
一个矩形可以视为一个群集。
您可以使用kernel = np.ones((50,70), np.uint8)
更改群集大小,此处为50 x 70。
输出: