文档章节

图像缩小算法

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 834
阅读 1
收藏 0
 

图像缩放的算法倒是挺多的,常见的有最近邻插值法、双线性插值法、三次卷积法等。其中双线性插值算法应该是应用比较广泛的一种方法,在缩放质量和速度上都比较折衷。在xnview里面选择双线性方法对一幅图像进行0.5倍的缩小,发现效果还可以。看了一下算法原理,实现起来也不算困难。可是用自己实现的方法对图像进行0.5倍的缩小时,却发现效果远没有xnview的效果好。商业软件就是做得好啊,难到它所用的双线性方法不是一般书上所叙述的?还是我的实现方式有错?再从网上拷贝了一种双线性插值的实现,发现效果跟我的一样:比较差,锯齿较明显,文字笔画重叠而不可辨认。

原来缩小跟放大还是不一样的,双线性插值对放大来说,效果还不错。缩小时,如果倍数超过0.5,可能效果就要大打折扣了。而高质量的图像缩小算法,网上也没有比较好的资料,虽然有不少像我一样的人,也遇到了这个问题。照理来说,应该很普遍和容易实现才对啊。windows里面的缩略图、众多看图软件的缩放功能都做得那么好。

 

  原始图片

  

             双线性插值                             xnview用双线性

下面说说双线性插值的原理和实现。

对于一个目的像素,设坐标通过反向变换得到的浮点坐标为(i+u,j+v),其中i、j均为非负整数,u、v为[0,1)区间的浮点数,则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。

用一个函数表示,即:
__inline double bilinear(double a, double b, int uv, int u1v, int uv1, int u1v1)
{
return (double) (uv*(1-a)*(1-b)+u1v*a*(1-b)+uv1*b*(1-a)+u1v1*a*b);
}

对一幅图像每个像素的rgb分量进行如上操作,即是双线性插值。

//psrc, sw, sh:源数据及宽高

//pdst, dw, dh:目的数据及宽高

void zoomdata_bilinear(unsigned char* pdst, int dw, int dh, unsigned char* psrc, int sw, int sh)
{
unsigned char *ppdst;
unsigned char * ccsrc; 
int i, j;
ppdst = pdst;
ccsrc = psrc;


for(i=0;i<dh;i++)
{
   for(j=0;j<dw;j++)
   {
    int ii,jj,di;
    double u,v,r,g,b;
    v = (i*sh)/(double)(dh);
    u = (j*sw)/(double)(dw);
    ii = (int)(v);
    jj = (int)(u);
   
    b = bilinear(u-jj, v-ii, 
     ccsrc[ii*sw*3+jj*3], 
     ccsrc[ii*sw*3+(jj+1)*3],
     ccsrc[(ii+1)*sw*3+jj*3],
     ccsrc[(ii+1)*sw*3+(jj+1)*3]);
    g = bilinear(u-jj, v-ii, 
     ccsrc[ii*sw*3+jj*3+1], 
     ccsrc[ii*sw*3+(jj+1)*3+1],
     ccsrc[(ii+1)*sw*3+jj*3+1],
     ccsrc[(ii+1)*sw*3+(jj+1)*3+1]);
    r = bilinear(u-jj, v-ii, 
     ccsrc[ii*sw*3+jj*3+2], 
     ccsrc[ii*sw*3+(jj+1)*3+2],
     ccsrc[(ii+1)*sw*3+jj*3+2],
     ccsrc[(ii+1)*sw*3+(jj+1)*3+2]);
   
    ppdst[i*dw*3+j*3+2] = r;
    ppdst[i*dw*3+j*3+1] = g;
    ppdst[i*dw*3+j*3+0] = b;
   
   }
}

}

© 著作权归作者所有

共有 人打赏支持
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
内容感知图像压缩/扩展库 - Caire

Caire 是基于论文《Seam Carving for Content-Aware Image Resizing》(图像伸缩变换算法)实现的一个内容感知图像 (尺寸) 压缩/扩展库。 特性 已实现: 支持自定义命令行 支持缩小/放大图像...

匿名
02/01
0
0
图像搜索的原理

针对这个问题,请教了算法组的同事,他分享了基本的思路: 对于这种图像搜索的算法,一般是三个步骤: 将目标图片进行特征提取,描述图像的算法很多,用的比较多的是:SIFT描述子,指纹算法函...

凡尘里的一根葱
2015/10/01
30
0
PSNR峰值信噪比matlab实现

PSNR,峰值信噪比,通常用来评价一幅图像压缩后和原图像相比质量的好坏,当然,压缩后图像一定会比原图像质量差的,所以就用这样一个评价指标来规定标准了。PSNR越高,压缩后失真越小。这里主...

sac761
2017/08/01
0
0
Google 图片搜索的原理

针对这个问题,请教了算法组的同事,他分享了基本的思路: 对于这种图像搜索的算法,一般是三个步骤: 1. 将目标图片进行特征提取,描述图像的算法很多,用的比较多的是:SIFT描述子,指纹算...

卢松松
2012/05/28
5.4K
32
常用的像素操作算法:Resize、Flip、Rotate

Resize 图像缩放是把原图像按照目标尺寸放大或者缩小,是图像处理的一种。 图像缩放有多种算法。最为简单的是最临近插值算法,它是根据原图像和目标图像的尺寸,计算缩放的比例,然后根据缩放...

fengzhizi715
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【七】组合Action

本章描述了常用定义Action的方法。 自定义action builders 我们在action一章已经看过如何声明一个action——有request parameter、无request parameter、有body parser等等。你可以在 asynch...

Landas
34分钟前
0
0
Spring Boot实战之基础回顾

本文作者: 吴伟祥 本文链接: https://wuweixiang.cn/2018/08/21/Spring-Boot实战之基础回顾/ 版权声明: 本博客所有文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议。转载请在文章开...

吴伟祥
34分钟前
0
0
OAuth认证开发

提示: 以下测试是基于项目安装成功,初始化数据库(initial_db.ddl, oauth.ddl, initial_data.ddl)后的测试, 也可在页面上点击"client_details"菜单里进行测试 方式1:基于浏览器 (grant_type=...

舒文joven
43分钟前
1
0
第二章-对象及变量的并发访问-第二篇

锁对象的改变 请阅读如下代码 public class MainClass { private String lock = "123"; public void printStringB() { try { synchronized (lock) { ......

简心
47分钟前
0
0
日志中记录代理IP以及真实客户端、apache只记录指定URI的日志

apache 日志中记录代理IP以及真实客户端 默认情况下log日志格式为: LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined 其中%h 是记录访问者的IP,如果在web的前...

李超小牛子
56分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部