织梦CMS - 轻松建站从此开始!

罗索

双线性插值(Bilinear interpolation)的图像拉伸在mobile上面的实

落鹤生 发布于 2012-06-27 09:19 点击:次 
在进入频域变换之前, 我们还是轻松一下,再搞点平面上的变化来看看。这把选了一个双线性插值(Bilinear interpolation)来实现是源于看到了csdn上别人的问题, 权且实现一个函数,方便大家的使用吧。
TAG:

在进入频域变换之前, 我们还是轻松一下,再搞点平面上的变化来看看。这把选了一个双线性插值(Bilinear interpolation)来实现是源于看到了csdn上别人的问题, 权且实现一个函数,方便大家的使用吧。

双线性插值简单的说,就是扩展了之后的图像像素坐标映射回原来的坐标空间的时候, 如果出现了没有对应到整数点的情况。这时候需要做2次线性的插值计算出新的坐标的像素值,比如说:

这里可以看到这个P点落在了ABCD区间内, 如果我们本着最朴素的这个P点最靠近谁权重就越大的加权平均的思想, 我们很容易得到这样的论断:

b3

A点对P的影响就是Sa的面积, B点的影响就是Sb, C点就Sc, d就是Sd。这样越近就是权重越大,基本上就是这样的逻辑。

这样P的像素可以简单的用 (A*Sa+B*Sb+C*Sc+D*Sd )/(Sa+Sb+Sc+Sd);来得到了。以我的雷厉风行,马上写出了如下的代码:

  1. /** 
  2. ** method to remove sharp the raw image with unsharp mask 
  3. * @param src input grayscale binary array  
  4. * @param dst output grayscale result, 
  5. * the memory need to be allocated outside of the function 
  6. * @param srcWidth width of the input grayscale image 
  7. * @param srcHeight height of the input grayscale image 
  8. * @param scalePercent, scale percentage (0-xxx) 
  9. */ 
  10. void stretchImage (const unsigned char* src, unsigned char* dst
  11. int srcWidth, int srcHeight, int scalePercent) 
  12. {    
  13.     if (scalePercent < 0) 
  14.         return
  15.     int x, y; 
  16.     int ox, oy; 
  17.     int tmpx,tmpy; 
  18.     int ratio = (100 << 8)/scalePercent; 
  19.     int dstWidth = srcWidth * scalePercent / 100; 
  20.     int dstHeight = srcHeight * scalePercent / 100; 
  21.     unsigned char color[2][2]; 
  22.     for (int j = 0; j < dstHeight; j ++) 
  23.     { 
  24.         for (int i = 0; i < dstWidth; i ++) 
  25.         { 
  26.             tmpx = i * ratio; 
  27.             tmpy = j * ratio; 
  28.             ox = tmpx >> 8; 
  29.             oy = tmpy >> 8; 
  30.             x = tmpx & 0xFF; 
  31.             y = tmpy & 0xFF; 
  32.             color[0][0] = src[ oy*srcWidth + ox ];  
  33.             color[1][0] = src[ oy*srcWidth + ox +1 ];  
  34.             color[0][1] = src[ (oy+1)*srcWidth + ox ];  
  35.             color[1][1] = src[ (oy+1)*srcWidth + ox+1 ]; 
  36.             int final = (0x100 - x)*(0x100 - y)*color[0][0] + x*(0x100 - y)
  37. *color[1][0] + (0x100-x)*y*color[0][1] + x*y*color[1][1]; 
  38.             final = final >> 16; 
  39.             if (final>255) 
  40.                 final = 255; 
  41.             if (final<0) 
  42.                 final = 0; 
  43.             dst [ j*dstWidth + i] = (unsigned char)final; 
  44.         } 
  45.     } 

需要说明的事情是, 浮点数需要引入效率上一定的损失, 当然我们这里就用大数来和谐。但是只是随便写写的代码, 我们没有加入超出int范围的检查或者说明,暂时也只能这样了:)。用了这个函数的效果还是不错的, 我们来看看在75%,125%和250%时候的效果:

原图:

sample

%75效果图:

75%

125%效果图:

125%

250%效果图:

250%

其实从效果图多少可以看出一些的问题就是, 随着图像的拉伸, 图像的锐度其实降低了, 这个比较容易想象的,因为我们这个拉伸的办法本身就是线性的,无疑来扩大的时候把锐利的边缘模糊化了,所以自然在图像扩大很多倍的时候效果不是很好了。

(hhygcy)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201206/16119.html]
本文出处:CSDN博客 作者:hhygcy 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容