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

来源:互联网 发布:非农数据和黄金价格 编辑:程序博客网 时间:2024/06/08 03:57

问题背景:

假如我们有一张图,像素值全部取自一个颜色集合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循环了,非常快

0 0
原创粉丝点击