我有一堆图像,我需要确定十字的位置,以进一步变换图像和对齐过程。问题在于图像非常嘈杂,而我对计算机视觉的所有这些东西都是陌生的。通常,我正在尝试通过opencv和python解决任务。我已经尝试了opencv库教程中介绍的几种方法,但是没有得到合适的结果。
考虑:我需要确定十字中心的确切位置(我可以手工完成像素精度)。我通过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');
其结果是:现在,我对以下步骤感到困惑。如何定义哪个轮廓是交叉的,哪个不是?如何处理由多个轮廓组成的十字架?
真的很感谢任何帮助!
答案 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)
结果: