• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Matlab 中的 wcodemat 有什么作用?

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在图像处理中,有时候会看到一些矩阵在显示之前,会使用一个 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格式显示
....

参考资料


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap