我正在尝试从图像中删除孤立的像素。
我想过使用:
cvErode(img, img, 0, 1);
问题是我需要一个内核:
0 0 0
0 1 0
0 0 0
我不确定该怎么做。有人可以帮忙吗?
答案 0 :(得分:0)
答案 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);