我正在尝试从图像中删除孤立的像素。
我想过使用:
cvErode(img, img, 0, 1);
问题是我想要一个内核:
0 0 0
0 1 0
0 0 0
我不确定该怎么做。任何人都可以帮忙吗?
我正在尝试从图像中删除孤立的像素。
我想过使用:
cvErode(img, img, 0, 1);
问题是我想要一个内核:
0 0 0
0 1 0
0 0 0
我不确定该怎么做。任何人都可以帮忙吗?
重新阅读问题的标题后,现在我明白了你想要什么。您在命中或未命中形态运算符之后,您描述的内核实际上是一个 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);
现在您通过将 NULL 作为第三个参数传递来设置默认内核。
您应该使用http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=erode#getstructuringelement并将输出作为 erode 函数的参数传递。
如果你不能用这个函数生成你的内核。只需手动创建 IplConvKernel 元素。