前言
图像增强章节除了指数增强部分使用FPGA实现,剩下的直方图均衡,gamma映射都只使用Python实现,我们只需要知道原理即可,感兴趣的小伙伴可以在最后使用我们的FPGA项目实现。我们先讨论gamma变换。人的眼睛在光线暗的时候对亮的光很敏感,在光线明亮的地方对光没有那么敏感。比如在夜晚看到萤火虫和白天看到萤火虫完全是两个效果。为了符合人眼的这一特点就有了gamma变换。
一、gamma变换原理
V o u t = 255 25 5 g a m m a V i n g a m m a V_{out} = \frac{255}{255^{gamma}} V_{in}^{gamma} Vout=255gamma255Vingamma
gamma = 1 / 2.2
x = np.arange(0, 256)
y1 = (255 / (255) ** gamma) * x ** gamma#根据上面公式
y2 = np.zeros((256, 1))
for i in range(y2.shape[0] - 1):
if(i == 0):
y2[i] = 0
else:
y2[i] = (y1[i + 1] - y1[i]) / y1[i]#变化率
fig = plt.figure(figsize=(10, 4))
plt.subplot(121)
plt.title("gamma curve")
plt.plot(x, y1)
plt.subplot(122)
plt.title("variation rate")
plt.plot(x[1:], y2[1:, 0])#第一个像素(0位置)的变化不用画出
gamma curve中描述的是每个像素值的gamma映射。可以从variation rate图像中可以看到像素的变化率,越黑的像素变化率越大,越白的像素的变化率越小,符合前言中我们聊的人眼的特点。
二、Python gamma变换
gamma = 1 / 2.2#gamma值
def gamma_transformer(pixel, gamma):#gamma变换
return (255 / (255 ** gamma)) * pixel ** gamma
vectorize_function = np.vectorize(gamma_transformer)#调用numpy vectorize函数对每个像素进行映射
result = vectorize_function(gray, gamma)
plt.figure(figsize=(10, 6))
plt.subplot(121)
plt.title("raw image")
plt.imshow(gray, cmap='gray')
plt.subplot(122)
plt.title("gamma image")
plt.imshow(result, cmap="gray")
总结
虽然没有FPGA实现,但是读者们可以先思考怎么去实现。接下来讲直方图均衡,敬请期待。