问一下我把BMP的图片信息读入到内存中之后应该如何对这些点进行缩放,如果缩小比率是2:1,那么我应该可以将两个原来的点合并成一个,像素取平均值。可是如果缩小比率不是整数倍呢?那么这个缩放算法应该如何设计?几个点合并成几个点?像素应该怎么取值?还有放大也存在同样的问题!谢谢各位,帮助下小菜

解决方案 »

  1.   

    针对放大和缩小两种情况分别来讲
    对方大来说,高效常用的方法就是简单的放大一个像素在各个维数上的倍数即可
    有一个2x2的图像,需要转成3x2
    a1 a2        a1 a1 a2
    a3 a4   ==>  a3 a3 a4
    这种算法导致当我们放大图片的时候会出现马赛克效果缩小时常用的方法会多一些,主要的评判标准有两个,性能和效果
    常用的有双线性插值法
    p11     p12
         |dy
      dx |
    -----p
    p21     p22
    p11, p12, p21, p22是四个像素, p是进行缩小操作位置
    p的像素值会受到周围四个像素的影响,具体是
    p = (1-dx)(1-dy)p11 + dx(1-dy)p12 + dy(1-dx)p21 + dx*dy*p22
    回到上例
    有一个3x2的图像,需要转成2x2
    a b        a1 a2 a3
    c d   <==  b1 b2 b3
    a = 0.5 * 0.5 * a1 + 0.5 * 0.5 * a2;
    b = 0.5 * 0.5 * a2 + 0.5 * 0.5 * a3;
    c = 0.5 * 0.5 * b1 + 0.5 * 0.5 * b2;
    d = 0.5 * 0.5 * b2 + 0.5 * 0.5 * b3;最近邻元抽样法
    如名称,就近选择一个像素的颜色以上情况是栅格转栅格的,2d纹理其实也很类似,不过使用了的方法很巧妙,lz有兴趣可以研究研究
      

  2.   

    缩进有点问题p11     p12
         |dy
      dx |
    -----p
    p21     p22
      

  3.   

    这个用OpenCV的话有现成的代码,而且有很多种选择。
    用线性插值什么的也行。