matlab padarray到底是怎么实现的

在运行一些图像信号处理算法和做卷积的过程中,为了方便处理,经常会遇到要给输入图像"加边"的情况,比如在这里插入图片描述
在matlab中,padarray对此类操作给予了很好的支持,padarray有四种填充模式,运行以下脚本

I = randi([1, 100], 3, 3);
pad = 2;
type = 0;
pad0 = padarray(I, [2,2], 0);
replicate = padarray(I, [2,2], 'replicate');
symmetric = padarray(I, [2,2], 'symmetric');
circular = padarray(I, [2,2], 'circular');

可以获得不同的pad数据的结果
能够想到的padarray最直接的方式就是通过"数据块拷贝的方式"来创造一个填充矩阵,类似于pad
这种方式就是根据上下左右四个方向要填充的长度来计算下标并填入相应的数据。而事实上在matlab中只要计算出下标,你就能够得到任何你想要的矩阵,包括扩展的形式

  • replicate

比如我们想将行向量根据边界数字左右扩充两个数字即

[1, 2, 3, 4, 5, 6] >> [1, 1, 1, 2, 3, 4, 5, 6, 6, 6]

只需要通过简单的取数

a = 1:6;
idx = uint32([1 1 1:6 6 6]);
b = a(idx);

就可以得到。矩阵的扩展其实就是在这种形式的基础上再加上列方向的扩展就可以了,如下所示(p为四个方向要填充的长度)

[h,w,~]=size(inputImg);
rs = [uint32(ones(1,p(1))) 1:h h*ones(1,p(2))];
cs = [uint32(ones(1,p(3))) 1:w w*ones(1,p(4))];
replicate = inputImg(rs,cs,:);
  • symmetric

只要明白了这个原理,我们就知道在symmetric的情况下,当向量长度为偶数时,如果我们想对行向量进行扩展,需要的下标应该为

idx = [2 1 1:6 6 5];

而这个数组可以通过对整个行向量对称并移位的方法得到,当输入填充长度为变量时,可通过如下脚本得到symmetric的填充

[h,w,~]=size(inputImg);
rs = uint32([1:h h:-1:1]); 
rs = circshift(rs, [0, p(1)]); 
rs = rs(1 : h + p(1) + p(2));
cs = uint32([1:w w:-1:1]); 
cs = circshift(cs, [0, p(3)]); 
cs = cs(1 : h + p(3) + p(4));
symmetric= inputImg(rs,cs,:);

当向量长度为奇数时,由于对称操作只扩充了一倍长度,扩充的位数不够,Matlab图像处理库中给出了一种更好的方法,不用区分奇数和偶数

[h,w,~]=size(inputImg);
rs = uint32([1:h h:-1:1]); 
rs=rs(mod(-p(1):h+p(2)-1,2*h)+1);
cs = uint32([1:w w:-1:1]); 
cs=cs(mod(-p(3):w+p(4)-1,2*w)+1);
symmetric= inputImg(rs,cs,:);
  • circular
[h,w,~]=size(inputImg);
rs = uint32(1:h);
rs=rs(mod(-p(1):h+p(2)-1,h)+1);
cs = uint32(1:w);
cs=cs(mod(-p(3):w+p(4)-1,w)+1);
symmetric= inputImg(rs,cs,:);
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值