Matlab 中的 wcodemat 有什么作用?

Posted GShang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab 中的 wcodemat 有什么作用?相关的知识,希望对你有一定的参考价值。

在图像处理中,有时候会看到一些矩阵在显示之前,会使用一个 wcodemat 函数做转换,再转 uint8 进行显示,但这到底起到什么作用呢?下面来一探究竟。

源码解读

通过在 Matlab 命令行窗口中输入下面的命令并回车,打开该函数的源文件。

open wcodemat

聚焦到第 37 行开始的代码,以及第 61 行代码

...
if absol , x = abs(x); end
switch opt
    case \'m\'
        y = ones(size(x));
        x = x - min(x(:));
        maxx  = max(x(:));
        if maxx<eps , return; end
        x = nb*(x/maxx);
        y(:) = 1 + fix(x);
...
y(y>nb) = nb;
...

这部分关键代码,就是整个转换数据的主要流程。

  • 首先,将数据取绝对值
  • 然后,将上一步的数据整体减去最小值,于是数据整体被搬迁到了以最小值为原点的坐标轴上
  • 再求取数据的最大值,作为分母,各数据作为分子,相除实现数据在整体取值范围上的占比计算(即归一化操作)
  • 接着将其乘以一个转换值 nb ,并向零点方向取整,加上 1,从而将数据重新映射到编码目标范围
  • 最后对于溢出的部分重新置为最大目标值 nb

简单实现 wcodemat

根据以上分析,我们可以写出相同的功能的函数 mycodemat

function y = mycodemat(x,nb)
% 求新的数列:取绝对值->原点对齐
x1 = abs(x);
x1_min = min(x1);
x2 = x1 - x1_min;
% 重新编码:归一化->映射到新的区间(1-nb)
x2_max = max(x2);
y = 1 + fix(nb*x2/x2_max); % fix 表示向零点方向取整 x --> 0 <-- x
% 溢出处理:大于 nb 的置为 nb
y(y>nb) = nb;
end

对比与分析

最后,我们来对比一下自己编写的 mycodemat 与 wcodemat 的运行结果是否一致

clear;close all;clc

x = rand(10,1); % 随机生成一组数据
y1 = wcodemat(x,32);
y2 = mycodemat(x,32);
isequal(y1,y2)

运行结果为 1 ,即二者完全一致!

总的来说,该函数功能就是将任意的源数据编码到一个取值为 1 到 nb 的正整数范围下,而图像处理中经常出现各种小数、负数等情况,但为了合理的显示,需要转换到适当的整数范围中。这时一般 nb 就是 255,即 256 灰度级。通常灰度级的获取根据图像的索引矩阵长度或者自行设置。所以你会经常看到类似下面的这种代码

nbcol = size(map,1)	% 根据map获取图像灰度级色谱
....
img = ....
imshow(uint8(wcodemat(img,nbcol))) % 图像编码到1-255,并以unit8格式显示
....

参考资料

以上是关于Matlab 中的 wcodemat 有什么作用?的主要内容,如果未能解决你的问题,请参考以下文章

matlab exe文件中的按钮不起作用

为啥 matlab 中的源发送邮件(gmail)不起作用?

matlab中的script file是干啥用的?

matlab中的unwrap有啥作用

什么是 MATLAB 中的双周期运算符后跟除法运算符 (../)?

在matlab中,读取一个字符串中的某个字符的问题