卷积得概念
-
卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。
-
Kernel本质上一个固定大小的矩阵数组,其中中心点称为
锚点(anchor point)
。
卷积如何工作
- 把kernel 放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点副高下像素点值称为卷积处理。
- 卷积作用:模糊图像,提取边缘,图像锐化
- 数学表达式:
- 常见算子:
自定义卷积模糊
filter2D方法filter2D(
Mat src,//输入图像
Mat dst,//模糊图像
int depth,//图像深度32/8
Mat kernel,//卷积核/模板
Point anchor,//锚点位置
double delta//计算出来的像素+delta)
kernel是可以自定义的卷积核
代码
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
int main(int srgc,char** argv){
Mat src,dst;
int ksize=0;
src=imread("E:/opencv/zzz/hbz.jpg");
if(!src.data){
printf("could not load image...\n");
return -1;
}
char INPUT_WIN[]="input image";
//char OUTPUT_WIN[]="Robert X";
//char OUTPUT_WIN[]="Sobel X";
char OUTPUT_WIN[]="Custom Blur Filter Result";
namedWindow(INPUT_WIN,CV_WINDOW_AUTOSIZE);
//namedWindow(OUTPUT_WIN,CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN,src);
/*
//x方向
//Robert X 方向
Mat kernel_x=(Mat_<int>(2,2)<<1,0,0,-1);
filter2D(src,dst,-1,kernel_x,Point(-1,-1),0.0);
//Robert Y 方向
Mat ying;
Mat kernel_y=(Mat_<int>(2,2)<<0,1,-1,0);
filter2D(src,ying,-1,kernel_y,Point(-1,1),0.0);*/
//Sobel X 方向
/*
Mat kernel_x=(Mat_<int>(3,3)<<-1,0,1,-2,0,2,-1,0,1);
filter2D(src,dst,-1,kernel_x,Point(-1,-1),0.0);
//Sobel Y 方向
Mat ying;
Mat kernel_y=(Mat_<int>(3,3)<<-1,-2,-1,0,0,0,1,2,1);
filter2D(src,ying,-1,kernel_y,Point(-1,1),0.0);*/
//拉普拉斯算子
/*
Mat kernel_y=(Mat_<int>(3,3)<<0,-1,0,-1,4,-1,0,-1,0);
filter2D(src,dst,-1,kernel_y,Point(-1,1),0.0);*/
int c=0;
int index=0;
while(true){
waitKey(500);
if((char)c==27){//ESC
break;
}
ksize= (index%8)*2+1;
Mat kernel=Mat::ones(Size(ksize,ksize),CV_32F)/(float)(ksize*ksize);
filter2D(src,dst,-1,kernel,Point(-1,-1));
index++;
imshow(OUTPUT_WIN,dst);
}
//imshow(OUTPUT_WIN,dst);
//imshow("Robert Y",dst);
//waitKey(0);
return 0;
}
笔记来源此教程的记录:https://www.bilibili.com/video/BV1Q54y1z7kz?p=16