本文转载自:FPGA入门到精通微信公众号
对数变换是一种图像处理中常见的非线性变换方式,用于强调图像的低灰度部分,扩展被压缩的高值图像中的暗像素。
本文将介绍对数变换的定义、公式、Python实现以及FPGA实现。
一、对数变换的相关知识
1、对数变换的定义
对数变换可以有效地拉伸图像的暗区域,同时压缩亮区域,从而增强图像的细节,尤其是在图像的暗部细节。
如上图所示,对数函数曲线,将图像中暗部部分的像素值拉高,实现了拉伸图像暗区域。
这里大家看下图片效果:左图是原图,右图是对数变换后的图像,暗部明显有提升。
2、对数变换公式
s = c * log(1+r)
参数说明:
. s 是对数变换后的像素值,归一化的小数
. r 是原始的像素值,归一化的小数
. c是调整对比度的常数,c 通常是一个正数。
转换成整数输入模式,则公式变为:s = 255 * c * log(1 + r /255.0)
对数变换的计算结果可能会出现像素值大于255的情况,需要对计算结果进行限幅(0,1)处理。
3、对数变换的应用
对数变换的效果是使图像的暗部细节更加清晰,而对于亮部区域,则可能会减少一些细节的层次感。
这种变换在天文图像处理、医学图像处理等领域中尤为重要,因为这些领域的图像通常包含大量的暗区域,通过对数变换可以更好地观察到图像的细节特征。
二、Python实现
1、Python代码
import cv2
import numpy as np
img = cv2.imread('test.png')
# log函数
def log_f1(img, c=1.0):
gamma_corrected = np.array(
255 * c*np.log(img / 255 + 1), dtype='uint8')
gamma_corrected = np.clip(gamma_corrected, 0, 255)
return gamma_corrected
# 查表法,速度快
def log_f2(img, c=2.0):
table = c*np.log(np.arange(256)/255.0 + 1)*255
table = np.clip(table, 0, 255)
gamma_corrected = cv2.LUT(img, table.astype(np.uint8))
return gamma_corrected
img_log = log_f1(img)
img_log2 = log_f2(img, 2)
cv2.namedWindow("original", 0)
cv2.resizeWindow("original", 300, 180) # 设置窗口大小
cv2.namedWindow("log", 0)
cv2.resizeWindow("log", 300, 180) # 设置窗口大小
cv2.namedWindow("log2", 0)
cv2.resizeWindow("log2", 300, 180) # 设置窗口大小
cv2.imshow('original', img)
cv2.imshow('log', img_log)
cv2.imshow('log2', img_log2)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、实现效果
三、FPGA实现
分析对数曲线变换的公式,可以看到涉及乘法和复杂函数的实现,与gama变换一样,采用查表法实现。
这里可以看下我们FPGA实现的效果: