目錄
- 一些基本的灰度變換函數
- 圖像反轉
- 對數變換
一些基本的灰度變換函數
如下圖顯示了在圖像處理中頻繁使用的3類基本函數:
- 線性(反轉和恒等變換)函數
- 對數(對數和反對數變換)函數
- 冪律(nnn次冪和nnn次根變換)函數
# 灰度變換函數為了圖像好看,歸一化后再乘于255,縮放到相同的數值范圍
x = np.arange(0, 256, 1)
x1 = x + 1equal = normalize(x) * 255
revers = (1 - normalize(x)) * 255
log = normalize(np.log(x1)) * 255
n_sqrt = normalize(np.power(x, 1/3)) * 255
n_power = normalize(np.power(normalize(x), 3)) * 255
log_1 = normalize(np.exp(log)) * 255plt.figure(figsize=(6, 6))
plt.plot(x, equal, label='equal')
plt.plot(x, revers, label='reversed')
plt.plot(x, log, label='log')
plt.plot(x, n_sqrt, label='n sqrt root')
plt.plot(x, n_power, label='n power')
plt.plot(x, log_1, label='exp')plt.ylim([0, 256])
plt.xlim([0, 256])
plt.legend(loc='upper left')
plt.show()
圖像反轉
s=L?1?r(3.3)s = L-1 -r \tag{3.3}s=L?1?r(3.3)
采用這種方式反轉圖像的灰度級,會得到類似于照片底片的結果。這種類型的處理可用于增強圖像暗色區域中的白色或灰色細節,暗色安全閥人尺寸很大時這種增強效果更好
# 圖像反轉,也可以縮放到[0, 1], 然后再用1減去
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0304(a)(breast_digital_Xray).tif', 0)
img_reversed = 256 - 1 - img_ori # L = 2^8plt.figure(figsize=(18, 15))
plt.subplot(1, 2, 1), plt.imshow(img_ori, cmap='gray', vmin=0, vmax=255), plt.title('Original')
plt.subplot(1, 2, 2), plt.imshow(img_reversed, cmap='gray', vmin=0, vmax=255), plt.title('Reversed')
plt.tight_layout()
plt.show()
對數變換
s=c?log(1+r)(3.4)s= c*log(1+r) \tag{3.4}s=c?log(1+r)(3.4)
這個變換將輸入中范圍較窄的低灰度值映射為輸出中范圍較寬的灰度級。相反,輸入中的高灰度值則被映射為輸出中范圍較窄的灰度級。使用這類變換來擴展圖像中的暗像素值,同時壓縮高灰度級值。
反對數(指數)變換的功能正好相反。
# 對數變換
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0305(a)(DFT_no_log).tif', 0)#------------------------傅里葉變換
fft = np.fft.fft2(img_ori)
fft_shift = np.fft.fftshift(fft) #中心化#------------------------直接顯示變換后的頻譜
amp = np.abs(fft_shift)
amp = np.uint8(normalize(amp) * 255)#------------------------對頻譜進行對數變換后
amp_log = np.abs(np.log(1 + np.abs(fft_shift)))
amp_log = np.uint8(normalize(amp_log) * 255)plt.figure(figsize=(16, 6))
plt.subplot(1, 3, 1), plt.imshow(img_ori, cmap='gray', vmin=0, vmax=255), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 2), plt.imshow(amp, cmap='gray', vmin=0, vmax=255), plt.title('FFT result without log'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 3), plt.imshow(amp_log, cmap='gray', vmin=0, vmax=255), plt.title('FFT result with Long'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()