一些基本的灰度变换函数
如下图显示了在图像处理中频繁使用的3类基本函数:
- 线性(反转和恒等变换)函数
- 对数(对数和反对数变换)函数
- 幂律( n n n次幂和 n n n次根变换)函数
# 灰度变换函数为了图像好看,归一化后再乘于255,缩放到相同的数值范围
x = np.arange(0, 256, 1)
x1 = x + 1
equal = 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)) * 255
plt.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^8
plt.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 ∗ l o g ( 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()