|
卷积概念
常见算子
自定义卷积模糊

卷积概念
卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。
Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)
卷积如何工作
把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。数学表达如下:
Sum = 8x1+6x1+6x1+2x1+8x1+6x1+2x1+2x1+8x1
New pixel = sum / (m*n)

卷积核 也称算子
常见算子:

Robert算子:

Sobel算子:

拉普拉斯算子:
[C++] 纯文本查看 复制代码 /*
注意:
常见算子的应用
filter2D方法filter2D(
Mat src, //输入图像
Mat dst, // 模糊图像
int depth, // 图像深度32/8
Mat kernel, // 卷积核/模板
Point anchor, // 锚点位置
double delta // 计算出来的像素+delta
)
其中 kernel是可以自定义的卷积核
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/IDE/opencv-3.1.0/demo.jpg");
if (!src.data) {
printf("加载图片异常\n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
//Robert算子演示---------------------------------------
//定义Robert算子_X方向
Mat kernel_x = (Mat_<int>(2, 2) <<
1, 0,
0, -1);
//定义Robert算子_Y方向
Mat kernel_y = (Mat_<int>(2, 2) <<
0, 1,
-1, 0);
//掩模卷积计算
filter2D(src, dst, -1, kernel_x, Point(-1, -1),0.0);
imshow("Robert算子_x", dst);
filter2D(src, dst, -1, kernel_y, Point(-1, -1), 0.0);
imshow("Robert算子_y", dst);
//Sobel算子演示---------------------------------------
kernel_x = (Mat_<int>(3, 3) <<
-1,0,1,
-2,0,2,
-1,0,1
);
kernel_x = (Mat_<int>(3, 3) <<
-1,-2,-1,
0,0,0,
1,2,1
);
filter2D(src, dst, -1, kernel_x, Point(-1, -1), 0.0);
imshow("Sobel算子_x", dst);
filter2D(src, dst, -1, kernel_y, Point(-1, -1), 0.0);
imshow("Sobel算子_y", dst);
//拉普拉斯算子演示---------------------------------------
Mat kernel = (Mat_<int>(3, 3) <<
0,-1,0,
-1,4,-1,
0,-1,0
);
filter2D(src, dst, -1, kernel, Point(-1, -1), 0.0);
imshow("拉普拉斯算子_x", dst);
waitKey(0);
return 0;
}
[C++] 纯文本查看 复制代码 /*
注意:
程序自动循环_模糊的案列:
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/IDE/opencv-3.1.0/demo.jpg");
if (!src.data) {
printf("加载图片异常\n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
int c = 0;
int index = 0;
int ksize = 3;
while (true)
{
c = waitKey(100);
//如果按下ESC键 退出循环
if ((char)c==27)
{
break;
}
ksize = 4 + (index % 10) * 2 + 1;
Mat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);
filter2D(src, dst, -1, kernel, Point(-1, -1 ));
index++;
imshow("程序循环_模糊", dst);
}
waitKey(0);
return 0;
}
|
|