Image processing OpenCV去除孤立像素

Image processing OpenCV去除孤立像素,image-processing,opencv,Image Processing,Opencv,我正在尝试从图像中删除孤立的像素 我想用: cvErode(img, img, 0, 1); 问题是我想要一个内核: 0 0 0 0 1 0 0 0 0 我不知道该怎么做。有人可以帮忙吗?您可以使用filter2D函数在opencv中使用自定义内核过滤图像 看这张照片 文档总是一个很好的开始来源:)现在您通过将NULL作为第三个参数来设置默认内核 您应该使用并传递输出作为函数的参数 如果无法使用此函数生成内核。只需手动创建IplConvKernel元素 重新阅读问题标题后,现在我知道你想要什

我正在尝试从图像中删除孤立的像素

我想用:

cvErode(img, img, 0, 1);
问题是我想要一个内核:

0 0 0
0 1 0
0 0 0

我不知道该怎么做。有人可以帮忙吗?

您可以使用filter2D函数在opencv中使用自定义内核过滤图像

看这张照片


文档总是一个很好的开始来源:)

现在您通过将NULL作为第三个参数来设置默认内核

您应该使用并传递输出作为函数的参数


如果无法使用此函数生成内核。只需手动创建IplConvKernel元素

重新阅读问题标题后,现在我知道你想要什么了。对于执行命中或未命中的函数来说,您所描述的内核实际上是一个3x3的正方形。OpenCV似乎不支持它,但通过对每个点邻域进行简单分析,您可以执行与您想要的相同的操作:如果一个点未连接到任何其他点,请将其删除。

这是我的5美分事件,尽管我根本不知道OpenCV

但是你应该考虑寻找一个叫做“打开”的函数。这是一种侵蚀,然后是膨胀。这将删除小的孤立像素。被删除元素的大小当然取决于您使用的内核

另一个选择是找到一个函数来对图像进行低通滤波

无论你做什么,都可以归结为两个步骤。 调用函数来创建内核。 使用另一个函数将内核应用于图像


不管你做什么!不要只使用“腐蚀”功能。它还将更改剩余图像上的元素。在这种情况下,您应该明确使用“opening”函数。

如果您使用的是新的OpenCV 2.x API,您可以这样做:

cv::Mat kernel = (cv::Mat_<uchar>(3,3) << 0, 0, 0, 
                                          0, 1, 0, 
                                          0, 0, 0);
cv::erode(img, img, kernel);

cv::Mat kernel=(cv::Mat_(3,3)我不是一个cv爱好者:),所以请原谅我的问题。如何使用filter2D执行形态学侵蚀?让我检查一下我是否正确理解了这个问题。您有一个图像,并且希望使用自定义内核对其进行形态学侵蚀。自定义内核是包含元素{0,0,0,0,1,0,0,0,0}的3x3矩阵。顺便说一句,你提到的内核是无用的,因为它会返回相同的图像。如果你的问题是要找到用于获得特定效果的内核(形态学操作),你可能需要重新表述这个问题。此外,你还需要为论坛中的人提供更多的细节来帮助你。当然,如果你能指定你尝试了哪些选项就好了。虽然这个问题不是我的,但从问题的描述来看,这可能是一个内核。我对filter2D的问题是,它是用来做线性滤波的,而形态学是一种非线性的方法。现在,我们需要在结构函数和结构元素之间达成一致,后者显然得到OpenCV的支持。或者我们可以跳过这个问题,提出一个问题:OpenCV可以执行加权秩序过滤器吗?在这种情况下,我会将权重{0,…,0,1,0,…,0}应用于给定点的水平邻域,然后选择n级结果。@mmgp:是的。我不知道OpenCV中的非线性形态学。我会在论坛上(闲暇时间)搜索任何关于这方面的帖子。如果你发现了,请提供链接。你是指非平面内核还是你描述的有其他含义的内核?原点处的值大于0将导致电平偏移。这不是你的问题吗?你的内核只是一个点!与任何形状(矩形、椭圆)和cv::Size(1,1)一起使用。我认为它是一个非平面元素,@remi。它可能是一条中间有峰值的直线,也可能是一个中间有峰值的3x3正方形(在描述中变平)。是的,但形态不同于卷积/滤波。因此,内核的相关部分是非零值所在的部分。在这种情况下,只有一个非零值。如果你想要一行,你应该用一行填充值,在一个1rowx9cols矩阵中,这对我所说的毫无意义,@remi。有平坦形态和非平坦形态。在平坦形态学中,只处理给定点的邻域,在非平坦形态学中,处理加权邻域。在平面形态中,每个结构元素都相当于一组位移,即它们都有效地具有值
0
,并且
1
s的“邻域核”定义了这组位移的形状。在非平面的情况下,没有必要坚持使用值
0
。在我看来,OpenCV在这种情况下的文档很差。您最多可以指定自定义形状的结构元素,但不能指定非平面的结构元素。据我所知,人们大多只会使用平面形态,而且有一些较旧的出版物关于加速时这些元素的可分解性。现在,数学形态学中有一种叫做非平坦元素的东西,通常是一种结构函数(不是结构元素),OpenCV似乎缺少这种结构函数。使用OpenCV执行非平坦操作当然是可能的,但看起来需要放弃使用CVE和co,除非它什么都不做。OpenCV中的形态学只使用平面元素完成,它还忽略了用零标记的位移。实际上,SE是一个单点(1),它不会改变图像。