Skip to content
鼓励作者:欢迎打赏犒劳

图像去噪

均值滤波

均值滤波(Mean Filtering),也称为平均滤波,是一种常用的图像处理方法,用于去除图像中的噪声 特别是去除椒盐噪声。均值滤波的基本思想是通过一个卷积窗口(或称为滤波器)对图像中的每个像素 点进行处理,用该像素周围邻域像素的平均值替换该像素的值,从而达到平滑图像的效果。

原理:

假设我们使用一个大小为3x3的窗口进行均值滤波。对于图像中的每个像素,其新的值是该像素周围 3x3窗口中所有像素值的平均值。

具体步骤:

  1. 选定一个滤波窗口(例如3x3,即一个包含9个像素的窗口)
  2. 将窗口滑动到图像的每一个位置,对于每个位置,计算窗口内所有像素值的平均值。
  3. 替换该位置像素的值为计算得到的平均值。

计算窗口中所有像素的平均值:

因此,像素250的新值为177 (经过取整处理) 。 结果: 经过均值滤波处理后,图像中每个像素都会被其邻域像素的平均值所替代,从而图像看起来更加平滑,噪声减少。

java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * 公众号:干货食堂
 */
public class Test {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png");
        //创建输出图像
        Mat dst = new Mat();
        //使用3x3的均值滤波器进行滤波
        Imgproc.blur(src, dst, new Size(3,3));
        HighGui.imshow("before Image", src);
        HighGui.waitKey(0);
        HighGui.imshow("after Image", dst);
        HighGui.waitKey(0);
        System.exit(0);
    }
}

高斯滤波

高斯滤波(Gaussian Blur)是一种基于高斯函数的滤波方法,用于图像的平滑处理,常用于去噪和边缘检 测的预处理。与均值滤波不同,高斯滤波对邻域内的像素赋予不同的权重,距离中心越近的像素权重越高, 从而更自然地平滑图像并保留更多的图像细节。

java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * 公众号:干货食堂
 */
public class Test {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png");
        ///创建输出图像
        Mat dst = new Mat();
        //使用5x5的高斯滤波器,标准差为1.5
        Imgproc.GaussianBlur(src, dst, new Size(5,5), 1.5);
        HighGui.imshow("before Image", src);
        HighGui.imshow("after Image", dst);
        HighGui.waitKey(0);
        HighGui.destroyAllWindows();
    }
}

中值滤波

中值滤波(Median Filtering) 是一种非线性滤波方法,常用于去除椒盐噪声 (Salt-and-Pepper Noise),同时能够有效保留图像中的边缘信息。与均值滤波和高斯滤波不同,中值滤波的结果不是像素 值的平均值,而是邻域内像素的中值。

中值滤波的原理

  • 定义邻域窗口:选定一个滤波窗口(例如3x3或5x5),覆盖目标像素及其邻域。
  • 排序邻域像素值:将窗口内所有像素值从小到大排序。
  • 取中值:选择排序后的中间值作为目标像素的新值。

中值滤波的优点

  • 去噪能力强:对椒盐噪声有良好的去除效果。
  • 保边性能好:边缘像素不会被模糊化,因为中值操作不会产生新的像素值。

java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * 公众号:干货食堂
 */
public class Test {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png");
        ///创建输出图像
        Mat dst = new Mat();
        //应用中值滤波,滤波窗口大小为3x3
        Imgproc.medianBlur(src, dst, 3);
        HighGui.imshow("before Image", src);
        HighGui.imshow("after Image", dst);
        HighGui.waitKey(0);
        HighGui.destroyAllWindows();
    }
}

如有转载或 CV 的请标注本站原文地址