OpenCV---直方图的应用(均衡化和图像比较)

一:全局直方图均衡化(对比度增强)equalizeHist

def equalHist_demo(image):  #OpenCV直方图均衡化都是基于灰度图像
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    dst = cv.equalizeHist(gray) #直方图均衡化,对比度增强
    cv.imshow("equalHist_demo",dst)
1.cv2.equalizeHist函数原型:equalizeHist(src[, dst]) -> dst。函数equalizeHist的作用:直方图均衡化,提高图像质量。
2.直方图均衡化:如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。
它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
3.全局直方图均衡化可能得到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。
Opencv中还有一种直方图均衡化,它是一种局部直方图均衡化,也就是是说把整个图像分成许多小块(比如按10*10作为一个小块),那么对每个小块进行均衡化。

全局的对比度太强

二:自适应的局部的直方图均衡化createCLAHE

def clahe_demo(image):  #OpenCV直方图均衡化都是基于灰度图像
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
    dst = clahe.apply(gray)  #将灰度图像和局部直方图相关联
    cv.imshow("clahe_demo",dst)
1.createCLAHE函数原型:createCLAHE([, clipLimit[, tileGridSize]]) -> retval
clipLimit参数表示对比度的大小。
tileGridSize参数表示每次处理块的大小 。

三:直方图的比较

def create_rag_hist(image):
    h,w,c = image.shape
    rgbHist = np.zeros([16*16*16,1],np.float32)
    bsize = 256/16  #间隔是16
    for row in range(h):
        for col in range(w):
            b = image[row,col,0]
            g = image[row,col,1]
            r = image[row,col,2]
            index = np.int(b/bsize)*16*16 + np.int(g/bsize)*16 + np.int(r/bsize)
            rgbHist[np.int(index),0] = rgbHist[np.int(index),0] + 1
    return rgbHist

def hist_compare(image1,image2):
    hist1 = create_rag_hist(image1)
    hist2 = create_rag_hist(image2)
    match1 = cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA)   #巴氏距离比较,越小越相似
    match2 = cv.compareHist(hist1,hist2,cv.HISTCMP_CORREL)   #相关性比较(最大为1):越接近1越相似
    match3 = cv.compareHist(hist1,hist2,cv.HISTCMP_CHISQR)   #卡方比较,越小越相似
    print("巴氏:%s    相关性:%s  卡方:%s"%(match1,match2,match3))
hist_compare(src,src)  #当我们使用两张一样的图像比较
巴氏:0.0    相关性:1.0  卡方:0.0

原文地址:https://www.cnblogs.com/ssyfj/p/9270608.html

时间: 2024-08-30 18:09:43

OpenCV---直方图的应用(均衡化和图像比较)的相关文章

《OpenCV:直方图应用:直方图均衡化,直方图匹配,对比直方图》

直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种.对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值由输入像素点决定,即: 直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数过程.从分布图上的理解就是希望原始图像中y轴的值在新的分布中尽可能的展开.变换过程是利用累积分布函数对原始分布进行映射,生成新的均匀拉伸的分布.因此对应每个点的操作是寻找原始分布

OpenCV —— 直方图与匹配

直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中.bin中的数值是从数据中计算出来的特征的统计量,这些数据可以是诸如梯度,方向,色彩或任何其他特征. 直方图获得是是数据分布的统计图 直方图的基本数据结构 CvHistogram 创建一个新的直方图 cvCreateHist dims   直方图维数的数目 sizes  直方图维数尺寸的数组 type  直方图的表示格式: CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND; CV_HIST_TREE

opencv2对读书笔记——反投影直方图以检测待定的图像内容

一些小概念 1.直方图是图像内容的一个重要特性. 2.如果一幅图像的区域中显示的是一种独特的纹理或是一个独特的物体,那么这个区域的直方图可以看作是一个概率函数,它给出的是某个像素属于该纹理或物体的概率. 3.反投影直方图的作用是在于替换一个输入图像中每一个像素值,使其变成归一化直方图中对应的概率值. 这是一个什么样的过程 名字听起来感觉很高端,其实这个一个很简单的过程. 1.首先我们截取一个区域,作为目标区域. 2.然后将目标区域取直方图,并将其直方图归一化,并得到这个区域的概率. 3.利用ca

OpenCV Python教程(1、图像的载入、显示和保存)

本文转载自 OpenCV Python教程(1.图像的载入.显示和保存)     作者 Daetalus 本文是OpenCV  2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonOpenCV的配置这里就不介绍了. 注意,现在OpenCV for Python就是通过NumPy进行绑定的.所以在使用时必须掌握一些NumPy的相关知识! 图像就是一个矩阵,在OpenCV fo

OpenCV使用Canny边缘检测器实现图像边缘检测

纯粹阅读,请移步OpenCV使用Canny边缘检测器实现图像边缘检测 效果图 源码 KqwOpenCVFeaturesDemo Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化. Canny边缘检测器算法基本步骤 平滑图像:通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声. 计算图像的梯度:这里计算图像的梯度,并将梯度分类为垂直.水平和斜对角.这一步的输出用于在下一步中计算真正的边缘. 非最大值抑制:

【opencv系列02】OpenCV4.X图像读取与显示

一.读取图片 opencv中采用imread() 函数读取图像 imread(filename, flags=None) ????filename 图片的路径 ????flags 图像读取方式 ● cv2.IMREAD_COLOR : 加载彩色图像, 图像的任何透明度都将被忽略(默认). ● cv2.IMREAD_GRAYSCALE : 以灰度模式加载图像. ● cv2.IMREAD_UNCHANGED : 加载包含Alpha通道的图像. 也可以使用1, 0 or -1代替,源码中,IMREAD

OpenCV——直方图均衡化(用于图像增强)

1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char** argv) 10 { 11 Mat src,src_gray,dst; 12 //src = imread("3 input.bmp"); 13 s

opencv直方图均衡化

#include <iostream> #include "highgui.h" #include "cv.h" #include "cxcore.h" #include "math.h" using namespace std; using namespace cv; //绘制1维直方图 Mat draw1DHistogram(Mat histogramMat) { double maxVal = 0, minV

opencv 直方图均衡化

将代码中的图片路径换成实际路径即可. #include "stdafx.h" #include "cv.h" #include "highgui.h" #include <highgui.h> #include <cv.h> using namespace std; int main(int argc, char** argv) { int k; IplImage* src = cvLoadImage("..\\