通过对数函数量化

问题描述 投票:0回答:1

所以我一直试图找出为什么我的量化方法通过对数似乎不起作用。 C1是原始图像,我只是将它们分成三个波段,然后尝试量化:

OredChannel  = uint8(double(C1(:,:,1)));
OgreenChannel = uint8(double(C1(:,:,2)));
OblueChannel = uint8(double(C1(:,:,3)));

MaxR = 1/max(double(OredChannel(:)));
NatImgR = uint8(MaxR * log(double(OredChannel)));
MaxG = 1/max(double(OgreenChannel(:)));
NatImgG = uint8(MaxG *log(double(OgreenChannel)));
MaxB = 1/max(double(OblueChannel(:)));
NatImgB = uint8(MaxB * log(double(OblueChannel)));
CLog = cat(3,NatImgR,NatImgG,NatImgB);
imshow(CLog);
title('Part F: Natural Logarithm');

我似乎只是得到一个黑屏。我尝试在所有乐队上添加1和1/3,但似乎没有解决它。

matlab image-processing
1个回答
2
投票

我将专注于您的代码只有一个渠道:

MaxR = 1/max(double(OredChannel(:)));
NatImgR = uint8(MaxR * log(double(OredChannel)));

MaxR被定义为MaxR*double(OredChannel)最多为1.将此类型投射到uint8将为您提供大部分为0的图像,以及输入为最大值的1。在混合中添加log使得结果是一个小得多的值,对uint8的投射保证给出0。

对于对数量化(使用自然对数,如您所愿做的那样),您可以执行以下操作:

NatImgR = exp(floor(log(double(OredChannel))));

floor返回0到5之间的整数值(假设输入值在[0,255]范围内),-Inf输入为0.为了将其恢复到原始输入范围,我应用exp,这当然是log。这导致以下7个可能的输出值(假设输入值是整数):

>> unique(NatImgR(:))
ans =
         0
    1.0000
    2.7183
    7.3891
   20.0855
   54.5982
  148.4132

如果你愿意,你可以把它投到uint8;这将围绕值,导致可能的值[0,1,3,7,20,55,148]

要更改量化级别的数量,请缩放输入。如果最大值低于exp(n-1),你将获得n量化级别:

n = 5;
scale = exp(n-1) / (max(double(OredChannel(:)))+1);
NatImgR = exp(floor(log(round(scale*double(OredChannel)))));

有几点需要注意:

  • scale使用max()+1计算。 +1是为了确保输入值低于exp(n-1),从不相等(因为这将引入一个更多的量化级别)。
  • 我在缩放之后和取对数之前使用round。这是为了避免在0和1之间的量化级别:缩放可以在0和1之间引入非整数值,从而导致该范围内的潜在的许多量化级别。
© www.soinside.com 2019 - 2024. All rights reserved.