1.卷积概念
卷积是图像处理中的一个操作,是kernel在图像的每个像素上的操作
kernel本质上是一个固定大小的矩阵数组,其中心点成为锚点(anchor point)
把kernel放到像素数组之上,求锚点周围覆盖像素乘积之和,用来替换锚点覆盖下像素点值称为卷积处理。
卷积的作用:1.模糊图像 2.提取图像边缘 3.增强图像(图像锐化)
2. 常见算子(常见的卷积核)
1.Robert算子
Robert的X方向
+1 | 0 |
---|---|
0 | -1 |
Robert的Y方向
0 | +1 |
---|---|
-1 | 0 |
2.Sobel算子
Soble的x方向
-1 | 0 | 1 |
---|---|---|
-2 | 0 | 2 |
-1 | 0 | 1 |
Sobel的y方向
-1 | -2 | -1 |
---|---|---|
0 | 0 | 0 |
1 | 2 | 1 |
3.拉普拉斯算子(不区分x、y方向)
0 | -1 | 0 |
---|---|---|
-1 | 4 | -1 |
0 | -1 | 0 |
代码演示
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
Mat src,dst_x,dst_y,sobel_x,sobel_y,laplase,dst_selfkernel;
int main(int argc, char** argv) {
src = imread("D:/image/img1.jpg");
if (src.empty()) {
printf("image could not load...\n");
return -1;
}
char Input_Win[] = "input image";
namedWindow(Input_Win, WINDOW_AUTOSIZE);
namedWindow("Robert_x", WINDOW_AUTOSIZE);
namedWindow("Robert_y", WINDOW_AUTOSIZE);
namedWindow("Sobel_x", WINDOW_AUTOSIZE);
namedWindow("Sobel_y", WINDOW_AUTOSIZE);
namedWindow("laplase", WINDOW_AUTOSIZE);
namedWindow("selfkernel", WINDOW_AUTOSIZE);
imshow(Input_Win,src);
//Robert X方向
Mat kernel_x = (Mat_<int>(2, 2) << 1, 0, 0, -1);
filter2D(src, dst_x, -1, kernel_x, Point(-1, -1), 0.0); //-1是图像的深度,-1程序自动判断
imshow("Robert_x", dst_x);
//Robert Y方向
Mat kernel_Y = (Mat_<int>(2, 2) << 0,1,-1,0);
filter2D(src, dst_y, -1, kernel_Y, Point(-1, -1), 0.0);
imshow("Robert_y", dst_y);
//Sobel X方向
Mat Sobel_X = (Mat_<int>(3, 3) << -1,0,1,-2,0,2,-1,0,1);
filter2D(src, sobel_x, -1, Sobel_X, Point(-1, -1), 0.0);
imshow("Sobel_x", sobel_x);
//Sobel y方向
Mat Sobel_Y = (Mat_<int>(3, 3) << -1,-2,-1,0,0,0,1,2,1);
filter2D(src, dst_y, -1, Sobel_Y, Point(-1, -1), 0.0);
imshow("Sobel_y", dst_y);
//Laplase算子
Mat Laplase= (Mat_<int>(3, 3) << 0,-1,0,-1,4,-1,0,-1,0);
filter2D(src, laplase, -1, Laplase, Point(-1, -1), 0.0);
imshow("laplase", laplase);
//自定义卷积模糊(隔多长时间自己模糊一下)
int c = 0;
int index = 0;
int ksize = 3;
while (true) {
c=waitKey(50);
if ((char)c == 27) { //char 27 是键盘上的esc键
break;
}
ksize = 4 + (index % 5) * 2 + 1;
Mat SelfKernel = Mat::zeros(Size(ksize,ksize),CV_32F)/(float)(ksize*ksize);
filter2D(src, dst_selfkernel, -1, SelfKernel, Point(-1, -1));
index++;
imshow("selfkernel", dst_selfkernel);
}
waitKey(0);
return 0;
}