OpenCV-图像处理(09、模糊图像二)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/85886588

模糊是基本的图像处理方法。
在介绍这两种方法之前先来介绍两种常见的噪声:

  • 椒盐噪声
    椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声分为两种即胡椒噪声和盐噪声,胡椒噪声是黑色的,属于低灰度噪声,盐噪声是白色的,属于高灰度噪声,一般两种噪声同时出现,呈现在图像上就是黑白杂点。去除椒盐噪声最常用的算法是中值滤波
  • 高斯噪声
    高斯噪声是一种随机噪声,其幅度的统计规律服从高斯分布(正态分布),去高斯噪声最常用的算法是高斯滤波
    而这些噪声出现在图片上某一点时都是比较突兀的,如出现椒盐噪声时,图片中突然某一点的会突然变成0或255,一般与噪声周围的灰度值有较大的差值,所以图像在去噪时一般都是用周围像素的灰度值经过一定的算子来改变这点像素上较为突兀的灰度值,但缺陷是对原来正常的像素点的灰度值也会产生影响使图片变得;
    在图像处理时,灰度图片一般会被视为一个矩阵,而图像上的每一像素所代表的灰度值被视为矩阵中相应位置中的元素,如一幅100×100像素的黑色灰度图片就可以视为100×100的一个矩阵,矩阵中的每一个元素都为0;对图像进行处理也可以视为对这个矩阵进行处理。

1. 中值滤波

中值模糊 medianBlur(Mat src, Mat dest, ksize)
  • 统计排序滤波器。
  • 中值对椒盐噪声有很好的抑制作用(处理黑白点)。 图像噪声就是硬件处理图像时受干扰产生了极大或极小的像素值,转换成颜色数据就是255或0,这就是椒盐噪声(黑白)。
    在这里插入图片描述

2. 双边滤波

双边模糊 bilateralFilter(src, dest, d=15, 150, 3);
  15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
  150 – sigma color 决定多少差值之内的像素会被计算
  3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值
  中值模糊的ksize大小必须是大于1而且必须是奇数。
  • 常说的双边滤波就是指高斯双边滤波(用于美颜)。两像素差值太大的不予考虑,像素差值有一个阈值范围,在这个范围的才考虑,其他原样输出,这个叫双边滤波。
    在双边滤波的基础加上高斯权重,就叫高斯双边滤波。

均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重
高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同
高斯双边模糊 – 是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变
在这里插入图片描述

综合代码示例

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;

int main(int argc,char** argv){
	Mat src=imread("E:/Experiment/OpenCV/Pictures/blur2.jpg");
	if(!src.data){
		printf("could not load image ...");
		return -1;
	}
	imshow("input",src);

	Mat dst;
    medianBlur(src, dst, 3);//中值模糊,去掉图像黑白点,ksize大小必须是大于1而且必须是奇数。 中值模糊后图像上还是有一些黑点,后面再讲
    imshow("medianBlur1", dst);

    Mat src2 = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");
    imshow("src2", src2);
    Mat dst2, dst3, dst4, dst5, dst6, dst7;
    medianBlur(src2, dst2, 3);//中值模糊,对于有些图像能让更圆润一些
    imshow("medianBlur2", dst2);
    
	//双边模糊bilateralFilter(src, dest, d=计算的半径, sigma color,sigma space);
	//15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
    //150 – sigma color 决定多少差值之内的像素会被计算
    //3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值
    bilateralFilter(src2, dst3, 15, 150, 3);//双边模糊,虽然是模糊,但是图像的轮廓还在,而且能增强图像的立体感
    imshow("bilateralFilter1", dst3);
    bilateralFilter(src2, dst4, 15, 100, 5);//这就是磨皮的效果,ps效果很明显,sigmaColor值越小,保留的边缘像素越多,sigmaColor值适合在100,d值适合在15
    imshow("bilateralFilter2", dst4);
    bilateralFilter(src2, dst5, 30, 100, 5);//d取30,磨皮效果的很厉害了
    imshow("bilateralFilter3", dst5);
    GaussianBlur(src2, dst6, Size(15, 15), 3, 3);//高斯模糊,对比于双边模糊,当模糊的参数设置都是一样,双边模糊将边缘值都保留了下来
    imshow("GaussianBlur", dst6);

    Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//定义掩膜 3*3矩阵,前三个数表示第一列还是第一行?  右值的最外层括号在语法上仅仅只是包裹的意思
    filter2D(dst4, dst7, -1, kernel, Point(-1, -1), 0);//调用OpenCV函数进行掩膜操作,src.depth表示位图深度,有32、24、8等,如果不知道也可以传-1,表示跟输入图像一样
    imshow("filter2D bilateralFilter", dst7);


	waitKey(0);
	return 0;
}

推荐博客

  1. https://blog.csdn.net/huanghuangjin/article/details/80932335
  2. https://blog.csdn.net/qq_25819827/article/details/52050647 (强烈推荐阅读)
  3. https://blog.csdn.net/qq_25343557/article/details/78668410

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/85886588