天天看點

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

目錄

1 灰階變換簡介

2 線性灰階變換­—圖像反轉

3 非線性灰階變換

3.1 對數變換

3.2 伽馬變換

參考資料

1 灰階變換簡介

灰階變換是圖像增強的一種重要手段,用于改善圖像顯示效果,屬于空間域處理方法,它可以使圖像動态範圍加大,使圖像對比度擴充,圖像更加清晰,特征更加明顯。灰階變換其實質就是按一定的規則修改圖像每一個像素的灰階,進而改變圖像的灰階範圍。常見的灰階變換圖像反轉,對數變換和伽馬變換等。其具體分類如下圖所示:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

2 線性灰階變換­—圖像反轉

灰階線性變換最常見的就是圖像反轉,在灰階圖像灰階級範圍

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

中,其反轉的公式如下所示:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

其中,

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

表示原始圖像的灰階級,

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

表示變換後的灰階級。

下圖所示為圖像反轉的例子,原圖像是數字乳房X射線照片,其中顯示有一小塊病變,通過圖像反轉就很容易看到病變區域。

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

代碼如下所示:

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

#讀取原始圖像
img = cv2.imread('zxp.jpg')

#圖像灰階轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#擷取圖像高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]

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

#圖像灰階反色變換 s=255-r
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()
           

運作結果如下圖所示:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

3 非線性灰階變換

3.1 對數變換

圖像灰階對數變換一般表示如下所示:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
其中,
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
表示原始圖像的灰階級,
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
表示變換後的灰階級,
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

為常數。

假設

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
,下圖所示的對數曲線的形狀表明,改變換将輸入中範圍較窄的低灰階值映射為輸出中較寬範圍的灰階值。相反的,對高的輸入灰階值也是如此。我們使用這種類型的變換來擴充圖像中暗像素的值,同時壓縮更高灰階級的值。反對數變換的作用與此相反。
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

代碼如下所示:

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

#繪制曲線
def log_plot(c):
    x = np.arange(0, 256, 0.01)
    y = c * np.log(1 + x)
    plt.plot(x, y, 'r', linewidth=1)
    plt.rcParams['font.sans-serif']=['SimHei'] #正常顯示中文标簽
    plt.title(u'對數變換函數')
    plt.xlim(0, 255), plt.ylim(0, 255)
    plt.show()

#對數變換
def log(c, img):
    output = c * np.log(1.0 + img)
    output = np.uint8(output + 0.5)
    return output

#讀取原始圖像
img = cv2.imread('test8.bmp')

#繪制對數變換曲線
log_plot(42)

#圖像灰階對數變換
output = log(42, img)

#顯示圖像
cv2.imshow('Input', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
           

運作結果如下圖所示:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

3.2 伽馬變換

伽瑪變換又稱為 指數變換 或 幂次變換,是另一種常用的灰階非線性變換。圖像灰階的伽瑪變換一般表示如下所示:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
其中,
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
表示原始圖像的灰階級,
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
表示變換後的灰階級,
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

正常數

1)當

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

>1時,會拉伸圖像中灰階級較高的區域,壓縮灰階級較低的部分;

2)當

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

<1時,會拉伸圖像中灰階級較低的區域,壓縮灰階級較高的部分;

3)當

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

=1時,該灰階變換是線性的,此時通過線性方式改變原圖像。

如下圖所示,不同

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
值的變換曲線:
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

下圖所示為圖像伽馬變換的例子:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

代碼如下所示:

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

#繪制曲線
def gamma_plot(c, v):
    x = np.arange(0, 256, 0.01)
    y = c*x**v
    plt.plot(x, y, 'r', linewidth=1)
    plt.rcParams['font.sans-serif']=['SimHei'] #正常顯示中文标簽
    plt.title(u'伽馬變換函數')
    plt.xlim([0, 255]), plt.ylim([0, 255])
    plt.show()

#伽瑪變換
def gamma(img, c, v):
    lut = np.zeros(256, dtype=np.float32)
    for i in range(256):
        lut[i] = c * i ** v
    output_img = cv2.LUT(img, lut) #像素灰階值的映射
    output_img = np.uint8(output_img+0.5)
    return output_img

#讀取原始圖像
img = cv2.imread('test9.bmp')

#繪制伽瑪變換曲線
gamma_plot(0.00000005, 4.0)

#圖像灰階伽瑪變換
output = gamma(img, 0.00000005, 4.0)

#顯示圖像
cv2.imshow('Imput', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
           

運作結果如下圖所示:

數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料
數字圖像處理(18): 圖像灰階變換——線性灰階變換 和 非線性灰階變換(對數變換 與 伽馬變換)1 灰階變換簡介2 線性灰階變換­—圖像反轉3 非線性灰階變換參考資料

參考資料

[1] https://blog.csdn.net/Eastmount/article/details/88858696

[2] https://blog.csdn.net/Eastmount/article/details/88929290

[3] 岡薩雷斯. 數字圖像處理(第三版)