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

时间:2018-08-28 18:53:33

标签: java opencv image-processing

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

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

我不会说这是高斯噪声,因为整个图像上都有一些相当“干净”的斑点。我已经考虑了这篇文章:Remove spurious small islands of noise in an image - Python OpenCV。我借用了几行内容,并按照以下目的对其进行了调整:

// 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)原始黑白图像:

[![原始openc图片] [2]] [2]

(2)我想要获得的黑白图像:

[![编辑后的图片] [3]] [3]

注意:我使用Paint创建了第二张图像。我只想表明我正在尝试保留较密的黑色区域(我可能甚至偶然删除了该图像中的一些区域),因此它不必看起来完全像这样,但是我很感谢任何提示使我更接近这一点。

编辑:有人告诉我查看椒盐噪声,结果偶然发现了非常有效的中值模糊方法:

Imgproc.medianBlur(Mat src, Mat dst, int ksize);

如果有其他建议,我将这个问题待一会儿。 编辑2:图片已删除

1 个答案:

答案 0 :(得分:1)

这是我尝试过的代码。

我认为在此代码工作之后找到轮廓并去除小斑点将产生您期望的结果。

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)));

enter image description here