OpenCV:06.中值滤波、腐蚀、膨胀、实现图片的美容效果-双边滤波

1. 中值滤波与双边滤波

  • medianBlur 中值 对所有考虑点进行排序,取中间的那个值(替换到矩阵的中心点) 1,2,”3”,4,5 去掉噪音(很多 黑白点的情况)
  • bilateralFilter 双边 可以用作美容 ,基于高斯,高斯保留的轮廓并不强,双边保留的轮廓信息会增强,基于高斯再增加像素差

使用到的 api

1
2
3
4
5
6
// @params d : 滤波过程中使用的每个像素邻域的直径。如果它是非正的,它是由sigmaSpace计算的。
// @param sigmaColor : 滤色空间中的。参数的值越大意味着,像素附近的更远的颜色(参见sigmaSpace)将被混合在一起,得到结果 在更大的区域半相等的颜色。
// @param sigmaSpace: 在坐标空间中过滤。参数的值越大意味着距离较远的像素会相互影响,只要它们的颜色足够接近(参见sigmaColor))。当d > 0时,它指定邻域大小,而与sigmaSpace无关。否则,d是与sigmaSpace成正比。
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int main(){
Mat src = imread("E:/copy.png");

if (!src.data){
cout << "src read error" << endl;
return -1;
}
imshow("src", src);

Mat dst;
blur(src, dst, Size(15, 15));

中值滤波 对所有考虑点进行排序,取中间的那个值 1,2,“3”,4,5 去掉噪音
medianBlur(src, dst,5);

双边滤波 可以用作美容 ,基于高斯,高斯保留的轮廓并不强,双边保留的轮廓信息会增强,基于高斯再增加像素差
bilateralFilter(src,dst,15,100,5);

imshow("dst", dst);

掩膜操作
Mat final;
Mat kernal = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(dst,final,dst.depth(),kernal);
imshow("final",final);

waitKey(0);
return 0;
}

2. 腐蚀与膨胀

数学形态学,与卷积操作类似,用的矩形 (E 求和),用的是任意形状,矩形,十字形,椭圆形,等等 最大值,最小值,中值,最大值-最小值

膨胀定义:
  膨胀—-图像膨胀的过程类似于一个卷积的过程,假设有图像矩阵A以及结构元素B(注意,B的形状、尺寸没有限制),B在A矩阵上依次移动,每个位置上B所覆盖元素的最大值替换B的中心位置值(即锚点处),即为膨胀的过程。

腐蚀定义:
腐蚀—-图像膨胀的过程类似于一个卷积的过程,假设有图像矩阵A以及结构元素B(注意,B的形状、尺寸没有限制),B在A矩阵上依次移动,每个位置上B所覆盖元素的最小值替换B的中心位置值(即锚点处),即为腐蚀的过程。

  • erode 腐蚀 ,最小值(去白点)
  • dilate 膨胀 , 最大值(去黑点)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

int element_size = 1;
int max_size = 21;

// 膨胀与腐蚀,处理黑白图片
void trackbarCallback(int pos, void *userdata){
int size = element_size * 2 + 1;
// 创建一个 kernel
Mat kernel = getStructuringElement(MORPH_RECT, Size(size, size));
Mat dst;

//膨胀 , 最大值(去黑点)
dilate(src, dst, kernel);
// 腐蚀 ,最小值 (去白点)
// erode(src,dst,kernel);
imshow("output image", dst);
}


int main(){
src = imread("E:/copy.png");

if (!src.data){
cout << "src read error" << endl;
return -1;
}
imshow("src", src);

// 创建一个 window
namedWindow("output image");

// 动态控制
createTrackbar("Trackbar","output image",&element_size,max_size,trackbarCallback);


waitKey(0);
return 0;
}
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%