1. 程式人生 > >(非直接利用函式)python繪製灰度影象直方圖及其均衡化

(非直接利用函式)python繪製灰度影象直方圖及其均衡化

由於學習的需要,利用python和opencv實現簡單的灰度圖直方圖繪製及其均衡化 。

程式碼如下

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

#畫直方圖
def zhifangtu(image): 
    a = [0]*256       #建立儲存畫素數的一維陣列
    w = image.shape[0]#得到影象寬高
    h = image.shape[1]
    #計算灰度畫素數
    for i in range(w):
        for j in range(h):
            gray = image[i,j]
            a[gray] += 1
    #以灰度為x軸畫素數為y軸畫直方圖        
    y = a
    x = [i for i in range(256)]
    plt.figure()
    plt.title("zhifangtu")
    plt.xlabel("Bins")
    plt.ylabel("Pixels")
    plt.plot(x,y)
    plt.xlim([0,256])
    return a          #返回灰度畫素數

#將影象均衡化
def junhenghua(a,image):#入口引數:灰度畫素數和圖片
    b = [0]*256#儲存個灰度畫素佔比資料
    c = [0]*256#儲存累計分佈資料
    w = image.shape[0]
    h = image.shape[1]
    mn = w*h*1.0
    img = np.zeros([w,h],np.uint8)#建立空陣列儲存均衡化後資料
    
    #計算灰度分佈密度
    for i in range(len(a)):
        b[i] = a[i]/mn
    #計算累計直方圖資料    
    for i in range(len(c)):
        if i == 1:
            c[i] = b[i]
        else:
            c[i] = c[i-1]+b[i]
            a[i] = int(255*c[i])
    #對各灰度值進行均衡化對映        
    for i in range(w):
        for j in range(h): 
            img[i,j] = a[image[i,j]]
    
    return img#返回均衡化後圖像
    
        
image = cv.imread("D:/test/aaa.tif",0)#讀取灰度影象
cv.imshow("base",image)               
a = zhifangtu(image)                  #畫原始影象直方圖並得到灰度畫素數
b = junhenghua(a,image)               #將影象均衡化
cv.imshow('junhenghua',b)             
zhifangtu(b)                          #畫均衡化後圖像直方圖
plt.show()                            

原直方圖:均衡化後: