文档章节

图像缩小算法

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 834
阅读 2
收藏 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
广州
高级程序员
私信 提问
常用的像素操作算法:Resize、Flip、Rotate

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

fengzhizi715
2017/12/14
0
0
Google 图片搜索的原理

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

卢松松
2012/05/28
5.6K
32
[Graphics] An Efficient Normal Map Generator

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mahabharata_/article/details/83502828 最近因为研一的课程、作业太多,平时很少有时间干自己的事情,也好久...

RyuZhihao123
10/30
0
0
内容感知图像压缩/扩展库 - Caire

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

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

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

凡尘里的一根葱
2015/10/01
30
0

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
5
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
5
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
33
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部