一、噪声与处理

噪声:常见的有椒盐噪声和高斯噪声。
图像滤波处理:
1.消除图像噪声的滤波,即图像平滑/图像去噪(低通滤波)
2.提取图像中的部分信息的滤波(高通滤波)
由于噪声主要集中在高频段,因此图像去噪是低通滤波。

图像滤波:
1.线性滤波—-对滤波器内所有像素值
1.1均值滤波
1.2方框滤波
1.3高斯滤波
2.非线性滤波
2.1中值滤波
2.2双边滤波

线性滤波

1.均值滤波

image.png
image.png

2.方框滤波

相当于均值滤波加上了一个系数。
image.png

3.高斯滤波

用来处理高斯噪声
image.png
ksize
sigmaX
sigmaY
这三个量有一定的转换关系;
当输入尺寸为0时,会根据标准偏差计算滤波器的尺寸;
当标准偏差 有一个为0时,则两个方向都是输入的那个标准偏差的值;
当标准偏差都为0时,则两个方向的标准偏差默认为滤波器尺寸的计算值。
image.png
该函数用于生成指定尺寸的高斯滤波器,sigma若为负值,则由ksize默认计算。
如果要生成一个二维的GaussianFilter,需要调用两次getGaussianFilter函数,得到两个方向的一维高斯滤波器,相乘得到二维高斯滤波器。

4.自定义滤波器

两个函数:

  1. void filter2D()
  2. void sepFilter2D()

image.png
kernel(卷积核)为自定义值。

image.png
要输入两个一维的滤波器

非线性滤波

1.中值滤波

用滤波器范围内所有的像素值的中值,代替滤波器中心位置的像素值。
多用于处理椒盐噪声。
image.png
ksize越大,图像越模糊。

2.双边滤波

双边滤波的双边,指的是空域滤波和值域滤波;能很好的保留区域信息(边缘);
在保留区域信息的基础上实现对噪声的去除。
image.png
d: 滤波过程中每个像素邻域的直径。
sigmaColor,sigmaSpace越大,表面越远的像素会相互影响,图像越模糊。

双边滤波能起到美颜的效果。

二、边缘检测

求取边缘,可以用函数filter2D。
在一类求取边缘的函数中,需要注意的是:
输出图像是用来显示边缘的Mat:可能有负值。
因此,输出图像的类型最好固定为CV_16S,再进行一步 convertScaleAbs();取绝对值
image.png
alpha,beta分别是缩放比例和旋转比例。

1.Sobel算子

image.png
dx,dy是x,y方向的差分阶数;
scale是对导数计算结果的缩放比例;
image.pngimage.png分别是x,y方向的滤波器
image.png

  1. Sobel(img, ok, CV_16S, 2, 0,3);
  2. convertScaleAbs(ok, ok);
  3. imshow("1", ok);

2.Scharr算子

image.png
参数含义同上。
这个算子,
Scharr aperture
image.png

3.Laplacian算子

image.png
image.png

  1. int main()
  2. {
  3. Mat img, ok, output;
  4. img = imread("D:/OpenCV/ycy2.jpg");
  5. if (img.empty())
  6. {
  7. cout << "error!";
  8. }
  9. Laplacian(img, ok, -1, 3);
  10. Laplacian(img, output, CV_16S, 3);
  11. convertScaleAbs(output, output);
  12. imshow("默认", ok);
  13. imshow("CV_16S", output);
  14. convertScaleAbs(ok, ok);
  15. imshow("abs", ok);
  16. waitKey(0);
  17. return 0;
  18. }

4.Canny算子

image.png
image.png

输入必须是CV_8U(8位无符号)的单通道或三通道图像;
两个滞后阈值,最好维持在2:1到3:1 的比例;
阈值低,取到的边缘就多;阈值高,取到的边缘就少。
apertureSize:算子直径;
L2gradient:计算方法;

5.获取滤波器

getDerivKernels
image.png
kx,ky是行,列滤波器的输出尺寸,Size(ksize,1)
dx,dy是x,y方向的微分阶次;
nomalize 是 是否进行归一化操作的标准,默认不进行。
通过该函数,可以获得不同阶,不同尺寸的滤波器;