原理
Note
以下原理来源于Richard Szeliski 的著作 Computer Vision: Algorithms and Applications 以及 Learning OpenCV
平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。
平滑处理的用途有很多, 但是在本教程中我们仅仅关注它减少噪声的功用 (其他用途在以后的教程中会接触到)。
平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 (i.e. ) 是输入像素值 (i.e. )的加权和 :
称为 核, 它仅仅是一个加权系数。
不妨把 滤波器 想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口滑过图像。
滤波器的种类有很多, 这里仅仅提及最常用的:
中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 。
Java 实现Code:
package com.gitee.dgw.lesson8; import com.gitee.dgw.lesson1.platformUtils; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.core.Point; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; /** * @program: learn-opencv * @description: * @author: Mr.Dai * @create: 2020-03-10 20:02 **/ public class MedianFilter { private final static String path=System.getProperty("user.dir")+"\catton.jpg"; /// 全局变量 private final static int MAX_KERNEL_LENGTH = 31; static{ platformUtils.loadLibraries(); } public static void main(String[] args) { Mat src = new Mat(); Mat dst=new Mat(); //读取一张图片 //image=Imgcodecs.imread(path); //读取一张灰度图片 src= Imgcodecs.imread(path,Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); if (src.empty()) { System.err.println("加载图片出错,请检查图片路径!"); return; } /// 使用 均值平滑 for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) { //Imgproc.blur(src, dst, new Size( i, i ), new Point(-1,-1)); Imgproc.medianBlur(src,dst,i); } //显示出来 对namedWindos 与cv::imshow 封装 HighGui.imshow("dstimg showimg",src); HighGui.imshow("srcimage showimg",dst); // 无限等待按键按下 HighGui.waitKey(0); } }