精华内容
下载资源
问答
  • opencv 直方图
    千次阅读
    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);
    
    更多相关内容
  • 与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 定义: 在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,他的两个坐标分别是统计样本(图像、视频帧...
  • 本文主要介绍如何使用pythono-opencv绘制灰度图像的直方图,并且进行直方图均衡处理。
  • OpenCV 直方图均衡化

    2022-01-24 10:49:17
    文章目录直方图均衡化介绍图像的直方图是什么?更形象解释什么是直方图均衡化?直方图均衡化是如何实现的?直方图均衡化的作用直方图均衡化步骤相关APIequalizeHist代码示例 直方图均衡化介绍 图像的直方图是什么? ...
  • 在本教程中,您将学习使用OpenCV实现直方图均衡化和自适应直方图均衡化(CLAHE)。 直方图均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度。这样做可以使低对比度的区域在...
  • OpenCV 直方图计算

    2022-01-24 11:19:32
    文章目录直方图计算介绍直方图均值化概念直方图计算直方图最常见的几个属性:相关APIsplitminMaxLoccalcHist代码示例 直方图计算介绍 直方图均值化概念 可以参考我的另一篇博文:...
  • 本篇文章主要介绍了详解python OpenCV学习笔记之直方图均衡化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • opencv直方图计算

    2019-07-02 19:29:18
    直方图是对数据的集合统计,并将统计结果分布于一系列预定义的bins中。这里的数据不仅仅指的是灰度值 (如上一篇您所看到的), 统计数据可能是任何能有效描述图像的特征。先看一个例子吧。 假设有一个矩阵包含一张...
  • 灰度直方图是图像中像素灰度集的一种统计反应。它能够描述图像中灰度的分布情况,直观地展现出图像中灰度所占多少。直方图横轴表示像素的灰度范围(比如说 0~255),纵轴表示的是像素的数量或者密度。亮暗、对比度、...
  • 主要介绍了python opencv 直方图反向投影的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 灰度图均衡化处理,并绘制直方图 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中直方图基本操作; 计算直方图; 归一化/阈值化/找出显著区间; 比较两个直方图
  • OpenCV直方图的绘制

    2020-03-02 17:30:10
    OpenCV直方图的绘制 1.直方图的绘制 直方图是通过将整个变量值范围划分为小的值范围,然后计算每个间隔中落入多少个值来创建的。 使用calcHist函数计算直方图,函数原型: void calcHist( const Mat* images, int ...
  • OpenCV直方图均衡化的实现

    万次阅读 2018-11-03 16:53:39
    目录计算一幅图像的直方图OpenCV计算直方图Histogram1D类的创建图像直方图计算OpenCV直方图均衡 计算一幅图像的直方图 图像是由不同数值的颜色像素组成,像素值在整幅图像中的分布情况是该图像的一个重要属性。直方...
  • 直方图均衡化分为两种:一种是直方图均衡化,一种是自适应直方图均衡化 图像领域又分为三种:灰度图均衡化、彩色图均衡化、YUV 直方图均衡化 所谓的均衡化又称为图像增强 我一般用的最多的是直方图均衡化和自适应...
  • Python之OpenCV直方图统计及均衡化

    千次阅读 2021-04-22 10:38:46
    0 背景 在做图像处理时,经常需要对图像的像素分布情况...图像直方图是用一表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布的直方图。这种直方图
  • opencv直方图均衡化

    2014-05-20 16:29:03
    opencv直方图均衡化程序,对学习opencv编程的会有所帮助
  • 直方图处理 直方图是图像处理过程中的一种非常重要的分析工具。直方图从图像内部灰度级的角度对图像进行表述,包含十分丰富而重要的信息。从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的。 1、 直方...
  • OpenCV直方图正规化(归一化)

    千次阅读 2020-09-02 13:02:58
    图像直方图描述了图像中灰度值的分布情况,直方图均衡化就是通过拉伸像素强度分布范围来增强图像对比度的一种方法。 可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是拉伸这个范围。如下: 作...
  • 一般为256 # ranges:像素值的范围,一般为[0,255]表示0~255 # hist: 输出的目标直方图 # accumulate: 累计标识符, 默认值false, 若为true, 直方图在配置阶段不会被清零 ''' hist = cv2.calcHist([img], [0], None, ...
  • 能够使用OpenCV或者Numpy函数计算直方图 使用OpenCV或者Matplotlib函数绘制直方图 学会cv2.calcHist(),np.histogram()函数的使用 了解直方图 直方图的x轴是灰度值(0~255)、y轴是图片中具有同一个灰度值的点的数目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,699
精华内容 9,879
关键字:

opencv 直方图