如何决定用于扩展的内核(OpenCV/Python)?

如何决定用于扩展的内核(OpenCV/Python)?,python,python-3.x,opencv,image-processing,Python,Python 3.x,Opencv,Image Processing,我对OpenCV非常陌生,最近,我尝试比较两张rails的图片,一张有火车,一张没有火车。在比较之后,我应用了一个阈值,在白色区域中有一些我不想要的“洞”。目前,我正在使用4次迭代的扩展,内核设置为“无”,据我所知,默认为3x3 我如何决定使用哪种内核,以使膨胀在使白色区域连续方面做得更好?如果我能去除背景中的小白点也会很好。代码如下: resized = imutils.resize(img2, width=1050) resized2 = imutils.resize(img3, width

我对OpenCV非常陌生,最近,我尝试比较两张rails的图片,一张有火车,一张没有火车。在比较之后,我应用了一个阈值,在白色区域中有一些我不想要的“洞”。目前,我正在使用4次迭代的扩展,内核设置为“无”,据我所知,默认为3x3

我如何决定使用哪种内核,以使膨胀在使白色区域连续方面做得更好?如果我能去除背景中的小白点也会很好。代码如下:

resized = imutils.resize(img2, width=1050)
resized2 = imutils.resize(img3, width=1050)
grayA = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(resized2, cv2.COLOR_BGR2GRAY)
grayA = cv2.GaussianBlur(grayA,(7,7),0)
grayB = cv2.GaussianBlur(grayB,(7,7),0)
frameDelta = cv2.absdiff(grayA, grayB)
thresh = cv2.threshold(frameDelta, 20, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=4)


在这方面完全是初学者,因此即使是改进这些比较的一般提示/建议也将不胜感激

这可能会让您了解Python/OpenCV中的形态学。首先,我使用一个大约小白点大小的方形“开放”内核来去除它们。然后,我使用一个水平矩形“close”内核来填充它,该内核的大小大约为黑色间隙的大小。“打开”删除白色区域(或填充黑色间隙),关闭删除黑色区域(或填充白色间隙)

输入:


形态广场开放:

形态矩形关闭:

交替形态方形闭合:


您可以使用与要填充的孔大小或要移除的斑点大小有关的内核大小,或者您可以使用一个小内核进行多次迭代以填充或移除,其中迭代次数大约为孔大小除以过滤器大小。几个问题:1)扩张函数有何帮助去除斑点?2) 如何在给定图像中查找或估计孔的大小?3) 我也尝试了大量的迭代(10次),但并没有真正填补漏洞。它只是使白色区域本身变大了。@John 1),2),3)。@John从你的问题中我了解到,你想在火车区域制作一个单独的面具(因此我建议使用
关闭
而不是
膨胀
,为了消除可以使用
中值滤波
而不是
高斯滤波
的小点,关于内核大小,一种解决方案是使用可变内核大小循环,直到达到两个区域
背景
,以及
掩码
@John auto。)自动检测是否有两个区域
len(np.unique(mask))的方法==2
,剩下的部分你必须试着看看哪些参数最适合你的需要。谢谢!这正是我想要的。请问你是如何决定结构元素的大小/结构的?是否仅仅因为白点是方形的,而白间隙是水平的?你是如何估计s的大小的例如,方形内核应该是19x19?是的,水滴是方形或矩形的。如果我有圆形区域,我会根据水滴的形状使用半径相等的椭圆或加长的椭圆。内核的大小与水滴的大小近似。最后,我试图得到最小的内核来完成这项工作。因此进行了一些尝试和调整。
import cv2
import numpy as np

# read image as grayscale
img = cv2.imread('blob3.png', cv2.IMREAD_GRAYSCALE)

# threshold to binary
thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY)[1]

# apply morphology open with square kernel to remove small white spots
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19,19))
morph1 = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

# apply morphology close with horizontal rectangle kernel to fill horizontal gap
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (101,1))
morph2 = cv2.morphologyEx(morph1, cv2.MORPH_CLOSE, kernel)

# write results
cv2.imwrite("blob3_morph1.png", morph1)
cv2.imwrite("blob3_morph2.png", morph2)

# show results
cv2.imshow("thresh", thresh)
cv2.imshow("morph1", morph1)
cv2.imshow("morph2", morph2)
cv2.waitKey(0)