Python圖像運(yùn)算之圖像灰度線性變換詳解
一.灰度線性變換
圖像的灰度線性變換是通過(guò)建立灰度映射來(lái)調(diào)整原始圖像的灰度,從而改善圖像的質(zhì)量,凸顯圖像的細(xì)節(jié),提高圖像的對(duì)比度?;叶染€性變換的計(jì)算公式如(12-1)所示:
該公式中DB表示灰度線性變換后的灰度值,DA表示變換前輸入圖像的灰度值,α和b為線性變換方程f(D)的參數(shù),分別表示斜率和截距[1-4]。
- 當(dāng)α=1,b=0時(shí),保持原始圖像
- 當(dāng)α=1,b!=0時(shí),圖像所有的灰度值上移或下移
- 當(dāng)α=-1,b=255時(shí),原始圖像的灰度值反轉(zhuǎn)
- 當(dāng)α>1時(shí),輸出圖像的對(duì)比度增強(qiáng)
- 當(dāng)0<α<1時(shí),輸出圖像的對(duì)比度減小
- 當(dāng)α<0時(shí),原始圖像暗區(qū)域變亮,亮區(qū)域變暗,圖像求補(bǔ)
如圖12-1所示,顯示了圖像的灰度線性變換對(duì)應(yīng)的效果圖。
二.圖像灰度上移變換
該算法將實(shí)現(xiàn)圖像灰度值的上移,從而提升圖像的亮度。
DB=DA+50
具體實(shí)現(xiàn)代碼如下所示。由于圖像的灰度值位于0至255區(qū)間之內(nèi),所以需要對(duì)灰度值進(jìn)行溢出判斷。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] #創(chuàng)建一幅圖像 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) #顯示圖像 cv2.imshow("Gray Image", grayImage) cv2.imshow("Result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖12-2所示,圖像的所有灰度值上移50,圖像變得更白了。注意,純黑色對(duì)應(yīng)的灰度值為0,純白色對(duì)應(yīng)的灰度值為255。
三.圖像對(duì)比度增強(qiáng)變換
該算法將增強(qiáng)圖像的對(duì)比度,Python實(shí)現(xiàn)代碼如下所示。
DB=DA×1.5
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] #創(chuàng)建一幅圖像 result = np.zeros((height, width), np.uint8) #圖像對(duì)比度增強(qiáng)變換 DB=DA×1.5 for i in range(height): for j in range(width): if (int(grayImage[i,j]*1.5) > 255): gray = 255 else: gray = int(grayImage[i,j]*1.5) result[i,j] = np.uint8(gray) #顯示圖像 cv2.imshow("Gray Image", grayImage) cv2.imshow("Result", result)
其輸出結(jié)果如圖12-3所示,圖像的所有灰度值增強(qiáng)1.5倍。
四.圖像對(duì)比度減弱變換
該算法將減弱圖像的對(duì)比度,Python實(shí)現(xiàn)代碼如下所示。
DB=DA×0.8
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] #創(chuàng)建一幅圖像 result = np.zeros((height, width), np.uint8) #圖像對(duì)比度減弱變換 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) #顯示圖像 cv2.imshow("Gray Image", grayImage) cv2.imshow("Result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖12-4所示,圖像的所有灰度值減弱,圖像變得更暗。
五.圖像灰度反色變換
反色變換又稱為線性灰度求補(bǔ)變換,它是對(duì)原圖像的像素值進(jìn)行反轉(zhuǎn),即黑色變?yōu)榘咨?,白色變?yōu)楹谏倪^(guò)程。
DB=255-DA
其Python實(shí)現(xiàn)代碼如下所示:
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #圖像灰度轉(zhuǎn)換 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #獲取圖像高度和寬度 height = grayImage.shape[0] width = grayImage.shape[1] #創(chuàng)建一幅圖像 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) #顯示圖像 cv2.imshow("Gray Image", grayImage) cv2.imshow("Result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖12-5所示,圖像處理前后的灰度值是互補(bǔ)的。
圖像灰度反色變換在醫(yī)學(xué)圖像處理中有一定的應(yīng)用,如圖12-6所示:
六.總結(jié)
本文主要講解圖像灰度線性變換,包括圖像灰度上移、圖像對(duì)比度增強(qiáng)變換、圖像對(duì)比度減弱變換和圖像灰度反色變換。希望大家一定要自己實(shí)現(xiàn)文章中的代碼,更好地提升編程能力。
到此這篇關(guān)于Python圖像運(yùn)算之圖像灰度線性變換詳解的文章就介紹到這了,更多相關(guān)Python圖像灰度線性變換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?eval()和exec()函數(shù)使用詳解
exec函數(shù)執(zhí)行的是python語(yǔ)句,沒(méi)有返回值,eval函數(shù)執(zhí)行的是python表達(dá)式,有返回值,exec函數(shù)和eval函數(shù)都可以傳入命名空間作為參數(shù),本文給大家介紹下Python?eval()和exec()函數(shù),感興趣的朋友跟隨小編一起看看吧2022-11-11解決Jupyter Notebook使用parser.parse_args出現(xiàn)錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決Jupyter Notebook使用parser.parse_args出現(xiàn)錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python 多進(jìn)程并行編程 ProcessPoolExecutor的實(shí)現(xiàn)
這篇文章主要介紹了python 多進(jìn)程并行編程 ProcessPoolExecutor的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10python 篩選數(shù)據(jù)集中列中value長(zhǎng)度大于20的數(shù)據(jù)集方法
今天小編就為大家分享一篇python 篩選數(shù)據(jù)集中列中value長(zhǎng)度大于20的數(shù)據(jù)集方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06python兩個(gè)_多個(gè)字典合并相加的實(shí)例代碼
這篇文章主要介紹了python兩個(gè)_多個(gè)字典合并相加,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python Diagrams庫(kù)以代碼形式生成云系統(tǒng)架構(gòu)圖實(shí)例詳解
這篇文章主要介紹了Python Diagrams庫(kù)以代碼形式生成云系統(tǒng)架構(gòu)圖實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01簡(jiǎn)單實(shí)例帶你了解Python的編譯和執(zhí)行全過(guò)程
python 是一種解釋型的編程語(yǔ)言,所以不像編譯型語(yǔ)言那樣需要顯式的編譯過(guò)程。然而,在 Python 代碼執(zhí)行之前,它需要被解釋器轉(zhuǎn)換成字節(jié)碼,這個(gè)過(guò)程就是 Python 的編譯過(guò)程,還不知道的朋友快來(lái)看看吧2023-04-04