Python 影象對比度增強的幾種方法(小結)
影象處理工具——灰度直方圖
灰度直方圖時影象灰度級的函式,用來描述每個灰度級在影象矩陣中的畫素個數或者佔有率。
例子:矩陣
圖片來自網路,侵刪!
上面圖片的灰度直方圖
python實現
#!usr/bin/env python #-*- coding:utf-8 _*- """ @author:Sui yue @describe: 灰度直方圖,描述每個灰度級在影象矩陣中的畫素個數或者佔有率 @time: 2019/09/15 """ import sys import cv2 import numpy as np import matplotlib.pyplot as plt #對於8點陣圖,影象的灰度級範圍式0~255之間的整數,通過定義函式來計算直方圖 def calcGrayHist(image): #灰度影象矩陣的高、寬 rows,cols = image.shape #儲存灰度直方圖 grayHist=np.zeros([256],np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]] +=1 return grayHist #主函式 if __name__=="__main__": #第一個引數式圖片地址,你只需放上你的圖片就可 image = cv2.imread('../images/test3.jpg',cv2.IMREAD_GRAYSCALE) cv2.imshow("image",image) print("Usge:python histogram.py imageFile") #計算灰度直方圖 grayHist=calcGrayHist(image) #畫出灰度直方圖 x_range=range(256) plt.plot(x_range,grayHist,'r',linewidth=2,c='black') #設定座標軸的範圍 y_maxValue=np.max(grayHist) plt.axis([0,255,y_maxValue]) plt.ylabel('gray level') plt.ylabel("number or pixels") # 顯示灰度直方圖 plt.show() cv2.waitKeyEx(0)
結果
線性變換
假設輸入影象為I,寬W、高為H,輸出影象為O,影象的線性變換可以利用以下公式:
a的改變影響影象的對比度,b的改變影響影象的亮度
線性變換python實現
#!usr/bin/env python3 #-*- coding:utf-8 -*- #-------------------------- """ @author:Sui yue @describe: 對比增強,線性變換 @time: 2019/09/15 14:21:44 """ import sys import numpy as np import cv2 import matplotlib.pyplot as plt #主函式 def calcGrayHist(image): #灰度影象矩陣的高、寬 rows,np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]] +=1 # 顯示灰度直方圖 # 畫出灰度直方圖 x_range = range(256) plt.plot(x_range,c='black') # 設定座標軸的範圍 y_maxValue = np.max(grayHist) plt.axis([0,y_maxValue]) plt.ylabel('gray level') plt.ylabel("number or pixels") # 顯示灰度直方圖 plt.show() if __name__=="__main__": # 讀影象 I = cv2.imread('../images/test3.jpg',cv2.IMREAD_GRAYSCALE) #線性變換 a=3 O=float(a)*I #進行資料截斷,大於255 的值要截斷為255 O[0>255]=255 #資料型別轉換 O=np.round(O) #uint8型別 O=O.astype(np.uint8) #顯示原圖和線性變換後的效果 cv2.imshow("I",I) cv2.imshow("O",O) calcGrayHist(I) calcGrayHist(O) cv2.waitKey(0) cv2.destroyAllWindows()
線性變換結果
灰度直方圖
直方圖正規化
假設輸入影象為I,寬W、高為H,
其中
直方圖正規化python實現
#!usr/bin/env python3 #-*- coding:utf-8 -*- #-------------------------- """ @author:Sui yue @describe: 直方圖正規化 @time: 2019/09/18 21:17:22 """ import cv2 import numpy as np import matplotlib.pyplot as plt import sys def calcGrayHist(image): #灰度影象矩陣的高、寬 rows,y_maxValue]) plt.ylabel('gray level') plt.ylabel("number or pixels") # 顯示灰度直方圖 plt.show() #主函式 if __name__ == '__main__': #讀入影象 I = cv2.imread('../images/test3.jpg',cv2.IMREAD_GRAYSCALE) #求I的最大值,最小值 Imax=np.max(I) Imin=np.min(I) #要輸出的最小灰度級和最大灰度級 Omax,Omin=255,0 #計算a和b的值,測試出*4 能看到人臉 a=float(Omax-Omin)/(Imax-Imin) b=Omin-a*Imin #矩陣的線性變換 O=a*I+b #資料型別轉換 O=O.astype(np.uint8) #顯示原圖和直方圖正規化的效果 cv2.imshow("I",O) calcGrayHist(O) cv2.waitKey(0) cv2.destroyAllWindows()
直方圖正規化結果
伽馬變換
假設輸入影象為I,寬W、高為H,首先將其灰度值歸一化到
當
伽馬變換python實現
#!usr/bin/env python3 #-*- coding:utf-8 -*- #-------------------------- """ @author:Sui yue @describe: 對比增強 伽馬變換 @time: 2019/09/18 22:22:51 """ import cv2 import numpy as np import sys #主函式 if __name__ == '__main__': I = cv2.imread('../images/test3.jpg',cv2.IMREAD_GRAYSCALE) #影象歸一化 fI=I/255.0 #伽馬變換 gamma=0.3 O=np.power(fI,gamma) #顯示原圖和伽馬變換 cv2.imshow("I",I) cv2.imshow("O",O) cv2.waitKey() cv2.destroyAllWindows()
伽馬變換結果
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。