好好学习噢!
该部分主要提到的函数包括各种滤波、膨胀、腐蚀、开运算、闭运算等。
本次博文将以Lena图作为使用例子进行演示。
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') {
}
}
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') {
}
}
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') {
}
}
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') {
}
}
膨胀与服饰是相对于亮部分而言的,不是暗部分。
膨胀就是图像中的高亮部分进行膨胀,效果图拥有比原图更大的亮区域。
腐蚀就是原图中的高亮部分被腐蚀,效果图拥有比原图更小的亮区域。
调用方式如下:
// 膨胀
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') {
}
}
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') {
}
}
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') {
}
}
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') {
}
}
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') {
}
}
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') {
}
}
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') {
}
}