Opencv的使用小教程2——Opencv常用图像处理函数汇总

    1、blur
     2、GaussianBlur
     3、medianBlur
     4、bilateralFilter
     5、腐蚀和膨胀
     6、morphologyEx高级形态学变换
     7、convertScaleAbs图像增强
     8、Sobel
     9、Laplacian
     10、Scharr
     11、Canny

好好学习噢!
在这里插入图片描述
该部分主要提到的函数包括各种滤波、膨胀、腐蚀、开运算、闭运算等。
本次博文将以Lena图作为使用例子进行演示。

在这里插入图片描述

1、blur

blur用于图像的均值滤波,调用方式如下:

blur(src, dst, Size(3, 3));

其中,src为源图,dst为目标图,Size(3, 3)表示每个滤波器窗口的大小。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src);
	Mat dst;
	blur(src, dst, Size(3, 3));
	imshow("blur", dst);
	imwrite("after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:

在这里插入图片描述

2、GaussianBlur

GaussianBlur用于图像的高斯滤波,调用方式如下:

GaussianBlur(src, dst, Size(5, 5), 3, 3);

其中,src为源图,dst为目标图,Size(5, 5)表示每个滤波器窗口的大小。两个3分别代表X方向和Y方向的标准差。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src);
	Mat dst;
	GaussianBlur(src, dst, Size(5, 5), 3, 3);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:

在这里插入图片描述

3、medianBlur

medianBlur用于图像的中值滤波,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法对于脉冲噪声、椒盐噪声效果良好。调用方式如下:

medianBlur(src, dst, ksize);

其中,src为源图,dst为目标图,ksize是滤波模板的尺寸大小,必须是大于1的奇数。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src);
	Mat dst;
	int ksize = 5;
	medianBlur(src, dst, ksize);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:

在这里插入图片描述

4、bilateralFilter

bilateralFilter用于图像的双边滤波,双边滤波器可以很好的边缘保护,即可以在去噪的同时,保护图像的边缘特性,调用方式如下:

bilateralFilter(src, dst, d, sigmaColor, sigmaSpace);

其中:
src为源图;
dst为目标图;
d为过滤过程中每个像素邻域的直径范围;
double sigmaColor:颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
double sigmaSpace:坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src); 
	Mat dst;
	int d = 50;
	int sigmaColor = 50;
	int sigmaSpace = 50;
	bilateralFilter(src, dst, d, sigmaColor, sigmaSpace);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为(磨皮了):
在这里插入图片描述

5、腐蚀和膨胀

膨胀与腐蚀是相对于亮部分而言的,不是暗部分。
膨胀就是图像中的高亮部分进行膨胀,效果图拥有比原图更大的亮区域。
腐蚀就是原图中的高亮部分被腐蚀,效果图拥有比原图更小的亮区域。
调用方式如下:

// 膨胀
dilate(src, dst, erodeStruct);
// 腐蚀
erode(src, dst, erodeStruct);

其中,src为源图,dst为目标图,erodeStruct是用于膨胀操作和腐蚀操作的结构元素,越大则膨胀与腐蚀的效果越明显。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src); 
	Mat dst;
	Mat erodeStruct = getStructuringElement(MORPH_RECT, Size(5, 5));
	erode(src, dst, erodeStruct);
	//dilate(src, dst, erodeStruct);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用效果如下:(第一张为膨胀,第二张为腐蚀)
在这里插入图片描述

在这里插入图片描述

6、morphologyEx高级形态学变换

morphologyEx用于完成高级形态学变换,所谓高级形态学变换相当于一些比较简单的形态学变换的结合。
常见的高级形态学变换方式如下:
1、开运算:腐蚀->膨胀,其主要作用为去除图像中较小区域
2、闭运算:膨胀->腐蚀,可以去除掉小型黑洞
3、顶帽:原图-开运算,用于突出比原图轮廓周围的区域更明亮的区域,用来分离比临近点亮一些的斑块
4、黑帽:闭运算-原图,用于突出比原图轮廓周围的区域更暗的区域,用来分离比临近点暗一些的斑块
5、形态学梯度:膨胀-腐蚀,对二值图操作可以将团块的边缘突出,用来保留物体的边缘轮廓。
调用方式如下:

// 以形态学梯度为例,调用方式如下
morphologyEx(src, dst, MORPH_GRADIENT,erodeStruct);

其中,src为源图,dst为目标图,erodeStruct是结构元素,越大则处理的效果越明显,第三个参数为表示使用的高级形态学变换是什么,可选择的参数如下:
MORPH_OPEN 开运算
MORPH_CLOSE 闭运算
MORPH_GRADIENT 形态学梯度
MORPH_TOPHAT 顶帽
MORPH_BLACKHAT 黑帽
MORPH_ERODE 腐蚀
MORPH_DILATE 膨胀
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src); 
	Mat dst;
	Mat erodeStruct = getStructuringElement(MORPH_RECT, Size(3, 3));
	morphologyEx(src, dst, MORPH_GRADIENT,erodeStruct);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用效果如下:
在这里插入图片描述

7、convertScaleAbs图像增强

convertScaleAbs可以用于快速的图像增强,可以为图片中的每个点进行线性运算。
调用方式如下:

convertScaleAbs(src, dst, theta, b);

其中,src为源图,dst为目标图,图片中所有点的值都会*theta+b。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src); 
	Mat dst;
	double theta = 1.5;
	double b = 10;
	convertScaleAbs(src, dst, theta, b);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:
在这里插入图片描述

8、Sobel

Sobel算子是像素图像边缘检测中最重要的算子之一,具有非常重要的作用。
调用方式如下:

Sobel(src,dst,CV_16U, 1, 1, 5);

其中,src为源图,dst为目标图
第三个参数为输出图像的深度,可选参数为:CV_8U,CV_16U,CV_16S,CV_32F,CV_64F,其选择结果根据输入图像决定,在不确定的情况下可以使用-1。
第四个和第五个参数可以取0或者1,代表x方向和y方向上的差分阶数,0代表该方向不取。
第六个参数为ksize的大小,表示sobel器的大小。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src); 
	Mat dst;
	cvtColor(src, src, COLOR_RGB2GRAY);
	GaussianBlur(src, src, Size(3, 3),0.5, 0.5);
	Sobel(src, dst, CV_16U, 1, 1, 5);
	convertScaleAbs(dst, dst);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:
在这里插入图片描述

9、Laplacian

Laplacian算子是像素图像边缘检测中最重要的算子之一,具有非常重要的作用。
调用方式如下:

Laplacian(src, dst, CV_16U, 3);

其中,src为源图,dst为目标图
第三个参数为输出图像的深度,可选参数为:CV_8U,CV_16U,CV_16S,CV_32F,CV_64F,其选择结果根据输入图像决定,在不确定的情况下可以使用-1。
第四个参数为ksize的大小,表示Laplacian器的大小。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src); 
	Mat dst;
	cvtColor(src, src, COLOR_RGB2GRAY);
	GaussianBlur(src, src, Size(3, 3),1, 1);
	Laplacian(src, dst, CV_16U, 3);
	convertScaleAbs(dst, dst);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:
在这里插入图片描述

10、Scharr

Scharr算子也是一种常见的边缘检测算子,与sobel的参数类似,但是仅作用于大小为3的内核,同时。
调用方式如下:

Scharr(src, dst, CV_16U, 1, 0);
//或者
Scharr(src, dst, CV_16U, 0, 1);

其中,src为源图,dst为目标图
第三个参数为输出图像的深度,可选参数为:CV_8U,CV_16U,CV_16S,CV_32F,CV_64F,其选择结果根据输入图像决定,在不确定的情况下可以使用-1。
第四个和第五个参数可以取0或者1,代表x方向和y方向上的差分阶数,0代表该方向不取。Scharr不可以同时取1。
具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src);
	Mat dst;
	cvtColor(src, src, COLOR_RGB2GRAY);
	GaussianBlur(src, src, Size(3, 3), 0.5, 0.5);
	Scharr(src, dst, CV_16U, 1, 0);
	convertScaleAbs(dst, dst);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:
在这里插入图片描述

11、Canny

Canny算法就是首先对图像选择一定的Gauss滤波器进行平滑滤波,然后采用非极值抑制技术进行处理得到最后的边缘图像。
调用方式如下:

Canny(src, dst, 50, 150, 3);

其中,src为源图,dst为目标图。
第三个参数为低阈值,值越大,找到的边缘越少。
第四个参数为高阈值,值越大,找到的边缘越少。
第五个参数为Canny算子的大小。

具体应用方式如下:

int main() {
	Mat src = imread("./Lena.jpg");
	imshow("before", src);
	Mat dst;
	cvtColor(src, src, COLOR_RGB2GRAY);
	GaussianBlur(src, src, Size(3, 3), 0.5, 0.5);
	Canny(src, dst, 50, 150, 3);
	convertScaleAbs(dst, dst);
	imshow("blur", dst);
	imwrite("./after.jpg", dst);
	while (waitKey(1) != '1') {}
}

应用结果为:
在这里插入图片描述

posted @ 2021-12-13 09:53  wuyuan2011woaini  阅读(149)  评论(0编辑  收藏  举报