如何通过评估相等邻域像素的百分比来降低图像中的噪声 - Java OpenCV?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (203)

我正在使用openCV库(v3.4.2),计划将RGB图像转换为HSV,然后通过调整色调值来过滤它们以获得黑白图像(调整饱和度和值/亮度不会给我太多更好的结果),已经在理论上有效。但是我的一些图像有很多噪点,可以在下面显示的图像部分中看到(图1)。

现在我想填充浓密的黑点(去除其中的几个白色像素)并移除主要被白色像素包围的稀疏黑色像素,以获得类似于图2中所示的内容。

// cloV and opV are JSliders so that I can try different values
Mat se1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(cloV,cloV));
Mat se2 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(opV,opV));

Mat mask = new Mat();

// bwMat is my Mat containing the black&white image
Imgproc.morphologyEx(bwMat, mask, Imgproc.MORPH_CLOSE, se1);
Imgproc.morphologyEx(mask, mask, Imgproc.MORPH_OPEN, se2);
bwMat.setTo(new Scalar(0), mask);

尝试这种方法并使用参数我无法获得任何不错的结果(我只能设置将图像中的所有内容都转为黑色。)我认为这是因为每个邻域像素都被考虑在内并且几乎总是至少几个像素近在咫尺。现在我想也许有一种方法只会在其邻域中存在一定百分比(例如某个半径)时影响像素,但我真的不知道该寻找什么。这是正确的方法吗?或者我正在考虑什么呢?

(1)原始黑白图像:

(2)黑白图像获得:

提问于
用户回答回答于

这是我试过的代码,我认为在此代码工作后找到轮廓并删除小blob将生成期望的结果

Mat image = Imgcodecs.imread(templImage, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Imgproc.GaussianBlur(image, image, new Size(3,3), 0);

Mat thre = new Mat();
Imgproc.threshold(image, thre, 80, 255, Imgproc.THRESH_BINARY);

Mat eroded = new Mat();
Imgproc.erode(thre, eroded, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2,2)));
Imgproc.dilate(eroded, eroded, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2,2)));

扫码关注云+社区

领取腾讯云代金券