opencv学习十六---自定义线性滤波

博客介绍了OpenCV中卷积操作,其主要用于模糊图像、提取边缘和增强图像。卷积是kernel在图像像素上的操作,kernel是固定大小矩阵数组。还介绍了相关API,如用小矩阵定义Mat对象、filter2D等,最后进行了代码演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卷积

  • 应用:主要用于模糊图像(降噪),提取边缘,增强图像
  • 卷积是图像处理中的一个操作,是kernel在图像的每个像素上的操作
  • kernel本质上是一个固定大小的矩阵数组,其中心点成为锚点(anchor point)

卷积算子(掩模)

在这里插入图片描述

API

用小矩阵定义一个Mat对象

Mat kernel =(Mat<type>(row,column)<< , , , , , , );

例如

Mat kernel = (Mat_<int>(2, 2) << 1, 0, 0, -1);

filter2D

定义

filter2D( InputArray src, OutputArray dst, int depth,
          InputArray kernel, Point anchor=Point(-1,-1),
          double delta=0, int borderType=BORDER_DEFAULT );

例如

filter2D(src, dst, -1, kernel, Point(-1, -1));

参数:depth一般取-1

matlab风格的创建对象的方法:zeros,ones

Mat z =Mat::zeros(2,2, CV_8UC1);
Mat o =Mat::ones(2,2 ,CV_32F);

zero:像素值全为0,定义一张全黑的图片
ones:像素值全为1

代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv)
{
 Mat src, dst, robert_x, robert_y, sobel_x, sobel_y, laplace,blur;
 src = imread("D:/vcprojects/shuanggaosi.jpg");
 if (!src.data)
 {
  printf("could not laod image...\n");
  return -1;
 }
  namedWindow("src", WINDOW_AUTOSIZE);
 imshow("src", src);
 //Robert算子x方向
 Mat kernel = (Mat_<int>(2, 2) << 1, 0, 0, -1);
 filter2D(src, robert_x, -1, kernel, Point(-1, -1));
 namedWindow("robert_x result", WINDOW_AUTOSIZE);
 imshow("robert_x result", robert_x);
 //Robert算子y方向
 Mat kernel2 = (Mat_<int>(2, 2) << 0,1,-1,0);
 filter2D(src, robert_y, -1, kernel2, Point(-1, -1));
 namedWindow("robert_y result", WINDOW_AUTOSIZE);
 imshow("robert_y result", robert_y);
  //sobel算子x方向
 Mat kernel3 = (Mat_<int>(3,3) << -1,0,1,-2,0,2,-1,0,1);
 filter2D(src, sobel_x, -1, kernel3, Point(-1, -1));
 namedWindow("sobel_x result", WINDOW_AUTOSIZE);
 imshow("sobel_x result", sobel_x);
 //sobel算子y方向
 Mat kernel4 = (Mat_<int>(3, 3) << -1,-2,-1,0,0,0,1,2,1);
 filter2D(src, sobel_y, -1, kernel4, Point(-1, -1));
 namedWindow("sobel_y result", WINDOW_AUTOSIZE);
 imshow("sobel_y result", sobel_y);
  //拉普拉斯算子
 Mat kernel5 = (Mat_<int>(3, 3) << 0,-1,0,-1,4,-1,0,-1,0);
 filter2D(src, laplace, -1, kernel5, Point(-1, -1));
 namedWindow("laplace result", WINDOW_AUTOSIZE);
 imshow("laplace result", laplace);
 //自定义线性滤波
 int c = 0;
 int ksize = 0;
 int index = 0;
 while (true)
 {
  c = waitKey(500);
  if (char(c) == 27)//27是键盘上ESC键
   break;
  ksize = (index % 4) * 2 + 3;
  index++;
  Mat kernel6 = Mat::ones(ksize, ksize, CV_32F)/(float)(ksize*ksize);
  filter2D(src, blur, -1, kernel6, Point(-1, -1));
  namedWindow("blur result", WINDOW_AUTOSIZE);
  imshow("blur result", blur);
 } 
 waitKey(0);
 return 0;
}

结果
原图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
是一个动态的模糊过程
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值