首頁 > 軟體

Python影象運算之影象灰度線性變換詳解

2022-03-01 10:00:25

一.灰度線性變換

影象的灰度線性變換是通過建立灰度對映來調整原始影象的灰度,從而改善影象的質量,凸顯影象的細節,提高影象的對比度。灰度線性變換的計算公式如(12-1)所示:

該公式中DB表示灰度線性變換後的灰度值,DA表示變換前輸入影象的灰度值,α和b為線性變換方程f(D)的引數,分別表示斜率和截距[1-4]。

  • 當α=1,b=0時,保持原始影象
  • 當α=1,b!=0時,影象所有的灰度值上移或下移
  • 當α=-1,b=255時,原始影象的灰度值反轉
  • 當α>1時,輸出影象的對比度增強
  • 當0<α<1時,輸出影象的對比度減小
  • 當α<0時,原始影象暗區域變亮,亮區域變暗,影象求補

如圖12-1所示,顯示了影象的灰度線性變換對應的效果圖。

二.影象灰度上移變換

該演演算法將實現影象灰度值的上移,從而提升影象的亮度。

DB=DA+50

具體實現程式碼如下所示。由於影象的灰度值位於0至255區間之內,所以需要對灰度值進行溢位判斷。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始影象
img = cv2.imread('luo.png')

#影象灰度轉換
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)

#顯示影象
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

其輸出結果如圖12-2所示,影象的所有灰度值上移50,影象變得更白了。注意,純黑色對應的灰度值為0,純白色對應的灰度值為255。

三.影象對比度增強變換

該演演算法將增強影象的對比度,Python實現程式碼如下所示。

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')

#影象灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#獲取影象高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]

#建立一幅影象
result = np.zeros((height, width), np.uint8)

#影象對比度增強變換 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)

其輸出結果如圖12-3所示,影象的所有灰度值增強1.5倍。

四.影象對比度減弱變換

該演演算法將減弱影象的對比度,Python實現程式碼如下所示。

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')

#影象灰度轉換
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)

#顯示影象
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

其輸出結果如圖12-4所示,影象的所有灰度值減弱,影象變得更暗。

五.影象灰度反色變換

反色變換又稱為線性灰度求補變換,它是對原影象的畫素值進行反轉,即黑色變為白色,白色變為黑色的過程。

DB=255-DA

其Python實現程式碼如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始影象
img = cv2.imread('luo.png')

#影象灰度轉換
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)

#顯示影象
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

其輸出結果如圖12-5所示,影象處理前後的灰度值是互補的。

影象灰度反色變換在醫學影象處理中有一定的應用,如圖12-6所示:

六.總結

本文主要講解影象灰度線性變換,包括影象灰度上移、影象對比度增強變換、影象對比度減弱變換和影象灰度反色變換。希望大家一定要自己實現文章中的程式碼,更好地提升程式設計能力。

到此這篇關於Python影象運算之影象灰度線性變換詳解的文章就介紹到這了,更多相關Python影象灰度線性變換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com