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图像处理实例详解[M]. 清华大学出版社, 2013:387.
- https://ww2.mathworks.cn/help/wavelet/ref/wcodemat.html
以上是关于Matlab 中的 wcodemat 有什么作用?的主要内容,如果未能解决你的问题,请参考以下文章