我通过Python 3.7使用OpenCV。我有一组单色图像,看起来像这样:
我想找到这些图像上的所有“关节点”,其中“关节点”是两块木板的每个交点的中心(1像素)。这些“关节”大致由下图中的红色圆环表示:
第一个想法是对图像进行骨架化,然后通过算法找到所有连接的边缘,但所有骨架化技术都给了我扭曲或圆角以及额外的“萌芽”
import cv2
import numpy as np
from skimage.morphology import skeletonize
image = cv2.imread("SOURCE_IMAGE.jpg", cv2.IMREAD_GRAYSCALE)
binary_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 91, 12)
skeleton = (skeletonize(binary_image//255) * 255).astype(np.uint8)
结果:
第二个想法是找到内部轮廓,将它们近似到边界点,找到最近的邻居,然后以某种方式计算中心,但是,同样,精明的边缘检测方法给了我扭曲的角落和额外的点
import cv2
image = cv2.imread("SOURCE_IMAGE.jpg", cv2.IMREAD_GRAYSCALE)
edged = cv2.Canny(image, 100, 200)
结果:
这个问题有可靠的解决方法吗
这是我解决这个问题的方法:
第一步,检查每一列,确定细线并使其变为黑色(0)。结果只会是垂直线。对于第二步,请执行相反的操作。 最后,将垂直线图像与水平线图像进行比较。两者中的白色(255)像素是交点
<> > > EM>:EEM><强>请不要因为C++中的编码而责备我。我不熟悉python,我只是想展示我的方法和结果以下是代码和结果:
资料来源:
垂直线:
水平线:
结果:
守则:
这里使用Python而不是C++的一个稍微修改的@YunusTemurlenk's方法。这个想法是:
获取二值图像。加载图像,转换为灰度,Gaussian blur,然后Otsu's threshold
获取水平和垂直线条掩码。使用^{} 创建水平和垂直结构元素,然后执行^{} 以隔离线条
找到关节。我们^{} 将两个遮罩组合在一起以获得关节
在关节遮罩上找到质心。我们find contours然后计算centroid
水平/垂直线遮罩
检测到绿色接头
结果
相关问题 更多 >
编程相关推荐