原理详解:
假设输入图像为I,高为H、宽为W,I(r,c)代表I的第r行第c列的灰度值,将I中出现的最小灰度级记为Imin,最大灰度级记为Imax,即I(r,c)ϵ[Imin,Imax]\epsilon[Imin,Imax]ϵ[Imin,Imax],为使输出图像O的灰度级范围为[Omin,Omax],I(r,c)和O(r,c)做以下映射关系:
O(r,c)=Omax−OminImax−Imin\frac{Omax-Omin}{Imax-Imin}Imax−IminOmax−Omin​(I(r,c)-Imin)+Omin
其中0≤\leq≤r≤\leq≤H,0≤\leq≤c≤\leq≤W, O(r,c)代表O的第r行第c列的灰度值。这个过程就是常称的直方图正规化。因为0≤\leq≤I(r,c)−IminImax−Imin\frac{I(r,c)-Imin}{Imax-Imin}Imax−IminI(r,c)−Imin​≤\leq≤1,所以O(r,c)1, 所以O(r,c)1,所以O(r,c)ϵ\epsilonϵ[Omin,Omax],一般令Omin=0,Omax=255。显然,直方图正规化是一种自动选取a和b的值的线性变换方法,其中:
a=Omax−OminImax−Imin\frac{Omax-Omin}{Imax-Imin}Imax−IminOmax−Omin​,b=Omin-Omax−OminImax−Imin\frac{Omax-Omin}{Imax-Imin}Imax−IminOmax−Omin​*Imin

在直方图正规化中最核心的步骤之一是计算原图中出现的最小灰度级和最大灰度级,OpenCV提供的函数:
void minMaxLoc(InputArray src, double* minVal, double* maxVal=0,Point* minLoc=0,Point* maxLoc=0,InputArray mask =noArray())
src 输入矩阵
minVal 最小值,double类型指针
maxVal 最大值,double类型指针
minLoc 最小值的位置索引,Point类型指针
maxLoc 最大值的位置索引,Point类型指针
利用minMaxLoc函数不仅可以计算出矩阵中的最大值和最小值,而且可以求出最大值的位置和最小值的位置,当然在使用过程中 如果只想得到最大值和最小值,则将其他的变量值设为NULL即可。例如:
minMaxLoc(src,&minVal,&maxValue,NULL,NULL)
只计算出最大值和最小值。

对于直方图正规化的c++实现,首先利用minMaxLoc函数计算出原图中的最大值和最小值,然后使用函数convertScaleAbs或者成员函数convertTo完成直方图正规化中的线性变换步骤:

//输入图像矩阵
Mat I = imread("E://image1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
//找到I的最大值和最小值
double Imax,Imin;
minMaxLoc(I,&Imin,&Imax,NULL,NULL);
//设置Omin 和Omax
double Omin=0,Omax=255;
//计算a和b
double a =(Omax-Omin)/(Imax-Imin);
double b =Omin-a*Imin;
//线性变换
Mat 0;
convertScaleAbs(I,O,a,b);
//显示原图和直方图正规化的效果
imshow("I",I);
imshow("O",O);

对于图像直方图正规化的操作,OpenCV提供的函数normalize实现了类似的功能。

void normalize(InputArray src, OutputArray dst, double alpha=1,double beta =0, int norm_type = NORM_L2,int dtype=-1,InputArray mask = noArray())

在介绍这个函数的作用之前,首先需要了解矩阵范数的概念。矩阵src范数一般有三种形式:
(1)1-范数----------------计算矩阵中值的绝对值的和:
∣∣src∣∣1||src||_1∣∣src∣∣1​=∑r=1M\sum\limits_{r=1}^Mr=1∑M​∑c=1N\sum\limits_{c=1}^Nc=1∑N​|src(r,c)|
(2) 2-范数---------------计算矩阵中值的平方和的平方:
∣∣src∣∣2||src||_2∣∣src∣∣2​=∑r=1M∑c=1N∣src(r,c)∣2\sqrt{{\sum\limits_{r=1}^M}{\sum\limits_{c=1}^N}|src(r,c)|^2}r=1∑M​c=1∑N​∣src(r,c)∣2​
(3) 3-范数---------------计算矩阵中值的绝对值的最大值:
∣∣src∣∣∞||src||_\infty∣∣src∣∣∞​=max|src(r,c)|
以输入矩阵:
src=(−5580100255)\begin{pmatrix}-55 & 80\\100 &255\end{pmatrix}(−55100​80255​)为例,介绍函数normalize的计算输出参数dst的过程,
当参数norm_type=NORM_L1时,计算src的1-范数,即
∣∣src∣∣1||src||_1∣∣src∣∣1​=|-55|+|80|+|100|+|255|=490
dst的计算过程如下:
dst=alpha*src∣∣src∣∣1\frac{src}{||src||_1}∣∣src∣∣1​src​+beta=(−5549080490100490255490)\begin{pmatrix}\frac{-55}{490} &\frac{80}{490}\\\frac{100}{490} &\frac{255}{490} \end{pmatrix}(490−55​490100​​49080​490255​​)+beta
当norm_type=NORM_L2时,计算src的2-范数,即
∣∣src∣∣2||src||_2∣∣src∣∣2​=∣−55∣2+∣80∣2+∣100∣2+∣255∣2\sqrt{|-55|^2+|80|^2+|100|^2+|255|^2}∣−55∣2+∣80∣2+∣100∣2+∣255∣2​=290.6
dst的计算过程如下:
dst=alpha*src∣∣src∣∣2\frac{src}{||src||_2}∣∣src∣∣2​src​+beta=(−55290.680290.6100290.6255290.6)\begin{pmatrix}\frac{-55}{290.6} &\frac{80}{290.6}\\\frac{100}{290.6} &\frac{255}{290.6} \end{pmatrix}(290.6−55​290.6100​​290.680​290.6255​​)+beta
当norm_type=NORM_INF时,计算src的∞\infty∞-范数,即
∣∣src∣∣∞||src||_\infty∣∣src∣∣∞​=max{|-55|,|80|,|100|,|255|}=255
dst的计算过程如下:
dst=alpha*src∣∣src∣∣2\frac{src}{||src||_2}∣∣src∣∣2​src​+beta=(−55255255290.6100255255255)\begin{pmatrix}\frac{-55}{255} &\frac{255}{290.6}\\\frac{100}{255} &\frac{255}{255} \end{pmatrix}(255−55​255100​​290.6255​255255​​)+beta
当norm_type=NORM_MINMAX时,首先计算src的最小值srcminsrc_{min}srcmin​=-55,src的最大值srcmaxsrc_{max}srcmax​=255,dst的每一个值是按照以下规则计算的:
dst(r,c)=alpha*src(r,c)−srcminsrcmax−srcmin\frac{src(r,c)-src_{min}}{src_{max}-src{min}}srcmax​−srcminsrc(r,c)−srcmin​​+beta
所以
dst=(−55−(−55)255−(−55)80−(−55)255−(−55)100−(−50)255−(−55)255−(−55)255−(−55))\begin{pmatrix}{\frac{-55-(-55)}{255-(-55)}}&\frac{80-(-55)}{255-(-55)}\\\frac{100-(-50)}{255-(-55)} &\frac{255-(-55)}{255-(-55)} \end{pmatrix}(255−(−55)−55−(−55)​255−(−55)100−(−50)​​255−(−55)80−(−55)​255−(−55)255−(−55)​​)+beta
使用函数normalize对图像进行对比度增强时,经常令参数norm_type=NORM_MIN-MAX,仔细观察会发现和直方图正规化原理详解中提到的计算方法是相同的,参数alpha相当于Omax,参数beta相当于Omin。注意,使用normalize可以处理多通道矩阵,分别对每一个通道进行正规化操作。

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("E:/image4.jpg");
if(!src.data)return -1;
//直方图正规化
Mat dst;
normalize(src,dst,255,0,NORM_MINMAX,CV_8U);
imshow("直方图正规化",dst);
waitKey(0);
return 0;
}

【OpenCV】对比度增强之直方图正规化(归一化)相关推荐

  1. OpenCV——对比度增强

    尽管我们通过各种方法来采集高质量的图像,但是有的时候还是不够好,需要通过图像增强技术提高其质量. 图像增强技术:主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度值放大到 ...

  2. 一种基于灰度映射以及直方图规定化的遥感图像对比度增强技术研究

    目录 一.绪论 二.基于灰度映射的对比度增强技术 2.1 线性映射 2.2 动态范围压缩 2.3 Gamma校正 2.4 对比度增强实例分析 三.基于直方图的对比度增强技术 3.1 直方图均衡化 3. ...

  3. 基于python的对比度增强(线性变换、直方图正规化、直方图均衡化、CLAHE)

    线性变换 假设输入图像为I,宽为W,高为H,输出图像为O,图像的线性变换可以用以下公式定义: O(r,c)=a×I(r,c)+b,0≤r<H,0≤c<WO(r, c) = a × I(r, ...

  4. OpenCV--Python 图像增强(线性变换,直方图正规化,伽马变换,全局直方图均衡化,限制对比度的自适应直方图均衡化)

    图像增强主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来增加清晰.对比度增强有几种常用的方法,如线性变换.分段线性变换.伽马变 ...

  5. python opencv图像对比度增强_图像增强、锐化, Python-OpenCV 来实现 4 种方法!

    图像增强目的使得模糊图片变得更加清晰.图片模糊的原因是因为像素灰度差值变化不大,如片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉 解决这个问题的最直接简单办法,放大像素灰 ...

  6. Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强(C++)

    Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强(C++) Baumer工业相机 Baumer工业相机使用图像算法增加图像的技术背景 Baumer工业相机 ...

  7. 【图像处理】彩色图像自适应对比度增强(OpenCV实现)

    [fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处]   提到图像增强,第一印象就是直方图均衡与直方图规定化,这是最常见的也是非常有效的全局图像 ...

  8. Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)

    Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization) ############ ...

  9. opencv 彩色图像对比度增强

    一般地,图像对比度都是在灰度图上进行增强,这在我的一篇文章中已经给出了实现方法(http://blog.csdn.net/abcjennifer/article/details/7401921),最通 ...

最新文章

  1. 编辑模式下,控制对象移动
  2. 高效算法——E - 贪心-- 区间覆盖
  3. Storm-源码分析-Stats (backtype.storm.stats)
  4. 后年将有60亿部手机!
  5. linux 调优篇 :硬件调优(BIOS配置)* 壹
  6. jekenis父子结构项目打包_自动打包机的型号怎么选择?自动打包机型号选择须知...
  7. 中国大学mooc慕课python语言程序设计答案_中国大学MOOC(慕课)_Python语言程序设计基础_网课答案...
  8. 收藏!50个帮你自我提升的网站
  9. JavaScript学习(四十三)—构造方法创建对象的图解和注意事项
  10. JSK-391 公约公倍【入门】
  11. Python游戏开发入门2 壁球小游戏与图像的基本使用
  12. 解决SAP PI Cluster系统故障
  13. Yii路由之LimeSurvey去掉烦人的/index.php/*
  14. linux添加变色龙引导,变色龙引导下载
  15. 拒绝了对对象 'data'(数据库 'xxx',所有者 'dbo')的 SELECT 权限 解决方案
  16. 为什么沿着梯度相反的方向更新参数
  17. 【现成工具】java获取国家法定节假日包含指定月份节假日和周末
  18. 51单片机基础——串口发送66,数码管显示66
  19. 中兴防火墙配置_中兴防火墙命令手册 中兴c600基本命令
  20. 千粉缔造760w播放!B站“新人”UP主在B站怎么加速上位?

热门文章

  1. 发电机是根据电磁感应原理运行的,属于感应电机的一种,感应电机包括电动机和发电机;
  2. Reactor模式是什么_晏无心_新浪博客
  3. 【js---鼠标点击可拖动左右内容的实现】
  4. Android录音使用LAME转MP3,附aar包
  5. 蓝桥杯 青蛙跳杯子(广搜)
  6. Android-JNI的简单使用
  7. Python3入门之软件安装
  8. chatgpt智能提效职场办公-ppt怎么做才好看又快
  9. android关于UI的渲染速度
  10. 图形学中坐标点和坐标系的变换