卷积概念

  • 卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。
  • Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)
  • 卷积的作用:模糊图像提取边缘进行图像的锐化

卷积如何工作

  • 把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。数学表达如下:

常见算子

  • Robert算子:也可以用来寻找梯度,寻找边缘 主对角线与副对角线上的梯度
  • Sobel算子 :也可以用来寻找梯度,寻找边缘 水平与垂直方向的梯度
  • 拉普拉斯算子: 用来寻找梯度,寻找边缘 整个的梯度,整体轮廓

自定义卷积模糊

filter2D方法filter2D(
Mat src, //输入图像
Mat dst, // 模糊图像(目标图像)
int depth, // dst图像深度32/8,负值(例如-1)表示深度与源相同
Mat kernel, // 卷积核/模板,要通过映像扫描的内核
Point anchor, // 锚点相对于其内核的位置。 位置Point(-1,-1)默认表示中心。
double delta, // 计算出来的像素+delta,卷积过程中要添加到每个像素的值。 默认情况下为0
int borderType //BORDER_DEFAULT:我们默认使用此值
)

其中 kernel是可以自定义的卷积核


来自:https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga27c049795ce870216ddfb366086b5a04

代码示例

#include<opencv2/opencv.hpp>
#include<iostream>using namespace cv;void customFilter();
int main(){Mat src,dst1, dst2, dst3, dst4, dst5, dst6;src = imread("E:/Experiment/OpenCV/Pictures/girl2.jpg");if(src.empty()){printf("could not load image...");return -1;}namedWindow("output windows",CV_WINDOW_AUTOSIZE);imshow("output windows",src);//显示图片//图像在主对角线(x)方向的差异得到了明显的体现,这些差异就像图像的边缘一样Mat robertX = (Mat_<int>(2, 2) << 1, 0, 0, -1);//robert x方向 算子  前两个参数表示卷积的第一行filter2D(src, dst1, -1, robertX, Point(-1, -1), 0.0);//计算卷积和,参数delta 表示计算出来的像素+deltaimshow("robertX", dst1);//图像在副对角线(y)方向的差异得到了明显的体现,将这两个x y方向的图像合起来,就能得到图像的轮廓Mat robertY = (Mat_<int>(2, 2) << 0, 1, -1, 0);//robert y方向 算子filter2D(src, dst2, -1, robertY, Point(-1, -1), 0.0);imshow("robertY", dst2);//图像在左右(x)方向的差异得到了明显的体现,由于是 -2 2 ,所以sobel比robert算子差异体现的更大Mat sobelX = (Mat_<int>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);//sobel x方向 算子filter2D(src, dst3, -1, sobelX, Point(-1, -1), 0.0);imshow("sobelX", dst3);//图像在上下(y)方向的差异得到了明显的体现Mat sobelY = (Mat_<int>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);//sobel y方向 算子filter2D(src, dst4, -1, sobelY, Point(-1, -1), 0.0);imshow("sobelY", dst4);//图像整体上的差异得到了明显的体现Mat lapulasi = (Mat_<int>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);//拉普拉斯 算子filter2D(src, dst5, -1, lapulasi, Point(-1, -1), 0.0);imshow("lapulasi", dst5);//图像锐化,仅仅只是将拉普拉斯算子的中心点 由4改成5,卷积后的图像结果差距巨大。Mat ruihua = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//锐化 算子 (掩膜)filter2D(src, dst6, -1, ruihua, Point(-1, -1), 0.0);imshow("ruihua", dst6);customFilter();waitKey(0);
}void customFilter()//自定义线性滤波
{Mat src, dst;src = imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");int ksize = 0;int index = 0;while (true){if (waitKey(500) == 27) break; // Esc键ksize = 4 + (index % 8) * 2 + 1;// Mat::ones 创建的矩阵值初始值为1 ,重载的运算符 / 表示将每个初始值再除以 ksize * ksizeMat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);filter2D(src, dst, -1, kernel);index++;imshow("Custom Filter", dst);}
}

运行截图

参考博客

  1. https://blog.csdn.net/LYKymy/article/details/83154551
  2. https://blog.csdn.net/huanghuangjin/article/details/81130171

OpenCV-图像处理(15、自定义线性滤波)相关推荐

  1. OpenCV图像处理视频教程——入门篇(二)

    文章目录 10 膨胀与腐蚀 (1)形态学操作(morphology operators)--膨胀.腐蚀 (2)相关API (3)动态调整结构元素大小TrackBar 11 形态学操作 (1)开操作- ...

  2. 2020.11.05 使用OpenCV进行自定义线性滤波 【OpenCV C++ Robert/Sobel/Laplace】

    使用OpenCV进行自定义线性滤波/Robert/Sobel/Laplace 源代码: // testOpencv14.cpp : 此文件包含 "main" 函数.程序执行将在此处 ...

  3. 数字图像处理(15): 灰度直方图(matplotlib 和OpenCV 绘制直方图)

    目录 1 灰度直方图简介 1.1 灰度直方图概念 1.2 灰度直方图作用 1.3 绘制的直方图 1.4 归一化直方图 2 matplotlib库 绘制直方图-hist() 3 OpenCV库 绘制直方 ...

  4. OpenCV图像处理基础(C++版)

    目录 OpenCV环境搭建 加载 修改 保存图像 矩阵的掩膜操作 Mat对象 图像操作 图像混合 调整图像亮度与对比度 绘制形状与文字 模糊图像一 模糊图像二 膨胀与腐蚀 形态学操作 形态学操作应用- ...

  5. opencv图像处理总结

    opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整 ...

  6. 基于Tensorflow + Opencv 实现CNN自定义图像分类

    摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验. 本文分享自华为云社区< ...

  7. Opencv图像处理——水平线和垂直线的提取

    Opencv图像处理--水平线和垂直线的提取 检测原理 图像形态学操作,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感.另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出. ...

  8. Java OpenCV-4.0.0 图像处理11 自定义图像滤波(降噪) 算子

    @[TOC](Java OpenCV-4.0.0 图像处理11 自定义图像滤波(降噪) 算子) Java OpenCV-4.0.0 自定义图像线性滤波(降噪) package com.xu.image ...

  9. OPENCV图像处理基础

    OPENCV图像处理基础 1.图像处理基础 1.1 数字图像 1.1.1 数字图像概念: 1.1.2 数字图像起源: 1.1.3 常见成像方式: 1.1.4 数字图像的应用: 1.1.5 Opencv ...

  10. 210322阶段三QT事件循环及opencv图像处理

    目录 一.学习的知识点 1.QT事件循环机制 1.1QT是事件驱动的.QT将系统产生的信号(软件中断)转换成QT事件,并且将事件封装成类,所有的事件类都是QEvent派生的,事件的产生和处理就是QT程 ...

最新文章

  1. elasticdump安装_elasticdump备份及恢复es数据
  2. 从零开始学OpenDaylight(碳版本)之三:Hello示例
  3. 三层架构和MVC一样吗?(区别)
  4. 计算机软考网络工程师历年真题,计算机软考《网络工程师》考试历年真题精选(1)...
  5. 2019下半年系统集成项目管理工程师下午真题
  6. MySQL之mysqldump的使用
  7. android框架连接mysql_三层架构 android访问MSSQL数据库 程序 (服务器端)
  8. tcp/ip发送接收总体框架
  9. 微星主板jsp1接线图_微星主板JSP11接口可制作双BIOS
  10. Mergely – 免费的在线文本对比
  11. 多目标优化_学习笔记(三)MOEA/D
  12. Premiere银色金属玻璃质感logo标志片头AE模板mogrt
  13. android支持wifi11ad,WiFi“千兆”必杀,802.11ax/802.11ad标准探秘
  14. LeetCode第 252 场周赛 之5187. 收集足够苹果的最小花园周长
  15. Mysql 常用函数(30)- month 函数
  16. 励志:滴滴打车CTO张博:生死战役,技术和时间赛跑
  17. 33-Jenkins-修改插件源
  18. 用ESP8266连接 0.96寸 OLED屏幕
  19. 移动联通设置呼叫转移
  20. 我是一个将近30岁的女程序员

热门文章

  1. 关于Adaper的相关用法
  2. MySql存储过程的操作
  3. Centos5.5服务器ROOT密码破解
  4. 【JavaEE】第零章(2020.03.06)模式 表 索引
  5. python调用adb shell命令_python(或BAT脚本)自动执行adb shell以后的命令
  6. flowable 控制台打印 sql 语句
  7. 快速失败(fail-fast)和安全失败(fail-safe)的区别
  8. markdown 文档转 word
  9. c++ string split_闲话Python之砍瓜切菜split()
  10. arch linux 安装 键盘,Arch Linux安装