【FPGA图像处理实战】- 图像对数变换

本文转载自: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实现的效果:

最新文章

最新文章