對(duì)比度檢測(cè)與增強(qiáng)算法

一、對(duì)比度檢測(cè)

對(duì)比度通俗地講就是亮暗的拉伸對(duì)比程度,指的是一幅圖像中明暗區(qū)域最亮的白和最暗的黑之間不同亮度層級(jí)的測(cè)量,差異范圍越大代表對(duì)比越大,差異范圍越小代表對(duì)比越小。
對(duì)比度通常表現(xiàn)了圖像畫質(zhì)的清晰程度。通過如下方法可以計(jì)算對(duì)比度

def calc_contrast(img):
    '''
    計(jì)算對(duì)比度
    '''
    img1 = np.array(img.convert('L'))
    m, n = img1.shape
    # 圖片矩陣向外擴(kuò)展一個(gè)像素
    img1_ext = cv.copyMakeBorder(img1, 1,1,1,1, cv.BORDER_REPLICATE) 
    rows_ext, cols_ext = img1_ext.shape
    b = 0.0
    for i in range(1, rows_ext-1):
        for j in range(1, cols_ext-1):
            b += ((img1_ext[i,j]-img1_ext[i,j+1])**2 +
                  (img1_ext[i,j]-img1_ext[i,j-1])**2 +
                  (img1_ext[i,j]-img1_ext[i+1,j])**2 +
                  (img1_ext[i,j]-img1_ext[i-1,j])**2
                 )

    cg = b/(4*(m-2)*(n-2)+3*(2*(m-2)+2*(n-2))+2*4)
    return cg

二、對(duì)比度增強(qiáng)

1、直方圖均衡化

直方圖均衡化處理的“中心思想”是把原始圖像的灰度直方圖從比較集中的某個(gè)灰度區(qū)間變成在全部灰度范圍內(nèi)的均勻分布。

def image_histeq(pil_im):
    '''
    直方圖均衡化
    INPUT  -> 單張圖文件
    OUTPUT -> 處理后的圖文件
    '''
    # 計(jì)算圖像的直方圖
    image_arr = image_to_array(pil_im)
    imhist, bins = np.histogram(image_arr.flatten(), 256, normed=True)
    cdf = imhist.cumsum()   # 累計(jì)分布函數(shù)
    cdf = 255*cdf/cdf[-1]   # 歸一化
    # 使用累計(jì)分布函數(shù)的線性插值計(jì)算新的像素值
    image_arr2 = np.interp(image_arr.flatten(), bins[:-1], cdf)
    return array_to_image(image_arr2.reshape(image_arr.shape))

2、自適應(yīng)直方圖均衡化

自適應(yīng)直方圖均衡化(AHE)用來提升圖像的對(duì)比度的一種計(jì)算機(jī)圖像處理技術(shù)。和普通的直方圖均衡算法不同,AHE算法通過計(jì)算圖像的局部直方圖,然后重新分布亮度來改變圖像對(duì)比度。因此,該算法更適合于改進(jìn)圖像的局部對(duì)比度以及獲得更多的圖像細(xì)節(jié)。

#-*- coding:utf-8 -*-
import cv2 as cv
import numpy as np
import math
from PIL import Image
import matplotlib.pyplot as plt

def array_to_image(image_arr):
    '''
    數(shù)組還原為圖片
    INPUT  -> 數(shù)組
    OUTPUT -> 單張圖文件
    '''
    if len(image_arr.shape) == 3:  # 格式為(height(rows), weight(colums), 3)
        r = Image.fromarray(np.uint8(image_arr[:,:,0]))
        g = Image.fromarray(np.uint8(image_arr[:,:,1]))
        b = Image.fromarray(np.uint8(image_arr[:,:,2]))
        image = Image.merge("RGB", (r, g, b))
        return image        
    elif len(image_arr.shape) == 2:  # 格式為(height(rows), weight(colums))
        return Image.fromarray(np.uint8(image_arr))

img_arr = np.array(Image.open('tools/33.jpg').convert('L'))
 
# 標(biāo)準(zhǔn)化
mri_max = np.amax(img_arr)
mri_min = np.amin(img_arr)
mri_img = ((img_arr-mri_min)/(img_arr-mri_min))*255
mri_img = img_arr.astype('uint8')

clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
img = clahe.apply(mri_img)

# 可視化
plt.imshow(array_to_image(img))
plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容