(非直接利用函式)python繪製灰度影象直方圖及其均衡化
阿新 • • 發佈:2019-01-27
由於學習的需要,利用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()