所以我一直在试图找出为什么我通过对数量化的方法似乎不起作用。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,但似乎没有修复它。
发布于 2018-03-04 06:47:12
我将只关注一个频道的代码:
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范围内),以及输入为0的-Inf。为了使其回到原来的输入范围,我应用了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之间引入非整数值,从而可能导致该范围内的许多量化级别。https://stackoverflow.com/questions/49090683
复制相似问题