Python3与OpenCV3.3 图像处理(十二)--图像直方图应用

一、调节对比度

 

import cv2 as cv

def equalHist(image):
    """直方图均衡化,图像增强的一个方法"""
    #彩色图片转换为灰度图片
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    
    #直方图均衡化,自动调整图像的对比度,让图像变得清晰
    dst=cv.equalizeHist(gray)
    cv.imshow("equalHist",dst)


def clahe(image):
    """
    局部直方图均衡化
    把整个图像分成许多小块(比如按8*8作为一个小块),
    那么对每个小块进行均衡化。
    这种方法主要对于图像直方图不是那么单一的(比如存在多峰情况)图像比较实用
    """
    # 彩色图片转换为灰度图片
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #cliplimit:灰度值
    #tilegridsize:图像切割成块,每块的大小
    clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
    dst=clahe.apply(gray)
    cv.imshow("clahe", dst)

src=cv.imread('test1.jpg')
#图一
cv.imshow("yt", gray)
#图二
equalHist(src)
#图三
clahe(src)






从图中的可以看出来,图一比较模糊,经过全图的直方图均衡化后,图片变得清晰了(图二),但是图片明显的对比度偏高,利用局部直方图均衡化后(图三),图片看起来就比较舒服了

 

注意:1、全图的直方图均衡化会导致对比度过度增强,所以在一些情况下应使用局部直方图均衡化;

           2、opencv中直方图均衡化都是基于灰度图像的

图一


图二


图三

二、对比图片相似度

 

import cv2 as cv
import numpy as np


def create_rgb_hist(image):
    """创建rgb 三通道直方图"""
    h,w,c=image.shape
    rgbHist=np.zeros([16*16*16,1],np.float32)
    bsize=256/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_rgb_hist(image1)
    hist2=create_rgb_hist(image2)
    #巴氏距离比较,距离越小越相似
    match1=cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA)
    #相关性比较,相关性越大越相似
    match2=cv.compareHist(hist1,hist2,cv.HISTCMP_CORREL)
    # 卡方比较,越大越不相似
    match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
    print("巴氏距离:%s 相关性:%s 卡方:%s"%(match1,match2,match3))



hist_compare(cv.imread('test1.jpg'),cv.imread('textImg.jpg'))

 

觉得不错打赏一下

 

posted @ 2017-12-05 23:31  上帝啊!我的如来!  阅读(263)  评论(0编辑  收藏  举报