文档章节

图像缩小算法

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 834
阅读 1
收藏 0
点赞 0
评论 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

PSNR峰值信噪比matlab实现

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

sac761 ⋅ 2017/08/01 ⋅ 0

图像搜索的原理

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

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

Google 图片搜索的原理

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

卢松松 ⋅ 2012/05/28 ⋅ 32

常用的像素操作算法:Resize、Flip、Rotate

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

fengzhizi715 ⋅ 2017/12/14 ⋅ 0

图像处理之特征提取(三)之SIFT简单梳理

图像处理之特征提取(三)之SIFT简单梳理     学习SIFT一段时间,有些东西理解不透彻,且网上没有清晰解释。以下内容为自己的胡思乱想,均无确切依据,辩证看待。    SIFT,即尺度不变特...

coming_is_winter ⋅ 2017/06/21 ⋅ 0

Java进阶(五十七)-基于感知哈希算法的pHash图像配准算法

Java进阶(五十七)-基于感知哈希算法的pHash图像配准算法   毕业论文提交之后,老师交给自己一项任务:图像配准,也就是给你两幅图像,通过系统来判定两幅图像是否为同一副图像。自己作为这...

sunhuaqiang1 ⋅ 2017/04/18 ⋅ 0

图像的上采样(upsampling)与下采样(downsampled)

缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。放大图像(或称为上采样(upsampling)或图像...

漫步当下 ⋅ 05/04 ⋅ 0

如何识别图像边缘?

图像识别(image recognition)是现在的热门技术。 文字识别、车牌识别、人脸识别都是它的应用。但是,这些都算初级应用,现在的技术已经发展到了这样一种地步:计算机可以识别出,这是一张狗...

阮一峰 ⋅ 2016/07/22 ⋅ 0

教程 | TF官方博客:基于TensorFlow.js框架的浏览器实时姿态估计

  选自TensorFlow Blog   机器之心编译   参与:王淑婷、路      TensorFlow 近日发布 TensorFlow.js 版本 PoseNet,该版本 PoseNet 只要电脑或手机配备了适当的网络摄像头,就可以...

机器之心 ⋅ 05/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Gitee 生成并部署SSH key

1.如何生成ssh公钥 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public/private rsa key pair...# 三次回车即可生成 ssh key 查看你的 ...

晨猫 ⋅ 43分钟前 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部