在嘈杂的图像上找到对象的位置

时间:2018-10-12 15:30:02

标签: python opencv contour

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

考虑:a grayscale image with 4 crosses我需要确定十字中心的确切位置(我可以手工完成像素精度)。我通过findContours函数获得的最佳结果。我采用了code from the tutorial,我得到了:

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');

其结果是:image with several contours found现在,我对以下步骤感到困惑。如何定义哪个轮廓是交叉的,哪个不是?如何处理由多个轮廓组成的十字架?

真的很感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

一种简单的确定交叉点和不交叉点的方法是,在每个轮廓上打一个select newid = row_number() over (order by case when val between 'A' and 'Z' then ascii(val) -31 else ascii(val) end), * from yourtable 框,然后选择h(height)和w(weight)大于您提供的门槛。如果您观察到图像上的杂音与十字架一样大。

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

示例:

x,y,w,h = cv2.boundingRect(cnt)

结果:

enter image description here