-
2022-03-15 11:40:55
前言
在图像直方图详解中详细讲解了图像直方图,这章来讲解一下直方图的均衡化。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
先看下图未经过均衡化的图像,可以看到像素似乎聚集灰度值范围的中间。
直方图均衡化所做的就是扩大这个范围。在应用均衡化后一、原理
均衡化意味着将一个分布(给定的直方图)映射到另一个分布(灰度值更宽、更均匀的分布),因此灰度值分布在整个范围内。
为了达到均衡效果,重映射应该是累积分布。对于直方图H(i),其累积分布H ’ (i)为:
为了使用它作为重映射函数,我们必须对H ’ (i)进行归一化,使其最大值为255(或图像灰度的最大值)。累积分布计算结果是:
最后,我们使用一个简单的重映射过程来获得均衡后图像的灰度值:
opencv 函数支持equalizeHist()
函数原型:
CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst );
参数说明:
src:源8位单通道图像。
dst:目标图像的大小和类型与src相同代码示例:
cv::Mat image = cv::imread("D:\\QtProject\\Opencv_Example\\Hist\\Hist.png", cv::IMREAD_GRAYSCALE); if (image.empty()) { cout << "Cannot load image" << endl; return; } imshow("image",image); Mat dst; equalizeHist(image, dst); imshow( "Equalized", dst);
更多相关内容 -
Python OpenCV 直方图的计算与显示的方法示例
2020-12-25 09:40:42与C++中一样,在Python中调用的OpenCV直方图计算函数为cv2.calcHist。 cv2.calcHist的原型为: cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回hist 通过一个例子来了解... -
OpenCV直方图
2021-09-23 17:26:29在OpenCV中,我们可以使用直方图对我们图像的像素点进行统计操作。像素点的区间0-255也就是直方图的横坐标,像素点的个数也就是直方图的纵坐标。 通常我们会使用cv2.calcHist(images,channels,mask,histSize,...直方图的介绍
-
在OpenCV中,我们可以使用直方图对我们图像的像素点进行统计操作。像素点的区间0-255也就是直方图的横坐标,像素点的个数也就是直方图的纵坐标。
-
通常我们会使用cv2.calcHist(images,channels,mask,histSize,ranges)函数。
- images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
- channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
- mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。
- histSize:BIN 的数目,也使用中括号。
- ranges: 像素值范围常为 [0-256]。
-
代码示例
img = cv2.imread('cat.jpg',0) #0表示灰度图 hist = cv2.calcHist([img],[0],None,[256],[0,256]) hist.shape (256, 1) plt.hist(img.ravel(),256); plt.show()
- 三个颜色通道所呈现的直方图统计
img = cv2.imread('cat.jpg') color = ('b','g','r') for i,col in enumerate(color): histr = cv2.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256])
- mask掩码操作
# 创建mask mask = np.zeros(img.shape[:2], np.uint8) print (mask.shape) #保存什么值就把什么值设为255 mask[100:300, 100:400] = 255 #与操作 masked_img = cv2.bitwise_and(img, img, mask=mask) hist_full = cv2.calcHist([img], [0], None, [256], [0, 256]) hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256]) plt.subplot(221), plt.imshow(img, 'gray') plt.subplot(222), plt.imshow(mask, 'gray') plt.subplot(223), plt.imshow(masked_img, 'gray') plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask) plt.xlim([0, 256]) plt.show()
直方图均衡化
均衡化原理
- 直方图均衡化原理:统计出来的像素点的值之间的差距比较大,我们需要缩小像各个像素点之间的值得差距,这就叫均衡化。具体示例见下图:
- 左上表格为原始的像素值,右上表格是均衡化之后的像素值。具体实现为下面的表格。
- 计算步骤首先计算出各个像素点的概率值,计算出累计概率,然后通过映射函数计算出灰度值,最后取整就得到均衡化之后的结果。
均衡化操作
- 在OpenCV中如何实现均衡化呢?这里我们使用cv2.equalizeHist(img) 这个函数,具体代码实现如下:
#均衡化前 img = cv2.imread('clahe.jpg',0) #0表示灰度图 #clahe plt.hist(img.ravel(),256); plt.show()
#均衡化后 equ = cv2.equalizeHist(img) plt.hist(equ.ravel(),256) plt.show()
- 均衡化图片前后对比
res = np.hstack((img,equ)) cv_show(res,'res')
- 虽然图片变亮眼了,但是却丢失了一些细节。我们可以使用自适应均衡化的操作,例如将图片分格之后进行均衡化操作。代码如下:
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) res_clahe = clahe.apply(img) res = np.hstack((img,equ,res_clahe)) cv_show(res,'res')
-
-
OpenCV 直方图比较
2022-01-24 23:00:49直方图比较 直方图其他基础知识 直方图均值化:https://yangyongli.blog.csdn.net/article/details/122663843 直方图计算:https://yangyongli.blog.csdn.net/article/details/122663843 直方图比较方法——概述 对...文章目录
直方图比较
直方图其他基础知识
直方图均值化:https://yangyongli.blog.csdn.net/article/details/122663843
直方图计算:https://yangyongli.blog.csdn.net/article/details/122663843
直方图比较方法——概述
对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间
然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进
而比较图像本身的相似程度。Opencv提供的比较方法有四种:- Correlation 相关性比较
- Chi-Square 卡方比较
- Intersection 十字交叉性
- Bhattacharyya distance 巴氏距离
相关性计算(CV_COMP_CORREL)
公式如下:
其中
如果H1 = H2,即两个图的直方图一样,分子等于分母,值为1,所以在不严格的情况下,当值为1时,可以认为两个图是一样的。但是也有可能会出现两个图不一样,但是两个图的直方图是一样的情况。因为直方图计算的是像素点个数的分布情况,但是不会显示像素点的位置,所以有可能会出现两幅图片不一样,但是相同像素的个数完全一样,那他们的直方图也是一样的,不过这种情况,不常有。
卡方计算(CV_COMP_CHISQR)
计算公式:
H1,H2分别表示两个图像的直方图数据通过这个公式我们能够发现,卡方比较和相关性比较恰恰相反:
- 相关性比较的值为0,相似度最低;
- 越趋近于1,相似度越低;
卡方比较则是,值为0时说明H1= H2,这个时候相似度最高。
十字计算(直方图相交)(CV_COMP_INTERSECT)
计算公式:
H1,H2分别表示两个图像的直方图数据度量越高,匹配越准确
巴氏距离计算(CV_COMP_BHATTACHARYYA )
H1,H2分别表示两个图像的直方图数据
在直方图相似度计算时,巴氏距离获得的效果最好,但计算是最为复杂的。巴氏距离的计算结果,其值完全匹配为0,完全不匹配则为1。
匹配结果总结
相关性与直方图相交(十字):当值越大时表示相似度越高
卡方和巴适:当值越小时表示相似度越高相关API
计算图像的直方图,然后归一化到[0~1]之间calcHist和normalize;
normalize 函数介绍normalize
函数作用:该函数归一化输入数组使它的范数或者数值范围在一定的范围内。
函数原型:
void normalize( InputArray src, OutputArraydst, double alpha = 1, double beta = 0, intnorm_type = NORM_L2, int dtype = -1, InputArray mask = noArray() )
函数参数:
src
:输入数组dst
:输出数组,支持原地运算alpha
:range normalization模式的最小值beta
:range normalization模式的最大值,不用于norm normalization(范数归一化)模式。normType
:归一化的类型,可以有以下的取值:
取值 含义 NORM_MINMAX
数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。 NORM_INF
此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值) NORM_L1
归一化数组的L1-范数(绝对值的和) NORM_L2
归一化数组的(欧几里德)L2-范数 dtype
:dtype为负数时,输出数组的type与输入数组的type相同;
否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).mask
:操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。
compareHist
函数作用:使用上述四种比较方法之一进行比较
函数原型:
compareHist( InputArray h1, // 直方图数据,下同 InputArray H2, int method // 比较方法,上述四种方法之一 )
method可取值:
取值 计算方式 CV_COMP_CORREL
相关性计算 CV_COMP_CHISQR
卡方计算 CV_COMP_INTERSECT
十字计算 CV_COMP_BHATTACHARYYA
巴氏距离计算 代码示例
#include <iostream> #include <math.h> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/highgui/highgui_c.h> using namespace std; using namespace cv; string convertToString(double d); int main(int argc, char** argv) { // 加载图像 Mat base, test1, test2; Mat hsvbase, hsvtest1, hsvtest2; base = imread("./zhao1.jpg"); if (!base.data) { printf("could not load image...\n"); return -1; } test1 = imread("./zhao2.jpg"); test2 = imread("./zhao3.jpg"); // 从RGB空间转换到HSV空间 cvtColor(base, hsvbase, CV_BGR2HSV); cvtColor(test1, hsvtest1, CV_BGR2HSV); cvtColor(test2, hsvtest2, CV_BGR2HSV); imshow("baseHSV", hsvbase); imshow("test1HSV", hsvtest1); imshow("test2HSV", hsvtest2); // 计算直方图与归一化 int h_bins = 50; int s_bins = 60; int histSize[] = { h_bins, s_bins }; // hue varies from 0 to 179, saturation from 0 to 255 float h_ranges[] = { 0, 180 }; float s_ranges[] = { 0, 256 }; const float* ranges[] = { h_ranges, s_ranges }; // Use the o-th and 1-st channels int channels[] = { 0, 1 }; // MatND 是 Mat的别名,方便区分经过直方图计算处理后和输入图像 MatND hist_base; MatND hist_test1; MatND hist_test2; calcHist(&hsvbase, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false); normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat()); calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false); normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat()); calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false); normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat()); // 直方图比较(十字计算) double basebase = compareHist(hist_base, hist_base, CV_COMP_INTERSECT); double basetest1 = compareHist(hist_base, hist_test1, CV_COMP_INTERSECT); double basetest2 = compareHist(hist_base, hist_test2, CV_COMP_INTERSECT); double tes1test2 = compareHist(hist_test1, hist_test2, CV_COMP_INTERSECT); printf("test1 compare with test2 correlation value :%f", tes1test2); Mat test12; test2.copyTo(test12); putText(base, convertToString(basebase), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA); putText(test1, convertToString(basetest1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA); putText(test2, convertToString(basetest2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA); putText(test12, convertToString(tes1test2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA); imshow("base与base", base); imshow("base与test1", test1); imshow("base与test2", test2); imshow("test1与test12", test12); waitKey(0); return 0; } // 回调函数:输出计算结果 string convertToString(double d) { ostringstream os; if (os << d) return os.str(); return "invalid conversion"; }
-
OpenCV直方图均衡化
2019-01-03 22:36:35理解直方图和直方图均衡化的原理,及其在图像和视频处理中的应用; 2、基于VS+opencv实现获取图像的直方图; 3、基于VS+opencv实现对图像的直方图均衡化; -
opencv 直方图比较
2022-03-15 10:59:39在中详细讲解了图像直方图,图像直方图比较是度量两张图像相似度的一种手段。为了比较两个直方图(H1和H2),首先我们必须选择一个度量(d(H1,H2))来表示这两个直方图的匹配程度。OpenCV提供了4种不同的指标来计算匹配...前言
在中详细讲解了图像直方图,图像直方图比较是度量两张图像相似度的一种手段。为了比较两个直方图(H1和H2),首先我们必须选择一个度量(d(H1,H2))来表示这两个直方图的匹配程度。OpenCV提供了4种不同的指标来计算匹配:
相关性Correlation ( HISTCMP_CORREL):
N是N是直方图bin的总数。Chi-Square ( HISTCMP_CHISQR)
Intersection ( method=HISTCMP_INTERSECT)
Bhattacharyya distance ( HISTCMP_BHATTACHARYYA)
opencv 函数支持
函数原型:
CV_EXPORTS_W double compareHist( InputArray H1, InputArray H2, int method );
参数说明:
H1:第一个要比较直方图。
H2: 第二个要直方图,与H1相同大小。
method :比较的方法,参见#HistCompMethods,对于Correlation and Intersection方法,度量值越高,匹配越准确。Square 和Bhattacharyya distance 则相反。代码示例:
cv::Mat image = cv::imread("D:\\QtProject\\Opencv_Example\\Hist\\Hist.png", cv::IMREAD_GRAYSCALE); if (image.empty()) { cout << "Cannot load image" << endl; return; } imshow("image",image); const int bins[1] = { 256 }; float hranges[2] = { 0,255 }; const float* ranges[1] = { hranges }; Mat hist; // 计算直方图 calcHist(&image, 1, 0, Mat(), hist, 1, bins, ranges); normalize(hist, hist, 0, 1, NORM_MINMAX, -1, Mat()); //将数据规皈依到0和1之间 cv::Mat imageCvert; image.convertTo(imageCvert, -1, 1, 50); imshow( "imageCvert", imageCvert); Mat histCompare; calcHist(&imageCvert, 1, 0, Mat(), histCompare, 1, bins, ranges); normalize(histCompare, histCompare, 0, 1, NORM_MINMAX, -1, Mat()); //将数据规皈依到0和1之间 double CORREL = compareHist( hist, histCompare, HISTCMP_CORREL ); double CHISQR = compareHist( hist, histCompare, HISTCMP_CHISQR ); double INTERSECT = compareHist( hist, histCompare, HISTCMP_INTERSECT ); double BHATTACHARYYA = compareHist( hist, histCompare, HISTCMP_BHATTACHARYYA ); cout << "HISTCMP_CORREL:" << CORREL<<endl << "HISTCMP_CHISQR:" << CHISQR << endl << "HISTCMP_INTERSECT:" << INTERSECT << endl << "HISTCMP_BHATTACHARYYA:" << BHATTACHARYYA << endl;
比较的两张图像:
运行结果:
-
【14】opencv直方图
2022-03-26 09:46:40参考:【OpenCV学习笔记】之直方图(Histogram)_点滴成海~的博客-CSDN博客_histogram 定义: 在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,他的两个坐标分别是统计样本(图像、视频帧... -
python-opencv直方图绘制与直方图均衡
2022-06-20 19:27:28本文主要介绍如何使用pythono-opencv绘制灰度图像的直方图,并且进行直方图均衡处理。 -
OpenCV 直方图均衡化
2022-01-24 10:49:17文章目录直方图均衡化介绍图像的直方图是什么?更形象解释什么是直方图均衡化?直方图均衡化是如何实现的?直方图均衡化的作用直方图均衡化步骤相关APIequalizeHist代码示例 直方图均衡化介绍 图像的直方图是什么? ... -
OpenCV基础(16)OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)
2021-09-29 14:43:58在本教程中,您将学习使用OpenCV实现直方图均衡化和自适应直方图均衡化(CLAHE)。 直方图均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度。这样做可以使低对比度的区域在... -
OpenCV 直方图计算
2022-01-24 11:19:32文章目录直方图计算介绍直方图均值化概念直方图计算直方图最常见的几个属性:相关APIsplitminMaxLoccalcHist代码示例 直方图计算介绍 直方图均值化概念 可以参考我的另一篇博文:... -
详解python OpenCV学习笔记之直方图均衡化
2020-09-20 19:37:31本篇文章主要介绍了详解python OpenCV学习笔记之直方图均衡化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
opencv直方图计算
2019-07-02 19:29:18直方图是对数据的集合统计,并将统计结果分布于一系列预定义的bins中。这里的数据不仅仅指的是灰度值 (如上一篇您所看到的), 统计数据可能是任何能有效描述图像的特征。先看一个例子吧。 假设有一个矩阵包含一张... -
OpenCV 直方图处理:直方图均衡和规定化(匹配)
2021-02-10 21:17:16灰度直方图是图像中像素灰度集的一种统计反应。它能够描述图像中灰度的分布情况,直观地展现出图像中灰度所占多少。直方图横轴表示像素的灰度范围(比如说 0~255),纵轴表示的是像素的数量或者密度。亮暗、对比度、... -
python opencv 直方图反向投影的方法
2020-09-20 18:23:19主要介绍了python opencv 直方图反向投影的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
Python使用OpenCV直方图均衡化
2021-06-14 20:48:18灰度图均衡化处理,并绘制直方图 import cv2 from matplotlib import pyplot # 读取图片 im = cv2.imread("D:/src/test_image/4.png", 0) cv2.imshow("gray", im) # 直方图均衡化处理 im_eq = cv2.equalizeHist... -
Opencv直方图规定化(直方图匹配)
2020-09-06 13:29:12在某些指定的情况下,需要将直方图映射为指定的分布形式。这就是直方图规定化。不同图像之间的像素数目可能不同,为了使两个图像直方图能够匹配,需要使用概率形式表示每个灰度值在图像像素中所占的比例。在理想状态... -
43_OpenCV直方图基本操作
2022-06-13 15:03:07OpenCv中直方图基本操作; 计算直方图; 归一化/阈值化/找出显著区间; 比较两个直方图 -
OpenCV直方图的绘制
2020-03-02 17:30:10OpenCV直方图的绘制 1.直方图的绘制 直方图是通过将整个变量值范围划分为小的值范围,然后计算每个间隔中落入多少个值来创建的。 使用calcHist函数计算直方图,函数原型: void calcHist( const Mat* images, int ... -
OpenCV直方图均衡化的实现
2018-11-03 16:53:39目录计算一幅图像的直方图OpenCV计算直方图Histogram1D类的创建图像直方图计算OpenCV直方图均衡 计算一幅图像的直方图 图像是由不同数值的颜色像素组成,像素值在整幅图像中的分布情况是该图像的一个重要属性。直方... -
Python opencv 直方图均衡化
2021-08-30 17:18:17直方图均衡化分为两种:一种是直方图均衡化,一种是自适应直方图均衡化 图像领域又分为三种:灰度图均衡化、彩色图均衡化、YUV 直方图均衡化 所谓的均衡化又称为图像增强 我一般用的最多的是直方图均衡化和自适应... -
Python之OpenCV直方图统计及均衡化
2021-04-22 10:38:460 背景 在做图像处理时,经常需要对图像的像素分布情况...图像直方图是用一表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布的直方图。这种直方图中 -
opencv直方图均衡化
2014-05-20 16:29:03opencv直方图均衡化程序,对学习opencv编程的会有所帮助 -
opencv 直方图处理详细介绍
2020-07-27 14:28:39直方图处理 直方图是图像处理过程中的一种非常重要的分析工具。直方图从图像内部灰度级的角度对图像进行表述,包含十分丰富而重要的信息。从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的。 1、 直方... -
OpenCV直方图正规化(归一化)
2020-09-02 13:02:58图像直方图描述了图像中灰度值的分布情况,直方图均衡化就是通过拉伸像素强度分布范围来增强图像对比度的一种方法。 可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是拉伸这个范围。如下: 作... -
030-OpenCV直方图均衡化、自适应均衡化
2022-01-30 09:37:53一般为256 # ranges:像素值的范围,一般为[0,255]表示0~255 # hist: 输出的目标直方图 # accumulate: 累计标识符, 默认值false, 若为true, 直方图在配置阶段不会被清零 ''' hist = cv2.calcHist([img], [0], None, ... -
OpenCV 直方图概述以及统计直方图
2020-04-21 12:02:22能够使用OpenCV或者Numpy函数计算直方图 使用OpenCV或者Matplotlib函数绘制直方图 学会cv2.calcHist(),np.histogram()函数的使用 了解直方图 直方图的x轴是灰度值(0~255)、y轴是图片中具有同一个灰度值的点的数目...