1. 程式人生 > >python-OpenCV之對比度增強

python-OpenCV之對比度增強

簡介

對比度指的是一幅影象中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,差異範圍越大代表對比越大,差異範圍越小代表對比越小。對比度增強技術主要解決影象灰度級範圍較小造成的對比度低問題,目的是將影象的灰度級放大到指定的程度,使影象中的細節看起來更加清晰。

基礎知識

灰度直方圖

概念:灰度直方圖是影象灰度級的函式,用來描述每個灰度級在影象矩陣中的畫素個數或佔有率。

python實現過程

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np


# 計算灰度直方圖
def calcGrayHist(image):
    rows, cols = image.shape
    grayHist = np.zeros([256], np.uint8)
    for r in range(rows):
        for c in range(cols):
            grayHist[image[r][c]] += 1
    return grayHist


if __name__ == "__main__":
    # 讀入圖片
    image = cv.imread('test.jpg', flags=0)
    # 計算灰度直方圖
    grayHist = calcGrayHist(image)

    # 設定x範圍
    x_range = range(256)
    # 繪製直方圖
    plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')
    # 設定y的範圍
    y_maxValue = np.max(grayHist)
    plt.axis([0, 255, 0, y_maxValue])
    # 設定座標軸標籤
    plt.xlabel('gray Level')
    plt.ylabel('number of pixels')
    # 顯示直方圖
    plt.show()

對比度增強方式

線性變換

解釋:

假設輸入圖片為I,寬為w,高為h,輸出影象記為O,影象的線性變換公式為

                                           O(r,c) = a*I(r,c)+b,    0<=r<h, o<=c<w

a為係數。a>1時,影象對比度被放大,0<a<1時影象對比度被縮小。常數項b用於調節亮度,b>0時亮度增強,b<0時對比度降低。

python實現過程

import cv2 as cv
import numpy as np

I = cv.imread('test.jpg', flags=0)
a = 2
O = I * float(a)
O[O > 255] = 255
O = np.round(O)
O = O.astype(np.uint8)

cv.imshow('I', I)
cv.imwrite('I.jpg', I)
cv.imshow('O', O)
cv.imwrite('O.jpg', O)
cv.waitKey()
cv.destroyAllWindows()
原圖
輸出圖片

直方圖正規化

線性變換系數的選擇帶有一定的盲目性,如果可以自動確定a和b的值,那豈不妙哉。直方圖正規化就是我們所需要的這種方法。

解釋: