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