您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么在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,0,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, cols = image.shape #存儲灰度直方圖 grayHist=np.zeros([256],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, grayHist, 'r', linewidth=2, c='black') # 設置坐標軸的范圍 y_maxValue = np.max(grayHist) plt.axis([0, 255, 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, cols = image.shape #存儲灰度直方圖 grayHist=np.zeros([256],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, grayHist, 'r', linewidth=2, c='black') # 設置坐標軸的范圍 y_maxValue = np.max(grayHist) plt.axis([0, 255, 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) #求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",I) cv2.imshow("O",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()
以上就是怎么在Python中增強圖像對比度,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。