Opencv3 C++ VS2017 学习笔记 12 卷积与卷积算子

  • 卷积是一个数学概念, 在图像处理中是一个操作, 是kernel(filter,卷积核,算子)在图像的每个像素的操作

    • kernel本质是个固定大小的小型矩阵, 中心点是anchor锚点, 相当于在图片的海洋中下锚---->操作,即anchor point
      • Opencv3 C++ VS2017 学习笔记 12 卷积与卷积算子_第1张图片
    • 卷积的工作方式
      • kernel放在像素数组上, 求锚点周围覆盖像素的乘积,然后加起来,替换锚点覆盖下的像素值,即卷积处理
      • Opencv3 C++ VS2017 学习笔记 12 卷积与卷积算子_第2张图片
      • Sum = 8x1+6x1+6x1+2x1+8x1+6x1+2x1+2x1+8x1

        New pixel = sum / (m*n)

    • 卷积操作两个核心,一个是kernel的设计, 一个是算子遍历像素的方式

      • 一般的算子有一些经典的, 如:

        •  

          Opencv3 C++ VS2017 学习笔记 12 卷积与卷积算子_第3张图片 Robert算子
        • Opencv3 C++ VS2017 学习笔记 12 卷积与卷积算子_第4张图片 Sobel算子  
        • Opencv3 C++ VS2017 学习笔记 12 卷积与卷积算子_第5张图片 Laplance算子
      • 自定义算子
        • 就是创建一个小型矩阵, 之前学过可以用Mat来创建
          int main(int argc, char ** argv)
          {
          	Mat src, gray, bin, dst;
          	src = imread("C:\\Users\\xujin\\Desktop\\test1.JPG");
          	if (!src.data)
          	{
          		cout << "no image";
          		return -1;
          	}
          	namedWindow("src_image", WINDOW_AUTOSIZE);
          	imshow("src_image", src);
          	Mat dst_x, dst_y;
          	Mat dstSobel_x, dstSobel_y, dstLap;
          	src.copyTo(dst_x);
          	src.copyTo(dst_y);
          	src.copyTo(dstSobel_x);
          	src.copyTo(dstSobel_y);
          	src.copyTo(dstLap);
          	Mat kernel_x = (Mat_(2, 2) << 1, 0, 0, -1);
          	Mat kernel_y = (Mat_(2, 2) << 0,-1,-1,0);
          	Mat kernelSobel_x = (Mat_(3, 3) << -1, 0, -1, -2, 0, -2, -1, 0, -1);
          	Mat kernelSobel_y = (Mat_(3, 3) << -1,-2,-1, 0, 0, 0, 1, 2, 1);
          	Mat kernelLap = (Mat_(2, 2) << 0, -1, 0, -1, -4, -1, 0, -1, 0);
          	filter2D(src, dst_x,-1, kernel_x, Point(-1, -1));
          	filter2D(src, dst_y, -1, kernel_x, Point(-1, -1));  //filter2D()是进行2D卷积操作的函数, 卷积核是一个小型矩阵,卷积核是设计核心
          	filter2D(src, dst_y, -1, kernelSobel_x, Point(-1, -1));
          	filter2D(src, dst_y, -1, kernelSobel_y, Point(-1, -1));
          	filter2D(src, dst_y, -1, kernelLap, Point(-1, -1));
          	namedWindow("dst_x_image", WINDOW_AUTOSIZE);
          	imshow("dst_x_image", dst_x);
          	namedWindow("dst_y_image", WINDOW_AUTOSIZE);
          	imshow("dst_y_image", dst_y);
          	namedWindow("dstSobel_x_image", WINDOW_AUTOSIZE);
          	imshow("dstSobel_x_image", dstSobel_x);
          	namedWindow("dstSobel_y_image", WINDOW_AUTOSIZE);
          	imshow("dstSobel_y_image", dstSobel_y);
          	namedWindow("dstLap_image", WINDOW_AUTOSIZE);
          	imshow("dstLap_image", dstLap);
          
          
          	waitKey(0);
          	return 0;
          }
          
          • 例如Mat kernel = (Mat_(3,3)<<-1,0,-1,-2,0,2,-1,0,1);
      • 卷积操作方法
        • API: filter2D(src, dst, depth, kernel, anchor, delta);
          • 参数(原图片, 输出图片, 图片深度, 算子, 锚点, delta);

你可能感兴趣的:(Opencv3 C++ VS2017 学习笔记 12 卷积与卷积算子)