Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在噪声图像上查找对象的位置_Python_Opencv_Contour - Fatal编程技术网

Python 在噪声图像上查找对象的位置

Python 在噪声图像上查找对象的位置,python,opencv,contour,Python,Opencv,Contour,我有一堆图像,我需要确定十字的位置,以便进一步变换图像和对齐过程。问题是图像非常嘈杂,我对计算机视觉的所有这些东西都是新手。一般来说,我试图通过opencv和python解决这个任务。我尝试了opencv库教程中描述的几种方法,但没有得到适当的结果 考虑一下:我需要确定十字中心的精确位置(我可以用手确定像素精度)。我通过findContours函数获得的最佳结果。我已领养并获得: import numpy as np import cv2 as cv import matplotlib.pypl

我有一堆图像,我需要确定十字的位置,以便进一步变换图像和对齐过程。问题是图像非常嘈杂,我对计算机视觉的所有这些东西都是新手。一般来说,我试图通过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');
结果是:现在我对以下步骤感到困惑。我如何定义哪个轮廓是交叉的,哪个不是?如何处理由多个等高线组成的十字架


任何帮助都是非常感谢的

一种简单的方法是,在每个轮廓上制作一个包围盒
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()
结果:


工作正常!我会设法弄清楚这里发生了什么。非常感谢。顺便说一句,你会建议把标记的类型从十字架改成其他更容易辨认的标记吗?你自己做这些十字架吗?也许你可以画矩形?…你可以制定分类cv2.contourArea()的标准,并用cv2.moments()找到中心?我真的不能给出一个好主意,因为我不知道这项任务的具体应用。是的,我自己画十字。以前,当我手工完成这项任务时(我指的是搜索十字中心),十字非常漂亮——它们有小的特征,这就是为什么我能够非常准确地找到中心。我认为矩形比十字架更糟糕。我想到了更复杂的事情,使用模板匹配算法而不是边界框。如果这对你有帮助的话,十字架是通过电子束光刻技术制作的。你可以尝试模板匹配,但这需要更多的工作,而且根据我的经验(也许其他人有更好的经验),其效果不如纯数学概念算法。我认为一个更好的方法是特征匹配,如果你想要更复杂的方法。但我对问题的看法是,如果“简单”有效,就不会使问题复杂化。你可以试着用X代替+。这样,如果某个X“leg”较短,您将获得更好的边界框。但是,您可以改进精确交叉点的搜索,而不是计算它;)