利用向量化对图像做快速赋值

问题背景:

假如我们有一张图,像素值全部取自一个颜色集合C (有点像是png的压缩原理) ,目的是将其分辨率降低为原来的1/2,而且降低分辨率之后的图像像素一定还是都属于原来的颜色集合C,假如直接用imresize的话,就会出现压缩之后像素值有损失的问题,导致会出现不在颜色集合C的像素,所以需要自己写一个不破坏像素信息的imresize函数。


解决思路:

1. 一个最简单的方法就是声明一个原图一半大小的矩阵,然后为其中的每个像素赋值,赋值的方法也很简单,就是dst_pixel(x, y) = src_pixel(2*x, 2*y)

但是这么做是需要用到for循环的,效率非常低,所以我们需要一个效率更高的算法

2. 向量化的赋值方法:

假定原图分辨率为2*h×2*w,那么降低分辨率之后为h*w,

我们不用im(h,w,c) = value这样的思路赋值,我们用im(index) = value的思路赋值就可以实现向量化,方法如下

[hh, ww] = meshgrid(1 : h, 1 : w);

hh = hh(:);
ww = ww(:);
srcwh = 2 * hh;
srcww = 2 * ww;

src_index = [srchh + (srcww - 1) * 2 * h, ...
        srchh + (srcww - 1) * h + 4 * h * w, ...
        srchh + (srcww - 1) * h + 8 * h * w];


dst_index = [hh + (ww - 1) * h, ...
        hh + (ww - 1) * h + h * w, ...
        hh + (ww - 1) * h + h * w * 2];


dst_im(dst_index) = src_im(src_index);


dst_im就是降低分辨率之后的图像

用上面的方法,就可以免去for循环了,非常快

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值