我有一堆图像,我需要确定十字的位置,以进一步变换图像和对齐过程。 问题在于图像非常嘈杂,而我对计算机视觉的所有这些东西都是陌生的。 通常,我正在尝试通过opencv和python解决任务。 我已经尝试了opencv库教程中描述的几种方法,但是没有得到合适的结果。

考虑: 带有四个十字的灰度图像 我需要确定十字中心的确切位置(我可以手工完成像素精度)。 我通过findContours函数获得的最佳结果。 我已经采用了本教程中的代码,并且得到了:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import random

random.seed(42)

img = cv.imread("sample.png")
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img_gray = cv.blur(img_gray, (3,3))

threshold = 150

dst = cv.Canny(img_gray, threshold, threshold * 2)
_, contours, hierarchy = cv.findContours(dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

result = np.zeros((dst.shape[0], dst.shape[1], 3), dtype=np.uint8)
for i in range(len(contours)):
    color = (random.randint(0, 256), random.randint(0, 256), random.randint(0, 256))
    cv.drawContours(result, contours, i, color, 2, cv.LINE_8, hierarchy, 0)

cv.imwrite("result.png", result)

fig, ax = plt.subplots()
fig.set_size_inches(10, 10);
ax.imshow(result, interpolation='none', cmap='gray');

结果是: 找到具有几个轮廓的图像 现在,我对以下步骤感到困惑。 如何定义哪个轮廓是交叉的,哪个不是? 如何处理由多个轮廓组成的十字架?

任何帮助都非常感谢!

#1楼 票数:2 已采纳

一种简单的确定交叉点和不交叉点的方法是,在每个轮廓上创建一个绑定框x,y,w,h = cv2.boundingRect(cnt)并选择具有h(高度)和w(重量)大于您提供的阈值。 如果您观察到图像上的噪点与十字架一样大。

我还举例说明了我将如何解决这一任务。 您可以尝试通过执行直方图均衡化,然后使用OTSU阈值进行阈值化并对阈值进行开放(侵蚀然后进行扩张)来对图像进行去噪。 然后,您可以过滤出轮廓的高度和权重的十字,然后计算上述标准中轮廓的每个边界框的中点。 希望能有所帮助。 干杯!

例:

import cv2
import numpy as np

img = cv2.imread('croses.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
equ = cv2.equalizeHist(gray)
_, thresh = cv2.threshold(equ,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
kernel = np.ones((2,2),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
_, contours, hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    if w > 40 and h > 40:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
        cv2.circle(img,(int(x+(w/2)), int(y+(h/2))),3,(0,0,255),-1)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

在此处输入图片说明

  ask by Anton translate from so

未解决问题?本站智能推荐:

2回复

在嘈杂的图像中检测颜色几乎不变的垂直矩形

我有一个带有几个矩形的嘈杂图像。 从视觉上讲,矩形非常明显。 它们都是垂直或水平的,它们不会以不同的角度出现。 它们的颜色/强度也相当恒定。 我想检测这些矩形,如果可能的话,检测其他矩形内部或顶部/交叉的矩形。 原图: 具有预期矩形/正方形的图像(可能有细垂直线,它们是否被检测为矩形并不重要):
1回复

使用孔查找多个对象的轮廓

这是来自以下问题的后续问题: 如何获得带孔的二进制掩码的边界坐标? 给定相同的图像: 我想为(x, y) - 外轮廓及其内轮廓的坐标的每个对象获得一个单独的列表。 理想情况下,我想使用此列表在单独的空白画布上绘制对象(外部和内部轮廓)。 编辑:接受的答案仅适用于具有内部轮廓的对象,但不适用于没有内
1回复

检测位于图像opencv侧面的对象

我正在尝试检测图像中的多个对象; 但是,有些对象位于边缘,因此图像中并未显示所有轮廓。 我们如何检测以某种方式“裁剪”的对象? 我们可以在图像的边缘封闭轮廓吗? 首先,我模糊了图像,应用了一个精明的检测器,扩张,然后腐蚀了边缘。 这是我的代码: 这就是我得到的边缘检测,这对我来说很好。 在此处输入图
2回复

PythonOpenCV从二进制图像中检测白色对象并裁剪它

我的目标是从这个二进制图像中检测一张白纸然后裁剪这张白纸,并为这份白皮书制作一个新的子集二进制图像。 现在我的OpenCV Python代码可以找到这份白皮书。 第一步,我创建了一个用于查找此白皮书的掩码: 正如你们所看到的,小的白噪声和小块已被删除。 然后问题变成了如何从这个二进制
1回复

根据边缘查找轮廓

我想检测设备标签的轮廓。 尽管代码运行正确,但它从未完全检测到标签的轮廓。 原图 使用此代码: 显示输出 有没有更好的方法来缩小设备标签的轮廓? 以下是github上供您参考的代码: https : //github.com/AjayAndData/Licence-plate-detection-a
1回复

PythonOpencv-在轮廓内查找黑点

我正在为OpenCV 2.1使用python包装器。 (我不能使用任何外部库) 有谁知道我如何找到其他2个同心黑色形状中的黑点? 现在我正在使用cv.FindCountours来检测黑色区域,但是然后我不知道如何丢弃这两个同心形状并仅保留内部点 图片链接: http : //img8
1回复

OpenCV,Python:查找轮廓内的像素

我正在一个项目上,经过一些过程,我能够找到一个二进制图像,其中移动的对象是白色的,其余的都是黑色的: 二进制图像 然后,有一种算法可以根据它们之间的距离(例如,中间的一个)将应该属于这些斑点的斑点聚在一起。 为此,他们使用findContour函数,以一个带有数字标记的斑点由其轮廓像素
1回复

使用给定的y值在轮廓上查找点

我有通过 cv2.findContours(cv2.CHAINE_APPROX_NONE) 提取的各种轮廓。 之后我也提取了极值点。 现在我想在最左边/最右边的轮廓中找到点。 轮廓中与最左/最右点具有相同 y 坐标的点,可以这么说。 由于大多数函数几乎无法读取坐标的格式,因此诀窍可能是重新排序它们。