OpenCV摆脱了孤立的像素

时间:2012-12-07 02:03:00

标签: image-processing opencv

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

我想过使用:

cvErode(img, img, 0, 1);

问题是我需要一个内核:

0 0 0
0 1 0
0 0 0

我不确定该怎么做。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:0)

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

查看documentation

文件始终是一个很好的起源:)

答案 1 :(得分:0)

现在通过传递NULL作为第三个参数来设置默认内核。

您应该使用http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=erode#getstructuringelement并将输出作为侵蚀函数的参数传递。

如果您无法使用此功能生成内核。只需手动创建IplConvKernel元素即可。

答案 2 :(得分:0)

重新阅读问题标题后,现在我看到了你想要的东西。你在hit-or-miss morphological operator之后,你描述的内核实际上是一个3x3的方格,对于执行命中或未命中的函数来说完全没问题。 OpenCV似乎不支持它,但你可以通过对每个点邻域进行简单分析来执行你想要的等效操作:如果一个点没有连接到任何其他点,则删除它。

答案 3 :(得分:0)

这是我的5美分事件,虽然我根本不懂openCV。

但你应该考虑寻找一个名为“Opening”的函数。这是在侵蚀,然后是扩张。这将删除小的孤立像素。删除元素的大小将取决于您使用的内核。

另一个选择是找到一个对图像进行低通滤波的功能。

不管你做什么,它归结为两步。 调用函数来创建内核。 使用其他函数将内核应用于图像。

无论你做什么!不要只使用“侵蚀”功能。它还将更改剩余图像上的元素。在这种情况下,你应该明确地使用“开放”功能。

答案 4 :(得分:0)

如果您使用的是新的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);