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

 

作者:山上有风景
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   山上有风景  阅读(1487)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示