0
点赞
收藏
分享

微信扫一扫

Matlab 中的 wcodemat 有什么作用?

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


在图像处理中,有时候会看到一些矩阵在显示之前,会使用一个 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图像处理实例详解[M]. 清华大学出版社, 2013:387.
  • ​​https://ww2.mathworks.cn/help/wavelet/ref/wcodemat.html​​

未经作者授权,禁止转载 THE END

举报

相关推荐

0 条评论