图像归一化:对于动态范围较大的图像进行处理

3
我有一张大小为144*2209的图像,其动态范围很大(从-1108到984)。
我想要显示这张图片,为此需要将范围缩小到0到255之间,并对图像进行归一化处理。
但是问题在于:当这样的大动态范围被压缩时,归一化后像素值变得非常接近,导致图像无法正常显示。
如何解决这个问题?
这是链接到图片的网址。

3
有高动态范围压缩的方法。请查看以下论文http://www.cs.huji.ac.il/~danix/hdr/hdrc.pdf。 - Amitay Nachmani
我已经尝试过 imagesc(img)...没有任何好处!! - Navdeep
2
如果您能够提供原生格式的图像(PNG等),那将非常有用。 此外,如果您需要关注某些强度范围,则点处理方法非常有用。(https://www.cse.unr.edu/~bebis/CS791E/Notes/PointProcess.pdf) - crazyGamer
@crazyGamer 这只是一个变量(被视为图像),其中包含我想要显示为 uint8 类型图像的 double 值。 - Navdeep
你是在MATLAB中显示这个吗?imshow可以处理不止8位图像类型。你尝试过增加位分辨率(例如16位)并显示它吗?此外,尝试缩小图像的动态范围。如果您知道强度更倾向于高端或低端,可以使用伽马变换。这是相当开放的,没有单一的方法可以解决所有问题。 - rayryeng
显示剩余3条评论
1个回答

2
你可以使用线性变换来改变原始图像的动态范围,但请注意这将修改图像的信息。
在Matlab中,对于8位范围,只需使用以下代码片段:
bins = pow2(8); % = range
lin_eq_img = round( (bins - 1) * (img - min_img) / (max_img - min_img) );

但这会对图像产生轻微影响: 8位均衡化 以下是几点说明:
  • 即使您的图像动态范围高于8位深度,也不被认为是“大动态范围”
  • 根据您要做什么以及如何做,您可能希望考虑在16位动态上使用前面的线性变换,以避免丢失细节(通过“挤压”像素值分布来实现)
  • 您不能希望像素值的强度在每个像素的8位深度所给出的值之内,并声称修改了图像的显示:这不是无损操作!
  • 如果您知道要增强什么,则有许多非线性变换可用
编辑:

16位均衡版本将“保持阴影更清晰”(没有细节丢失),但当然,呈现的图像将占用更多的空间。以下是比较:

8位 vs. 16位均衡化

我强烈建议您在2^16的强度值范围内执行直方图归一化,以避免细节损失。


感谢您的帮助! - Navdeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接