【问题标题】:How to decide on the kernel to use for dilations (OpenCV/Python)?如何决定用于扩张的内核(OpenCV/Python)?
【发布时间】:2021-04-16 01:25:51
【问题描述】:

我是 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)

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

【问题讨论】:

  • 您可以使用与要填充的孔或要移除的点大小差不多的内核大小,或者您可以使用小内核迭代多次以填充或移除数字迭代次数大约是孔的大小除以过滤器的大小。
  • 几个问题:1)扩张功能如何帮助去除斑点? 2)我如何找到或估计给定图像中孔的大小? 3)我也尝试了非常多的迭代(10),但它并没有真正填补漏洞。它只是让白色区域本身更大。
  • @John 我从你的问题中了解到的是,你想为火车区域制作一个单一的面具(所以我建议使用closing 而不是dilation,以摆脱您可以使用Median Filter 而不是Gaussian Filter 的小点,关于内核大小,一种解决方案是循环使用可变内核大小,直到达到2 个区域backgroundmask
  • @John 自动检测是否有 2 个区域 len(np.unique(mask))==2,其余的你必须尝试看看哪些参数最适合你的需求。

标签: python python-3.x opencv image-processing


【解决方案1】:

也许这会让您对 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)

形态学广场公开赛:

形态矩形闭合:

替代形态正方形关闭:

【讨论】:

  • 谢谢!这几乎正​​是我想要的。请问您是如何决定结构元素的大小/结构的?仅仅是因为白点是方形的,而白色的间隙是水平的吗?例如,您是如何估计方形内核的大小应该为 19x19 的?
  • 是的,斑点是正方形或长方形。如果我有圆形区域,我会根据斑点的形状使用半径相等的椭圆或拉长的椭圆。内核的大小约为 blob 的大小。最后,我试图获得能够完成这项工作的最小内核。所以一些试验和调整。
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多