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

Saa*_*ad 3 python opencv image-processing python-3.x

我对 OpenCV 很陌生,最近我试图比较两张铁轨图像,一张有火车,一张没有。比较后,我应用了阈值,白色区域中有一些我不想要的“洞”。目前,我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

fmw*_*w42 5

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

输入:

在此输入图像描述

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)
Run Code Online (Sandbox Code Playgroud)

形态广场开放时间:

在此输入图像描述

形态矩形关闭:

在此输入图像描述

替代形态广场关闭:

在此输入图像描述