卷积概念
卷积是图像处理中的一个操作,是kernel在图像的每一个像素上的操作
kernel本质上是一个固定大小的矩阵数组,其中心点成为锚点(anchor point)
常见算子
Robert算子和Sobel算子为梯度算子
Robert_x
1 | 0 |
---|---|
0 | -1 |
Robert_y
0 | 1 |
---|---|
-1 | 0 |
Sobel_x
-1 | 0 | 1 |
---|---|---|
-2 | 0 | 2 |
-1 | 0 | 1 |
Sobel_y
-1 | -2 | -1 |
---|---|---|
0 | 0 | 0 |
1 | 2 | 1 |
Laplace
0 | -1 | 0 |
---|---|---|
-1 | 4 | -1 |
0 | -1 | 0 |
自定义卷积模糊
filter2D(src,
dst,
depth, //图像深度不知道一般写-1
kernel, //可以自定义的卷积核
Point, // 锚的位置-1, -1表示中心
double delta
)
代码展示
常见算子
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("F:/Opencvlearn/picture/2.jpg");
if (src.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//Robert_x
Mat Robert_x = (Mat_<int>(2, 2) << 1, 0 , 0, -1);
filter2D(src, dst, -1, Robert_x, Point(-1, -1));
namedWindow("Robert_x", WINDOW_AUTOSIZE);
imshow("Robert_x", dst);
//Robert_y
Mat Robert_y = (Mat_<int>(2, 2) << 0, 1, -1, 0);
filter2D(src, dst, -1, Robert_y, Point(-1, -1));
imshow("Robert_y", dst);
//Sobel_x
Mat Sobel_x = (Mat_<int>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);
filter2D(src, dst, -1, Sobel_x, Point(-1, -1));
imshow("Sobel_x", dst);
//Sobel_y
Mat Sobel_y = (Mat_<int>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);
filter2D(src, dst, -1, Sobel_y, Point(-1, -1));
imshow("Sobel_y", dst);
//Laplace
Mat Laplace = (Mat_<int>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);
filter2D(src, dst, -1, Laplace, Point(-1, -1));
imshow("Laplace", dst);
waitKey(0);
return 0;
}
自定义卷积
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("F:/Opencvlearn/picture/2.jpg");
if (src.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//自定义卷积
Mat kernel;
int c = 0;
int ksize = 1;
int index = 0;
char output[] = "output";
namedWindow(output, WINDOW_AUTOSIZE);
while(true)
{
c = waitKey(250);
if((char)c == 27) //char = 27 为 ESC退出
{
break;
}
ksize = 3 + (index % 5) * 2;
kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);
filter2D(src, dst, -1, kernel, Point(-1, -1));
imshow(output, dst);
++index;
}
waitKey(0);
return 0;
}