2

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

我想过使用:

cvErode(img, img, 0, 1);

问题是我想要一个内核:

0 0 0
0 1 0
0 0 0

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

4

5 回答 5

0

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

于 2012-12-07T17:52:54.247 回答
0

这是我的 5 美分活动,虽然我根本不知道 openCV。

但是您应该考虑寻找一个名为“Opening”的功能。这是先腐蚀后膨胀。这将删除小的孤立像素。删除元素的大小当然取决于您使用的内核。

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

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

不管你做什么!不要只使用“侵蚀”功能。它还将更改剩余图像上的元素。在这种情况下,您绝对应该使用“打开”功能。

于 2012-12-27T18:19:41.510 回答
0

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

文档

文档总是一个很好的起点:)

于 2012-12-07T02:12:00.817 回答
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);
于 2013-01-17T14:55:40.543 回答
0

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

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

如果你不能用这个函数生成你的内核。只需手动创建 IplConvKernel 元素。

于 2012-12-07T07:10:39.410 回答