首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过对数函数量化

通过对数函数量化
EN

Stack Overflow用户
提问于 2018-03-04 00:22:26
回答 1查看 360关注 0票数 0

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

代码语言:javascript
复制
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,但似乎没有修复它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-04 06:47:12

我将只关注一个频道的代码:

代码语言:javascript
复制
MaxR = 1/max(double(OredChannel(:)));
NatImgR = uint8(MaxR * log(double(OredChannel)));

MaxR是这样定义的,MaxR*double(OredChannel)最多是1。将其转换到uint8将给出一个图像,大部分为0,而输入最大的为1。在混合中添加log使其结果是一个小得多的值,而向uint8转换的值保证为0。

为了对对数进行量化(使用自然对数,正如您想要做的那样),您可以这样做:

代码语言:javascript
复制
NatImgR = exp(floor(log(double(OredChannel))));

floor返回介于0到5之间的整数值(假设输入值在0,255范围内),以及输入为0的-Inf。为了使其回到原来的输入范围,我应用了exp,这当然是log的反义词。这导致以下7个可能的输出值(假设输入值是整数):

代码语言:javascript
复制
>> 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量化级别:

代码语言:javascript
复制
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之间引入非整数值,从而可能导致该范围内的许多量化级别。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49090683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档