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的值 ,測(cè)試出*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é)果

以上就是本文的全部?jī)?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-09
Python實(shí)現(xiàn)PDF轉(zhuǎn)為Excel的示例講解
這篇文章主要為大家詳細(xì)介紹了在Python中將PDF表格轉(zhuǎn)換為Excel文件的解決方案,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
Python plt 利用subplot 實(shí)現(xiàn)在一張畫布同時(shí)畫多張圖
這篇文章主要介紹了Python plt 利用subplot 實(shí)現(xiàn)在一張畫布同時(shí)畫多張圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程
pyinstaller是一個(gè)第三方庫,它能夠在Windows、Linux、 Mac OS X 等操作系統(tǒng)下將 Python 源文件打包,通過對(duì)源文件打包,這篇文章主要介紹了Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程,需要的朋友可以參考下2023-11-11
Python判斷素?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-05
Python?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

