所以我一直试图找出为什么我的量化方法通过对数似乎不起作用。 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,但似乎没有解决它。
我将专注于您的代码只有一个渠道:
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之间引入非整数值,从而导致该范围内的潜在的许多量化级别。