理解图像卷积操作的意义

2023-10-27

参考:http://blog.csdn.net/chaipp0607/article/details/72236892?locationNum=9&fps=1

2017-05-16 22:40  4759人阅读  评论(8)  收藏  举报
  分类:

版权声明:本文为博主原创文章,转载请注明出处。

目录(?)[+]

在图像处理领域,我们经常能听到滤波,卷积之类的词,其实他们都可以看做一种图像的卷积操作,相对应的卷积核,卷积模板,滤波器,滤波模板,扫描窗其实也都是同一个东西。下面我们进一步讨论图像中的卷积操作核卷积的意义。

数字信号处理中卷积

卷积一词最开始出现在信号与线性系统中,信号与线性系统中讨论的就是信号经过一个线性系统以后发生的变化。由于现实情况中常常是一个信号前一时刻的输出影响着这一时刻的输出,所在一般利用系统的单位响应与系统的输入求卷积,以求得系统的输出信号(当然要求这个系统是线性时不变的)。 
卷积的定义: 
卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列x(n)和h(n),则卷积的结果: 
这里写图片描述

数字图像处理中卷积

数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。 
这里写图片描述 
这张图可以清晰的表征出整个卷积过程中一次相乘后相加的结果:该图片选用3*3的卷积核,卷积核内共有九个数值,所以图片右上角公式中一共有九行,而每一行都是图像像素值与卷积核上数值相乘,最终结果-8代替了原图像中对应位置处的1。这样沿着图片一步长为1滑动,每一个滑动后都一次相乘再相加的工作,我们就可以得到最终的输出结果。除此之外,卷积核的选择有一些规则: 
1)卷积核的大小一般是奇数,这样的话它是按照中间的像素点中心对称的,所以卷积核一般都是3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。 
2)卷积核所有的元素之和一般要等于1,这是为了原始图像的能量(亮度)守恒。其实也有卷积核元素相加不为1的情况,下面就会说到。 
3)如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。 
4)对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。

边界补充问题

上面的图片说明了图像的卷积操作,但是他也反映出一个问题,如上图,原始图片尺寸为7*7,卷积核的大小为3*3,当卷积核沿着图片滑动后只能滑动出一个5*5的图片出来,这就造成了卷积后的图片和卷积前的图片尺寸不一致,这显然不是我们想要的结果,所以为了避免这种情况,需要先对原始图片做边界填充处理。在上面的情况中,我们需要先把原始图像填充为9*9的尺寸。 
常用的区域填充方法包括: 
图是我在word里面画的,所以有很多回车键哈,有些简陋,大家凑合看吧,意思还是对的,也是为了画图方便,这里就不用5*5的尺寸了,用3*3定义原始图像的尺寸,补充为9*9的尺寸,图片上的颜色只为方便观看,并没有任何其他含义。 
原始图像: 
这里写图片描述 
(1)补零 
这里写图片描述 
(2)边界复制 
这里写图片描述 
(3)镜像 
这里写图片描述 
(4)块复制 
这里写图片描述

以上四种边界补充方法通过看名字和图片就能理解了,不在多做解释。

不同卷积核下卷积意义

我们经常能看到的,平滑,模糊,去燥,锐化,边缘提取等等工作,其实都可以通过卷积操作来完成,下面我们一一举例说明一下: 
(1)一个没有任何作用的卷积核: 
这里写图片描述 
将原像素中间像素值乘1,其余全部乘0,显然像素值不会发生任何变化。 
(2)平滑均值滤波: 
选择卷积核: 
这里写图片描述 
该卷积核的作用在于取九个值的平均值代替中间像素值,所以起到的平滑的效果: 
这里写图片描述 
这里写图片描述 
(3)高斯平滑: 
卷积核: 
这里写图片描述 
高斯平滑水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重,相比于均值滤波而言,有着更好的平滑效果。 
这里写图片描述 
(4)图像锐化: 
卷积核: 
这里写图片描述 
该卷积利用的其实是图像中的边缘信息有着比周围像素更高的对比度,而经过卷积之后进一步增强了这种对比度,从而使图像显得棱角分明、画面清晰,起到锐化图像的效果。 
这里写图片描述 
除了上述卷积核,边缘锐化还可以选择: 
这里写图片描述 
(5)梯度Prewitt: 
水平梯度: 
这里写图片描述 
这里写图片描述 
垂直梯度: 
这里写图片描述 
这里写图片描述

梯度Prewitt卷积核与Soble卷积核的选定是类似的,都是对水平边缘或垂直边缘有比较好的检测效果。

(6)Soble边缘检测: 
Soble与上述卷积核不同之处在于,Soble更强调了和边缘相邻的像素点对边缘的影响。 
水平梯度: 
这里写图片描述 
这里写图片描述 
垂直梯度: 
这里写图片描述 
这里写图片描述

以上的水平边缘与垂直边缘检测问题可以参考:Soble算子水平和垂直方向导数问题

(7)梯度Laplacian:

卷积核: 
这里写图片描述

这里写图片描述

Laplacian也是一种锐化方法,同时也可以做边缘检测,而且边缘检测的应用中并不局限于水平方向或垂直方向,这是Laplacian与soble的区别。下面这张图可以很好的表征出二者的区别:来源于OpenCV官方文档 
这里写图片描述

代码实现

可以利用OpenCV提供的filter2D函数完成对图像进行卷积操作,其函数接口为:

CV_EXPORTS_W void filter2D(
InputArray src, 
OutputArray dst, 
int ddepth,
InputArray kernel, 
Point anchor=Point(-1,-1),
double delta=0, 
int borderType=BORDER_DEFAULT );
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

第一个参数: 输入图像 
第二个参数: 输出图像,和输入图像具有相同的尺寸和通道数量 
第三个参数: 目标图像深度,输入值为-1时,目标图像和原图像深度保持一致。 
第四个参数: 卷积核,是一个矩阵 
第五个参数:内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。 
第五个参数: 在储存目标图像前可选的添加到像素的值,默认值为0 
第六个参数: 像素向外逼近的方法,默认值是BORDER_DEFAULT。

#include <iostream>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace  cv;

int main()
{
    Mat srcImage = imread("1.jpg");
    namedWindow("srcImage", WINDOW_AUTOSIZE);
    imshow("原图", srcImage);
    Mat kernel = (Mat_<double>(3,3) << 
        -1, 0 ,1,
        -2, 0, 2,
        -1, 0, 1);
    Mat dstImage;
    filter2D(srcImage,dstImage,srcImage.depth(),kernel);
    namedWindow("dstImage",WINDOW_AUTOSIZE);
    imshow("卷积图",dstImage);
    waitKey(0);
    return 0;
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

所以代码的实现就非常简单了,不同的卷积操作只需要改变卷积核kernel 即可。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解图像卷积操作的意义 的相关文章

  • CSS hover 不生效的原因

    遇到hover不生效的情况可以检查以下方面 1 代码中类名是否写正确 这是最基础的情况 有时候会因为粗心或者代码量过多导致敲错类名或者引用错误类名 2 检查hover控制的层级关系是否正确 通常来讲如果直接通过 hover 类名的方式来控制

随机推荐

  • 关于EMMC和SD卡-设备驱动(1)

    eMMC和SD卡都是将闪存控制器和NAND Flash封装在一起 只是接口不同 eMMC一般是BGA封装 焊接在PCB上 SD卡单独封装 使用SDIO接口通讯 origin http blog csdn net Do or Die arti
  • 线程面试题之一:父子线程的同步

    子线程循环 10 次 接着主线程循环 100 次 接着又回到子线程循环 10 次 接着再回到主线程又循环 100 次 如此循环50次 试写出代码 注 在写本篇学习笔记时 本人学习和参考了网络文章 并做了借鉴 感谢各位前辈的分享 如果本文对您
  • ROS架构(一)——ROS架构设计

    ROS架构 一 ROS架构设计 目录 1 OS层 2 中间层 3 应用层 ROS架构 可以将其分为三个层次 OS层 中间层和应用层 1 OS层 众所周知 ROS并不是一个传统意义的操作系统 不能像Windows Linux那样直接运行在计算
  • 技术岗面试常见问题(更新中)

    这篇总结会不断更新 内容大致包括几方面 数据库 C C HTML 操作系统 计算机网络 文中题目转载汇集自各论坛大佬的总结和详解 目录 数据库 1 事务四大特性 2 事务并发带来的问题 3 事务的隔离级别 4 常见系统的默认隔离级别 5 聚
  • Prometheus 监控 Java 应用

    Prometheus 监控 Java 应用 Prometheus 监控 Java 应用有两种方式 一种是使用官方提供的jar包 然后嵌入到应用中 这种方式一般都是新项目 我认为也是最合适的一种 不过这种情况一般是理想而已 而除了这种方式 第
  • locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别

    例如zh CN GB2312 zh CN GB18030或者zh CN UTF 8 很多人都不明白这些古里古怪的表达方式 这个外星表达式规定了什么东西呢 这个问题稍后详述 现在只需要知道 这是locale的表达方式就可以了 locale这个
  • 总结Android开源项目及库

    http www ctolib com topics 105990 html ref myread TimLiu Android 自己总结的Android开源项目及库 github排名 https github com trending g
  • 企业网络故障分析及其解决方法介绍

    小型企业网故障分析及其解决方法介绍 小型企业网故障分析及其解决方法介绍 网络管理 网络拥塞和速度下降 无论是由硬件引起的 还是由粗心大意的用户 或是病毒 间谍软件或是其它因素引起的 是令网络管理员和技术支持人员十分头痛的问题 本文将分析引起
  • Golang标准库限流器rate使用

    限流就是限制系统的输入和输出流量来达到保护系统的目的 限流在实际场景中应用十分广泛 尤其在高并发场景下 为了保证系统的可以用性 我们需要采取一些限流措施降级 一旦达到限制的阈值 就需要限制流量并采取一些措施来完成限制流量的目的 比如 延迟处
  • C语言大数相乘的问题

    给你两个整数 请你计算A B 输入 数据的第一行是整数T 1 T 20 代表测试数据的组数 接着有T组数据 每组数据只有一行 包括两个非负整数A和B 但A和B非常大 Redraiment能保证这些数用long来保存一定会溢出 但A和B的位数
  • 【Pytorch基础】BatchNorm常识梳理与使用

    BatchNorm 批规范化 主要用于解决协方差偏移问题 主要分三部分 计算batch均值和方差 规范化 仿射affine 算法内容如下 需要说明几点 均值和方差是batch的统计特性 pytorch中用running mean和runni
  • 项目管理中的九大法则

    Hi 小伙伴们 一周的工作即将迎来尾声 小编又来给大家安利职场鸡汤啦 集齐九大法则 项目管理So easy 凡事都有法则 在项目管理中也有法则 员工之间 项目管理者与员工之间 项目管理者之间 尽管每个人都有其特点和个性 但各自为战在工作中却
  • [系统

    系统环境说明 系统 Deepin V20 平台 amd64 参考文献 asdf java asdf document asdf vm安装 见多版本管理命令行工具asdf vm安装及使用 asdf vm安装java 签出asdf java代码
  • MATLAB下载安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

    MATLAB下载 安装教程 说明 本文章提供的是MATLAB 2018b的下载及安装方式 下载2个DVD镜像然后对其进行安装操作 本人亲测有效 下载 提供的是百度网盘的下载 暂时没有找到其他途径的下载方式 后续若有其他下载方式在更新提供给各
  • arduino智能跟随小车

    前言 目前 机器人 已经成为生活中频繁出现的词汇 本课设所做的智能跟随机器人 属于反馈型移动机器人 反馈型移动机器人 可以简单定义为一种对外界信号进行处理反馈最终实现的方式将感知和动作连接在一起的可自移动设备 它必须具有在一个位置的环物独立
  • Unity出模型动画的序列帧(特效序列帧)

    模型动画的序列帧 我这里是通过Recorder和Timeline的结合操作 输出带有透明通道是序列帧图片 流程图 mermaid svg ig9s3Ys4ZkUqP2IW font family trebuchet ms verdana a
  • AI时代,三步走成为超级个体!

    什么是超级个体 超级个体要同时满足 专业技能 商业变现 脱离依附三大要素 跃迁 言简意赅一点就是具备脱离平台也能生存能力的人 通俗的说就是一个人也能赚钱的人 像职场达人 副业高手 创业者等 为什么在AI时代每个人都必须成为超级个体 1 因为
  • OpenCV-Python教程(5、初级滤波内容)

    本篇文章介绍如何用OpenCV Python来实现初级滤波功能 提示 转载请详细注明原作者及出处 谢谢 本文介绍使用OpenCV Python实现基本的滤波处理 本文不介绍滤波处理的详细概念 所以读者需要预先对其有一定的了解 简介 过滤是信
  • 数学,金融,计算机优秀博客

    数学 金融 计算机优秀博客 网址 http zhiqiang org blog link 阅微堂 阅微堂认同的优秀博客标准为 有更新 原创 一年以前的文章还有价值 数学 谢松 木遥 Han Yan 统计之都 张驰原 李淼 科学松鼠会 卢昌海
  • 理解图像卷积操作的意义

    参考 http blog csdn net chaipp0607 article details 72236892 locationNum 9 fps 1 理解图像卷积操作的意义 标签 图像处理图像卷积 2017 05 16 22 40 4