![](https://img-blog.csdnimg.cn/20190225094734317.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
图像处理经典算法c++实现
该专栏致力于实现图像处理的各种经典算法(base OpenCV),欢迎指正与交流-qq:2209520576
小武~~
静心尽力,总结沉淀!
关注 OpenImage,我们坚持开源,可以一起分享、学习图像处理相关的小知识,获取或分享学习资源,还可以和博主以及其他小伙伴们一起交流学习哦。
展开
-
色彩转换系列之RGB格式与HSV格式互转原理及实现
写在前面HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV...原创 2019-06-17 17:56:26 · 8494 阅读 · 4 评论 -
色彩转换系列之RGB格式与HSI格式互转原理及实现
写在前面HSI色彩空间是从人的视觉系统出发,直接用颜色三要素:色调(Hue)、饱和度(Saturation或Chroma)和亮度 (Intensity或Brightness)来描述色彩。H——表示颜色的相位角,是彩色最重要的属性,决定颜色的本质。红、绿、蓝分别相隔120度;互补色分别相差180度,即颜色的类别。 S——表示颜色的深浅程度,饱和度越高,颜色越深。与白色的比例有关,白色比例...原创 2019-06-17 17:01:16 · 11283 阅读 · 0 评论 -
色彩转换系列之RGB格式与YUV格式互转原理及实现
写在前面首先介绍一下YUV颜色空间,YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法。在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和两个色差总共三个信号分别进行编码,用同一信道发送出去。这种色彩的表示...原创 2019-06-17 15:40:52 · 15276 阅读 · 9 评论 -
色彩转换系列之RGB图转灰度图原理及实现
写在前面彩色图转灰度图在图像处理中应用非常非常广泛,而且很多算法只对灰度图有效,所以彩色图转灰度是十分重要和关键的。RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像。 ...原创 2019-06-17 13:57:10 · 8204 阅读 · 3 评论 -
Laplacian算子-Log算子-Dog算子边缘检测原理合集及实现
写在前面这里,我们将Laplacian算子-Log算子-Dog算子合在一篇博文写,为什么呢?因为这3个算子有非常大的关联性:Dog算子可以近似Log算子,而Log(Laplacian of gaussain)算子的基础是Laplacian算子。所以合在一起写更加方便,也更加能够突出这种关联性和递进的关系。值得说明的是:区别于Roberts算子、prewitt算子、sobel算子;Lapla...原创 2019-06-12 11:57:16 · 22077 阅读 · 6 评论 -
Canny算子边缘检测原理及实现
写在前面Canny边缘检是在在1986年提出来的,到今天已经30多年过去了,但Canny算法仍然是图像边缘检测算法中最经典、先进的算法之一。相比Sobel、Prewitt等算子,Canny算法更为优异。Sobel、Prewitt等算子有如下缺点:没有充分利用边缘的梯度方向。 最后得到的二值图,只是简单地利用单阈值进行处理。而Canny算法基于这两点做了改进,提出了:基于边缘梯度...原创 2019-06-11 12:34:09 · 115455 阅读 · 37 评论 -
Sobel算子边缘检测原理及实现
写在前面Prewitt算子同样是一种一阶微分算子,它的卷积算子和Prewitt算子非常类似,仅仅是系数不同,但Sobel算子对于像素位置的影响做了加权,与Prewitt算子、Roberts算子相比效果更好。优点对边缘定位较为准确,能较好地处理灰度渐变和噪声较多的图像,计算简单,可分别计算水平和垂直边缘,如EasyPR用其定位车牌。原理首先我们看Sobel算子: ...原创 2019-06-10 22:33:27 · 11766 阅读 · 1 评论 -
Prewitt算子边缘检测原理及实现
写在前面Prewitt算子同样也是一种一阶微分算子,利用像素点上下左右邻点灰度差,在边缘处达到极值检测边缘,对噪声具有平滑的作用。原理其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。相比Roberts算子,Prewitt算子对噪声有抑制作用,抑制噪声的原理是通过像素平均,因此噪声较多的图像处理得比较好,但是像素平均相当...原创 2019-06-10 18:22:36 · 22731 阅读 · 1 评论 -
Roberts算子边缘检测原理及实现
写在前面我们知道,进行边缘检测有两种方法:一阶导数的极值、二阶导数的过零点。Robert算子是一种一阶微分算子,而且Robert算子是第一个边缘检测算子,提出者是Lawrence Roberts in 1963。从这篇博客开始,会陆续介绍几种经典的边缘检测算子。先附上各种边缘检测算法的优缺点: 原理Roberts算子是一种斜向偏差分...原创 2019-06-10 17:31:41 · 33522 阅读 · 1 评论 -
形态学分水岭算法原理及示例实现
原理介绍前面写了OTSU算法、最大熵算法、自适应阈值法、基于区域生长算法。他们都有各自的优缺点,而分水岭算法具有它们都具有的优势,所以通常能够产生更加稳健的分割效果。分水岭算法(watershed)是一种比较基本的数学形态学分割算法,其基本思想是将灰度图像转换为梯度图像,将梯度值看作高低起伏的山岭,将局部极小值及其邻域看作一个“集水盆”。设想一个个“集水盆”中存在积水,且水位不断升高,淹没...转载 2019-05-15 11:20:10 · 11083 阅读 · 2 评论 -
区域生长算法原理及实现
写在前面前面写了OTSU算法、最大熵算法、自适应阈值法,这些都是基于阈值的分割算法。今天写一下基于区域的分割算法,其中最为有名和经典的就是区域生长算法。值得说明的是:OpenCV没有提供区域生长算法的API。优点:基本思想相对简单,通常能将具有相同特征的联通区域分割出来,并能提供很好的边界信息和分割结果。在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象,如自然景...原创 2019-05-14 22:20:05 · 53353 阅读 · 9 评论 -
自适应阈值(adaptiveThreshold)分割原理及实现
背景介绍及原理前面介绍了OTSU算法和最大熵算法,但这两种算法都属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图: 显然,这样的阈值处理结果不是我们想要的,那么就需要一种方法来应对这样的情况。这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮...原创 2019-05-14 20:27:27 · 86128 阅读 · 26 评论 -
最大熵阈值分割算法原理及实现
写在前面前面介绍了OTSU算法,对于阈值分割法,不得不介绍另外一种较为突出的算法——最大熵阈值分割法(KSW熵算法)。最大熵阈值分割法和OTSU算法类似,假设将图像分为背景和前景两个部分。熵代表信息量,图像信息量越大,熵就越大,最大熵算法就是找出一个最佳阈值使得背景与前景两个部分熵之和最大。原理由于和OTSU算法类似,所以原理上就不再赘述和推导,言简意赅。 ...原创 2019-05-14 19:39:48 · 17780 阅读 · 13 评论 -
OTSU算法(大津法—最大类间方差法)原理及实现
写在前面大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差...原创 2019-05-13 22:26:12 · 179080 阅读 · 40 评论 -
引导滤波(GuidedFilter)原理及C++实现
写在前面引导滤波是何恺明读博士的时候提出来的一种去噪保边算法,很有名。作者其主页上给出了该算法的Matlab实现和原文。而且他提出的基于暗通道去雾算法技惊四座,获CVPR2009最佳论文(膜拜),近几年在CV领域的成果也相当丰硕,关于他的研究动态,可以访问http://kaiminghe.com/。优点:1、应用面很广、很广;2、能够克服双边滤波的梯度翻转现象,在滤波后图像的细节上...原创 2019-05-02 19:49:26 · 7924 阅读 · 1 评论 -
双边滤波(bilateralfiter)原理及C++实现
写在前面双边滤波是一种非线性滤波,能够达到去噪保边的效果。相比高斯滤波,双边滤波多了一种掩膜,也就是还考虑了灰度相似性,所以双边滤波是结合图像的空间邻近度和像素值相似度的一种折衷处理。先看看对比效果:wsize=23*23, sigma(space)=10,sigma(color)=35 ...原创 2019-05-02 16:45:00 · 11682 阅读 · 5 评论 -
高斯滤波(GaussianFilter)原理及C++实现
写在前面首先,搞清楚几个概念:滤波(高通、低通、带通、带阻) 、模糊、去噪、平滑,看下图: 滤波是对输入信号进行卷积处理的一个过程,写成一个表达式的形式是这样的:滤波 = 卷积( 输入信号 ,卷积模板 ), 卷积模板/掩膜 的不同决定了不同的滤波方式,也因此产生了高通、低通、带通、带阻等基本的...原创 2019-05-02 12:17:18 · 34497 阅读 · 16 评论 -
盒子(方框)滤波(BoxFilter)原理及C++及Matlab实现
写在前面盒子滤波是一种非常有用的线性滤波,也叫方框滤波,最简单的均值滤波就是盒子滤波归一化的情况。应用:可以说,一切需要求某个邻域内像素之和的场合,都有盒子滤波的用武之地,比如:均值滤波、引导滤波、计算Haar特征等等。优势:就一个字:快!它可以使复杂度为O(MN)的求和,求方差等运算降低到O(1)或近似于O(1)的复杂度,也就是说与邻域尺寸无关了,有点类似积分图吧,但是貌似比积分图...原创 2019-05-01 21:40:59 · 18425 阅读 · 12 评论 -
子块部分重叠直方图均衡算法(POSHE算法)MATLAB实现
写在前面POSHE算法原理解读及c++代码实现请看:https://blog.csdn.net/weixin_40647819/article/details/88416512这次用MATLAB实现。代码git 下载地址:https://github.com/2209520576/Image-Processing-Algorithm/tree/master/Graysca...原创 2019-04-27 16:51:17 · 2725 阅读 · 14 评论 -
中值滤波原理及c++实现
写在前面中值滤波器是一种非线性滤波器,或者叫统计排序滤波器。应用:中值滤波对脉冲噪声(如椒盐噪声)的抑制十分有用。缺点:易造成图像的不连续性。原理原理很简单,如果一个信号是平缓变化的,那么某一点的输出值可以用这点的某个大小的邻域内的所有值的统计中值来代替。这个邻域在信号处理领域称之为窗(window)或者模板(Mask)。模板开的越大,输出的结果就越平滑,但也可能会把我们...原创 2019-03-24 18:06:15 · 8202 阅读 · 4 评论 -
积分图实现快速均值滤波
写在前面在实际应用中,效率是不得不考虑的问题。上一篇博客介绍了均值滤波原理,这一篇就写用积分图实现的快速均值滤波吧。还是贴一下常规与快速的效率对比吧:下图是常规均值滤波处理一张分辨率为485*528图像的时间(模板15*15):下图是积分图快速均值滤波处理的时间(模板15*15):可以说加速后,速度提升很多。而且最重要的是,用积分图的快速均值滤波受模板变化的影响不大!!...原创 2019-03-24 14:24:52 · 8299 阅读 · 8 评论 -
均值滤波原理及C++实现
写在前面从均值滤波开始,着手实现各种常用的滤波算法。均值滤波是一种线性滤波。图像的空域滤波无非分为两种,线性滤波和非线性滤波。由于我之前对线性、非线性理解不够清晰,这次就好好总结一下吧。线性滤波:对邻域中的像素的计算为线性运算时,如利用窗口函数进行平滑加权求和的运算,或者某种卷积运算,都可以称为线性滤波。常见的线性滤波有:均值滤波、高斯滤波、盒子滤波、拉普拉斯滤波等等,通常线性滤波器之间只...原创 2019-03-24 11:55:46 · 12519 阅读 · 4 评论 -
子块部分重叠直方图均衡算法(POSHE算法)原理解读及c++实现(二)
写在前面接着上次的博客写,上次已经介绍完了POSHE部分,也为这次写BERF做了一些铺垫。在这次正式开始之前,还是先放两张图片,以说明执行BERF的必要性:仅执行POSHE 执行BERF...原创 2019-03-23 22:14:36 · 1416 阅读 · 2 评论 -
子块部分重叠直方图均衡算法(POSHE算法)原理解读及c++实现(一)
写在前面Matlab版代码:https://blog.csdn.net/weixin_40647819/article/details/89603660最近刚好写到了直方图均衡算法,因为之前用到过图像增强,就大致地再多了解了一下,看到了POSHE算法,这个算法也算是比较经典的吧,有一些它的优势。其实这篇论文是很老的论文了,是韩国人提出的,目前看来可能意义不大,但是我看了一下引用情况,中文论...原创 2019-03-12 19:46:47 · 5805 阅读 · 22 评论 -
直方图均衡化算法原理与c++实现
写在前面直方图均衡是图像增强的基础算法,本质上是一种非线性拉伸,使图像的灰度级分布变得较为均匀,从而增强图像的对比度,使这些不够明显的图像细节清晰可见。掌握一种算法,必须要弄清楚它的优势和缺点,要知道它的适用场合,这样才能灵活的运用这些算法。直方图均衡算法的优势:对于背景和前景都太亮或者太暗的图像非常有用,计算量不大,完全可以满足实时。并且是可逆操作,也就是说如果已知均衡化函数,那么就可以...原创 2019-03-12 09:33:49 · 2739 阅读 · 0 评论 -
Gamma校正原理及c++实现(查找表法)
写在前面 如果直接按公式编程的话,需要执行大量浮点数的乘法、除法和指数运算。效率太低,在应用时是肯定不行的。 针对上述情况,有人提出了一种快速算法,如果能够确知图像的像素取值范围, 例如, 0 ~ 255 之间的整数, 则图像中任何一个像素值只能 是0到255这256个整数中的某一个 ; 在gamma 值 已知的情况下...转载 2019-02-28 14:38:25 · 4671 阅读 · 0 评论 -
图像灰度变换原理及c++实现——图像反转,对数变换,对比度拉伸,比特平面分层
写在前面先交代下代码实现的技术细节吧。1、在最后的代码里,图像反转,对数变换方法1,对比度拉伸,比特平面分层的实现均采用指针访问像素的方式,以前总是用Opencv的at模板,但是指针最为高效,我还是用一下指针吧。当然,还有迭代器访问的方式,也是最为安全的方式,以后试一下。访问元素的方式常用的有四种,详情可以参考:https://www.cnblogs.com/ronny/p/opencv_...原创 2019-02-28 11:02:29 · 4823 阅读 · 1 评论 -
图像的仿射变换原理及c++实现(旋转,平移,缩放,偏移,组合变换)
github地址:https://github.com/2209520576/Image-Processing-Algorithm一.写在前面 几何空间变换是图像处理中的最基础的算法,主要包括图像的旋转,平移,缩放,偏移,组合变换等等,在冈萨雷斯的数字图像处理第三版的第二章就做了相关介绍,最常用的空间坐标变换之一就是仿射变换。虽然仿射变换很基础,但作用还是很大的,例如在车牌识别的预处理...原创 2019-02-25 11:44:23 · 13964 阅读 · 17 评论 -
图像缩放中的插值算法——双线性插值原理及c++实现
github地址:https://github.com/2209520576/Image-Processing-Algorithm首先感谢大牛博客:http://handspeaker.iteye.com/blog/1545126 https://www.cnblogs.com/yssongest/p/5303151.html...原创 2019-01-22 21:18:47 · 10888 阅读 · 10 评论 -
图像缩放中的插值算法——最近邻插值算法及c++实现
github地址:https://github.com/2209520576/Image-Processing-Algorithm图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了。下面就来讲讲计算机怎么来放大缩小图象;在本文中,我们所说的图...原创 2019-01-22 20:18:03 · 6926 阅读 · 7 评论 -
OpenCV实现频率域滤波——以高斯低通滤波去噪为例
最近通过研究了一下频率域滤波,并试着用OpenCV实现,但是OpenCV并没有像MATLAB中 fftshift 这样的中心化操作,所以我写了一个完成频率域滤波的函数,以后用频率域滤波的时候在主函数中调用即可。当然,水平有限,编写的代码并不优美,有问题请大家留言批评指正。 在这里我不介绍傅里叶变换、频率域滤波和高斯低通滤波器的原理,想必大家已经有了大概了解,本文关注OpenCV的代码实现。 ...原创 2018-06-06 22:22:34 · 14482 阅读 · 7 评论 -
Canny算子边缘检测详细原理(OpenCV+MATLAB实现)
最近老师布置了一个边缘检测的作业,我借此机会详细学习了一下canny算子,在此进行总结,并分别给出OpenCV代码和MATLAB代码,自己水平有限,若有错误或者更好的编程方法,请广大网友留言,一定虚心学习。好了废话少说,直接开始吧。基本原理须满足条件:抑制噪声;精确定位边缘。 从数学上表达了三个准则[信噪比准则(低错误率)、定位精度准则、单边缘响应准则],并寻找表达式的最...原创 2018-05-19 22:11:59 · 11241 阅读 · 8 评论