Python圖像運算之圖像灰度直方圖對比詳解
一.灰度增強直方圖對比
圖像灰度上移變換使用的表達式為:
DB=DA+50
該算法將實現(xiàn)圖像灰度值的上移,從而提升圖像的亮度,結(jié)合直方圖對比的實現(xiàn)代碼如下所示。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取圖像 img = cv2.imread('lena-hd.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] result = np.zeros((height, width), np.uint8) #圖像灰度上移變換 DB=DA+50 for i in range(height): for j in range(width): if (int(grayImage[i,j]+50) > 255): gray = 255 else: gray = int(grayImage[i,j]+50) result[i,j] = np.uint8(gray) #計算原圖的直方圖 hist = cv2.calcHist([img], [0], None, [256], [0,255]) #計算灰度變換的直方圖 hist_res = cv2.calcHist([result], [0], None, [256], [0,255]) #原始圖像 plt.figure(figsize=(8, 6)) plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off') #繪制掩膜 plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y") #繪制掩膜設(shè)置后的圖像 plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off') #繪制直方圖 plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y") plt.show()
其運行結(jié)果如圖1所示,其中(a)表示原始圖像,(b)表示對應(yīng)的灰度直方圖,(c)表示灰度上移后的圖像,(d)是對應(yīng)的直方圖。對比發(fā)現(xiàn),圖1(d)比圖1(b)的灰度級整體高了50,曲線整體向右平移了50個單位。
二.灰度減弱直方圖對比
該算法將減弱圖像的對比度,使用的表達式為:
DB=DA×0.8
Python結(jié)合直方圖實現(xiàn)灰度對比度減弱的代碼如下所示。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取圖像 img = cv2.imread('lena-hd.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] result = np.zeros((height, width), np.uint8) #圖像對比度減弱變換 DB=DA×0.8 for i in range(height): for j in range(width): gray = int(grayImage[i,j]*0.8) result[i,j] = np.uint8(gray) #計算原圖的直方圖 hist = cv2.calcHist([img], [0], None, [256], [0,255]) #計算灰度變換的直方圖 hist_res = cv2.calcHist([result], [0], None, [256], [0,255]) #原始圖像 plt.figure(figsize=(8, 6)) plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off') #繪制掩膜 plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y") #繪制掩膜設(shè)置后的圖像 plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off') #繪制直方圖 plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y") plt.show()
其運行結(jié)果如圖2所示,其中(a)和(b)表示原始圖像和對應(yīng)的灰度直方圖,(c)和(d)表示灰度減弱或?qū)Ρ榷瓤s小的圖像及對應(yīng)的直方圖。圖2(d)比圖2(b)的灰度級整體縮小了0.8倍,繪制的曲線更加密集。
三.圖像反色直方圖對比
該算法將圖像的顏色反色,對原圖像的像素值進行反轉(zhuǎn),即黑色變?yōu)榘咨?,白色變?yōu)楹谏?,使用的表達式為:
DB=255-DA
實現(xiàn)代碼如下所示。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取圖像 img = cv2.imread('lena-hd.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] result = np.zeros((height, width), np.uint8) #圖像灰度反色變換 DB=255-DA for i in range(height): for j in range(width): gray = 255 - grayImage[i,j] result[i,j] = np.uint8(gray) #計算原圖的直方圖 hist = cv2.calcHist([img], [0], None, [256], [0,255]) #計算灰度變換的直方圖 hist_res = cv2.calcHist([result], [0], None, [256], [0,255]) #原始圖像 plt.figure(figsize=(8, 6)) plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off') #繪制掩膜 plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y") #繪制掩膜設(shè)置后的圖像 plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off') #繪制直方圖 plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y") plt.show()
其運行結(jié)果如圖3所示,其中(a)和(b)表示原始圖像和對應(yīng)的灰度直方圖,(c)和(d)表示灰度反色變換圖像及對應(yīng)的直方圖。圖3(d)與圖3(b)是反相對稱的,整個灰度值滿足DB=255-DA表達式。
四.圖像對數(shù)變換直方圖對比
該算法將增加低灰度區(qū)域的對比度,從而增強暗部的細節(jié),使用的表達式為:
下面代碼實現(xiàn)了圖像灰度的對數(shù)變換及直方圖對比。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取圖像 img = cv2.imread('lena-hd.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] result = np.zeros((height, width), np.uint8) #圖像灰度對數(shù)變換 for i in range(height): for j in range(width): gray = 42 * np.log(1.0 + grayImage[i,j]) result[i,j] = np.uint8(gray) #計算原圖的直方圖 hist = cv2.calcHist([img], [0], None, [256], [0,255]) #計算灰度變換的直方圖 hist_res = cv2.calcHist([result], [0], None, [256], [0,255]) #原始圖像 plt.figure(figsize=(8, 6)) plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off') #繪制原始圖像直方圖 plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y") #灰度變換后的圖像 plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off') #灰度變換圖像的直方圖 plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y") plt.show()
其運行結(jié)果如圖4所示,其中(a)和(b)表示原始圖像和對應(yīng)的灰度直方圖,(c)和(d)表示灰度對數(shù)變換圖像及對應(yīng)的直方圖。
五.圖像閾值化處理直方圖對比
該算法原型為threshold(Gray,127,255,cv2.THRESH_BINARY),當前像素點的灰度值大于thresh閾值時(如127),其像素點的灰度值設(shè)定為最大值(如9位灰度值最大為255);否則,像素點的灰度值設(shè)置為0。二進制閾值化處理及直方圖對比的Python代碼如下所示。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取圖像 img = cv2.imread('lena-hd.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #二進制閾值化處理 r, result = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY) #計算原圖的直方圖 hist = cv2.calcHist([img], [0], None, [256], [0,256]) #計算閾值化處理的直方圖 hist_res = cv2.calcHist([result], [0], None, [256], [0,256]) #原始圖像 plt.figure(figsize=(8, 6)) plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off') #繪制原始圖像直方圖 plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y") #閾值化處理后的圖像 plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off') #閾值化處理圖像的直方圖 plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y") plt.show()
其運行結(jié)果如圖5所示,其中(a)和(b)表示原始圖像和對應(yīng)的灰度直方圖,(c)和(d)表示圖像閾值化處理及對應(yīng)的直方圖,圖5(d)中可以看到,灰度值僅僅分布于0(黑色)和255(白色)兩種灰度級。
六.總結(jié)
本文主要講解圖像直方圖理論知識以及直方圖繪制方法,包括灰度增強直方圖對比、灰度減弱直方圖對比、圖像反色直方圖對比、圖像對數(shù)變換直方圖對比、圖像閾值化處理直方圖對比?;叶戎狈綀D是灰度級的函數(shù),描述的是圖像中每種灰度級像素的個數(shù),反映圖像中每種灰度出現(xiàn)的頻率。這篇文章的知識點將為后續(xù)圖像處理和圖像運算對比提供支撐。
以上就是Python圖像運算之圖像灰度直方圖對比詳解的詳細內(nèi)容,更多關(guān)于Python灰度直方圖對比的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python可迭代類型遍歷過程中數(shù)據(jù)改變會不會報錯
這篇文章主要介紹了python可迭代類型遍歷過程中數(shù)據(jù)改變會不會報錯問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12python網(wǎng)絡(luò)編程學習筆記(六):Web客戶端訪問
這篇文章主要介紹了python網(wǎng)絡(luò)編程之Web客戶端訪問 ,需要的朋友可以參考下2014-06-06Python實現(xiàn)的讀取/更改/寫入xml文件操作示例
這篇文章主要介紹了Python實現(xiàn)的讀取/更改/寫入xml文件操作,涉及Python針對xml文件的讀取、節(jié)點操作、寫入等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-08-08Python實現(xiàn)Matplotlib,Seaborn動態(tài)數(shù)據(jù)圖的示例代碼
這篇文章主要為大家詳細介紹了如何讓Matplotlib、Seaborn的靜態(tài)數(shù)據(jù)圖動起來,變得栩栩如生。文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下2022-05-05python連接sql?server數(shù)據(jù)庫的方法實戰(zhàn)
當我們用Python來編寫網(wǎng)站,必須要能夠通過python操作數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于python連接sql?server數(shù)據(jù)庫的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-08-08