【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化


前言

欢迎来到本博客

本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。

具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–>搜索你要查询的算子名称或相关知识点,或者通过这篇博客通俗易懂OpenCV(C++版)详细教程——OpenCV函数快速查找(不断更新中)]查阅你想知道的知识,即可食用。

支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!


文章目录

    • 学习目标
    • 一、概念及原理
    • 二、代码实现
    • 三、范数(1-范数、2-范数、∞-范数)
      • 3.1 1-范数
      • 3.2 2-范数
      • 3.3 ∞-范数
    • 四、正规化函数
    • 五、 总结

学习目标

  • 熟悉直方图正规化概念及原理
  • C++实现直方图正规化案例
  • 了解各种范数(1-范数、2-范数、∞-范数)
  • 理解正规化函数

一、概念及原理

  假设输入图像为I,高为H、宽为WI(r,c) 代表I的第r行第c列的灰度值,将I中出现的最小灰度级记为I min ,最大灰度级记为I max ,即I(r,c)∈[I min ,I max ],为使输出图像O的灰度级范围为[O min ,O max ]I(r,c)O(r,c)做以下映射关系:

  其中0 ≤ r < H0 ≤ c< WO(r,c)代表O的第r行第c列的灰度值。这个过程就是常称的直方图正规化。因为0≤((,)− ) / ( − )≤1,所以O(r,c)∈[O min ,O max ],一般令O min =0,O max =255

  所以说,直方图正规化是一种自动选取a和b的值的线性变换方法。那么:

  其实原理很简单,更重要得是如何利用到实际案例中。

  

二、代码实现

  在直方图正规化中最核心的步骤之一计算原图中出现的最小灰度级和最大灰度级,OpenCV提供的函数可以计算矩阵(图像)中最小和最大值

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,&maxVal,NULL,NULL)

  回到正题,对于直方图正规化的C++实现: 首先利用minMaxLoc函数计算出原图中的最大值和最小值,然后使用函数convertScaleAbs或者成员函数converTo完成直方图正规化中的线性变换步骤。具体代码如下:

#include 
#include 
#include 
#include

using namespace std;
using namespace cv;

int main() {

	//输入图片
	Mat image = imread("D:/VSCodeFile/OpenCV_CSDN/image/logo.jpeg", IMREAD_COLOR);

	//设置最大最小值 并计算
	double ImageMin, ImageMax;

	minMaxLoc(image,&ImageMin,&ImageMax,NULL,NULL);

	//设置OutImageMin OutImagMax 
	double OutImageMin=0, OutImagMax=255;

	//计算a 和 b
	double a = (OutImagMax - OutImageMin) / (ImageMax - ImageMin);
	double b = OutImageMin - a*ImageMin;

	//设置输出
	Mat OutImage;
	//线性变换
	convertScaleAbs(image,OutImage,a,b);

	//显示图

	imshow("原图image", image);
	imshow("直方图正规化图OutImage", OutImage);


	waitKey(0);
	return 0;

}
【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第1张图片

  

三、范数(1-范数、2-范数、∞-范数)

  矩阵src范数一般有三形式,对于每种范数,下面做个简单介绍:

3.1 1-范数

  对于1-范数,其实就是计算矩阵中值的绝对值的和,即:

【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第2张图片

  例如矩阵:

【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第3张图片

  利用函数normalize的计算输出参数dst的过程,当参数norm_type=NORM_L1时,即计算src1-范数

  即dst为:

【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第4张图片

3.2 2-范数

  对于2-范数,其实就是计算矩阵中值的平方和的开方,即:

【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第5张图片

  利用上面得矩阵,当norm_type=NORM_L2时,即计算src2-范数

  即dst为:

【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第6张图片

3.3 ∞-范数

  对于2-范数,其实就是计算矩阵中值的绝对值的最大值,即:

  利用上面得矩阵,当norm_type=NORM_INF时,即计算src∞-范数

  即dst为:

【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第7张图片

  另外:norm_type=NORM_MINMAX时,首先计算src的最小值src min =-25src的最大值src max =200dst的每一个值是按照以下规则计算:

  

四、正规化函数

  对于图像直方图正规化的操作,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 输入矩阵(图像)
dst 输出图像/数组
alpha 范围的最小值
beta 范围的最大值(不用于范数归一化)
intnorm_type 归一操作的类型,主要有四种,见上面【三、范数(1-范数、2-范数、∞-范数)】
dtype 为负数时,输出数组的类型与输入数组相同,否则只是通道数相同,类型默认为:type = CV_MAT_DEPTH
mask 指定操作的区域/空间

  使用函数normalize对图像进行对比度增强时,经常令参数norm_type=NORM_MINMAX其实和直方图正规化原理详解中提到的计算方法是相同的,参数alpha相当于Omax ,参数beta相当于Omin

  注意:使用normalize可以处理多通道矩阵,分别对每一个通道进行正规化操作。

  使用该函数对图像进行对比度增强的C++代码如下:

#include 
#include 
#include 
#include

using namespace std;
using namespace cv;

int main() {

	//输入图片
	Mat image = imread("D:/VSCodeFile/OpenCV_CSDN/image/logo.jpeg", IMREAD_COLOR);

	Mat dst;
	normalize(image,dst,255,0,NORM_MINMAX,CV_8U);

	//显示图

	imshow("原图image", image);
	imshow("normalize图", dst);


	waitKey(0);

	return 0;

}
【图像处理OpenCV(C++版)】——4.3 对比度增强之直方图正规化_第8张图片

五、 总结

  最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。OpenCV是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。


今天的文章就到这里啦~
喜欢的话,点赞、收藏⭐️、关注哦 ~

你可能感兴趣的:(#,OpenCV(C++),opencv,图像处理,c++,计算机视觉,算法)