"""导入需要用的python库"""
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
from scipy import fft
plt.rcParams['font.sans-serif'] = ['FangSong'] # 设置字体以便正确显示中文
img = np.asarray(Image.open('la.tif')) # 加载图片,并将它转换为numpy的数组
1、图像反转
公式: 。
r和s分别代表图像处理前后的像素值,L-1为图像的最大灰度级。
'''图像反转'''
# 公式实现
img2 = np.array(255) - img
# 显示图像
plt.subplot(121)
plt.title('原始图像')
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.title('图像反转')
plt.imshow(img2, cmap='gray')
plt.show()
2、对数变换
公式:s = c log(1+r) , c为常数。
该变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值。
'''对数变换'''
img_fft = fft.fftshift(fft.fft2(img)) # 将蜡笔小新图像做傅里叶变换
img_fft2 = np.log((np.array(1.0)+abs(img_fft))) # 对数变换公式实现
# 显示图像
plt.subplot(121)
plt.title('原始频域图像')
plt.imshow(abs(img_fft), cmap='gray')
plt.subplot(122)
plt.title('对数变换')
plt.imshow(img_fft2, cmap='gray')
plt.show()
3、幂律(伽马变换)
公式:
其中,c和为正常数。
是偏移量,即输入为0时的一个可度量输出(0的次幂永远是0)。
与对数变换类似,部分值得幂律曲线将较窄范围的暗色输入值映射为较宽范围的输出值。可以调图像对比度。
'''幂律(伽马变换)'''
img3 = (img/np.array(255))**0.5*255
img4 = (img/np.array(255))**1.5*255
img5 = (img/np.array(255))**3.0*255 # 图像灰度范围[0,255],幂次运算后灰度值会超过255,将其先归一化
# 显示图像
plt.subplot(221)
plt.title('原始图像')
plt.imshow(abs(img), cmap='gray')
plt.subplot(222)
plt.title('伽马变换,y=0.5')
plt.imshow(img3, cmap='gray')
plt.subplot(223)
plt.title('伽马变换,y=1.5')
plt.imshow(img4, cmap='gray')
plt.subplot(224)
plt.title('伽马变换,y=3.0')
plt.imshow(img5, cmap='gray')
plt.show()
4、分段线性变换函数
'''分段线性变换函数'''
r1 = 100
r2 = 150
s1 = 50
s2 = 250
m1 = (img < r1)
m2 = (img <= r2) & (img >= r1)
m3 = (img > r2)
img6 = (s1/r1*img)*m1+((s2-s1)/(r2-r1)*(img-r1)+s1)*m2+((255-s2)/(255-r2)*(img-r2)+s2)*m3
# 显示图像
plt.subplot(121)
plt.title('原始图像')
plt.imshow(abs(img), cmap='gray')
plt.subplot(122)
plt.title('分段线性变换函数')
plt.imshow(img6, cmap='gray')
plt.show()