Python 圖像對(duì)比度增強(qiáng)的幾種方法(小結(jié))
圖像處理工具——灰度直方圖
灰度直方圖時(shí)圖像灰度級(jí)的函數(shù),用來描述每個(gè)灰度級(jí)在圖像矩陣中的像素個(gè)數(shù)或者占有率。
例子:矩陣
圖片來自網(wǎng)絡(luò),侵刪!
上面圖片的灰度直方圖
python實(shí)現(xiàn)
#!usr/bin/env python #-*- coding:utf-8 _*- """ @author:Sui yue @describe: 灰度直方圖,描述每個(gè)灰度級(jí)在圖像矩陣中的像素個(gè)數(shù)或者占有率 @time: 2019/09/15 """ import sys import cv2 import numpy as np import matplotlib.pyplot as plt #對(duì)于8位圖,圖像的灰度級(jí)范圍式0~255之間的整數(shù),通過定義函數(shù)來計(jì)算直方圖 def calcGrayHist(image): #灰度圖像矩陣的高、寬 rows, cols = image.shape #存儲(chǔ)灰度直方圖 grayHist=np.zeros([256],np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]] +=1 return grayHist #主函數(shù) if __name__=="__main__": #第一個(gè)參數(shù)式圖片地址,你只需放上你的圖片就可 image = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE) cv2.imshow("image", image) print("Usge:python histogram.py imageFile") #計(jì)算灰度直方圖 grayHist=calcGrayHist(image) #畫出灰度直方圖 x_range=range(256) plt.plot(x_range,grayHist,'r',linewidth=2,c='black') #設(shè)置坐標(biāo)軸的范圍 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)
結(jié)果
線性變換
假設(shè)輸入圖像為I,寬W、高為H,輸出圖像為O,圖像的線性變換可以利用以下公式:
a的改變影響圖像的對(duì)比度,b的改變影響圖像的亮度
線性變換python實(shí)現(xiàn)
#!usr/bin/env python3 #-*- coding:utf-8 -*- #-------------------------- """ @author:Sui yue @describe: 對(duì)比增強(qiáng),線性變換 @time: 2019/09/15 14:21:44 """ import sys import numpy as np import cv2 import matplotlib.pyplot as plt #主函數(shù) def calcGrayHist(image): #灰度圖像矩陣的高、寬 rows, cols = image.shape #存儲(chǔ)灰度直方圖 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') # 設(shè)置坐標(biāo)軸的范圍 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 #進(jìn)行數(shù)據(jù)截?cái)啵笥?55 的值要截?cái)酁?55 O[0>255]=255 #數(shù)據(jù)類型轉(zhuǎn)換 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()
線性變換結(jié)果
灰度直方圖
直方圖正規(guī)化
假設(shè)輸入圖像為I,寬W、高為H,
其中
直方圖正規(guī)化python實(shí)現(xiàn)
#!usr/bin/env python3 #-*- coding:utf-8 -*- #-------------------------- """ @author:Sui yue @describe: 直方圖正規(guī)化 @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 #存儲(chǔ)灰度直方圖 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') # 設(shè)置坐標(biāo)軸的范圍 y_maxValue = np.max(grayHist) plt.axis([0, 255, 0, y_maxValue]) plt.ylabel('gray level') plt.ylabel("number or pixels") # 顯示灰度直方圖 plt.show() #主函數(shù) if __name__ == '__main__': #讀入圖像 I = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE) #求I的最大值,最小值 Imax=np.max(I) Imin=np.min(I) #要輸出的最小灰度級(jí)和最大灰度級(jí) Omax,Omin=255,0 #計(jì)算a和b的值 ,測試出*4 能看到人臉 a=float(Omax-Omin)/(Imax-Imin) b=Omin-a*Imin #矩陣的線性變換 O=a*I+b #數(shù)據(jù)類型轉(zhuǎn)換 O=O.astype(np.uint8) #顯示原圖和直方圖正規(guī)化的效果 cv2.imshow("I",I) cv2.imshow("O",O) calcGrayHist(O) cv2.waitKey(0) cv2.destroyAllWindows()
直方圖正規(guī)化結(jié)果
伽馬變換
假設(shè)輸入圖像為I,寬W、高為H,首先將其灰度值歸一化到
當(dāng)
伽馬變換python實(shí)現(xiàn)
#!usr/bin/env python3 #-*- coding:utf-8 -*- #-------------------------- """ @author:Sui yue @describe: 對(duì)比增強(qiáng) 伽馬變換 @time: 2019/09/18 22:22:51 """ import cv2 import numpy as np import sys #主函數(shù) 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()
伽馬變換結(jié)果
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python讀取Excel一列并計(jì)算所有對(duì)象出現(xiàn)次數(shù)的方法
這篇文章主要給大家介紹了關(guān)于Python讀取Excel一列并計(jì)算所有對(duì)象出現(xiàn)次數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python實(shí)現(xiàn)PDF轉(zhuǎn)為Excel的示例講解
這篇文章主要為大家詳細(xì)介紹了在Python中將PDF表格轉(zhuǎn)換為Excel文件的解決方案,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11Python plt 利用subplot 實(shí)現(xiàn)在一張畫布同時(shí)畫多張圖
這篇文章主要介紹了Python plt 利用subplot 實(shí)現(xiàn)在一張畫布同時(shí)畫多張圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程
pyinstaller是一個(gè)第三方庫,它能夠在Windows、Linux、 Mac OS X 等操作系統(tǒng)下將 Python 源文件打包,通過對(duì)源文件打包,這篇文章主要介紹了Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程,需要的朋友可以參考下2023-11-11Python判斷素?cái)?shù)的3種方法及for-else語句的用法介紹
素?cái)?shù)又叫質(zhì)數(shù),指的是>1的整數(shù)中,只能被1和這個(gè)數(shù)本身整除的數(shù),這篇文章主要給大家介紹了關(guān)于Python判斷素?cái)?shù)的3種方法及for-else語句的用法介紹的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05Python?matplotlib之折線圖的各種樣式與畫法總結(jié)
matplotlib是Python中的一個(gè)第三方庫,主要用于開發(fā)2D圖表,以漸進(jìn)式、交互式的方式實(shí)現(xiàn)數(shù)據(jù)可視化,可以更直觀的呈現(xiàn)數(shù)據(jù),使數(shù)據(jù)更具說服力,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib之折線圖的各種樣式與畫法的相關(guān)資料,需要的朋友可以參考下2022-12-12