图像缩放算法
图像缩放算法
摘要:首先给出一个基本的图像缩放算法,然后一步一步的优化其速度和缩放质量;
高质量的快速的图像缩放 全文 分为:
上篇 近邻取样插值和其速度优化
中篇 二次线性插值和三次卷积插值
下篇 三次线性插值和MipMap链
正文:
为了便于讨论,这里只处理32bit的ARGB颜色;
代码使用C++;涉及到汇编优化的时候假定为x86平台;使用的编译器为vc2005;
为了代码的可读性,没有加入异常处理代码;
测试使用的CPU为AMD64x2 4200+(2.37G) 和 Intel Core2 4400(2.00G);
速度测试说明:
只测试内存数据到内存数据的缩放
测试图片都是800*600缩放到1024*768; fps表示每秒钟的帧数,值越大表示函数越快
////////////////////////////////////////////////////////////////////////////////
//Windows GDI相关函数参考速度:
//==============================================================================
// BitBlt 544.7 fps //is copy 800*600 to 800*600
// BitBlt 331.6 fps //is copy 1024*1024 to 1024*1024
// StretchBlt 232.7 fps //is zoom 800*600 to 1024*1024
////////////////////////////////////////////////////////////////////////////////
A: 首先定义图像数据结构:
#define asm __asm
typedef unsigned char TUInt8; // [0..255]
struct TARGB32 //32 bit color
{
TUInt8 B,G,R,A; // A is alpha
};
struct TPicRegion //一块颜色数据区的描述,便于参数传递
{
TARGB32* pdata; //颜色数据首地址
long byte_width; //一行数据的物理宽度(字节宽度);
//abs(byte_width)有可能大于等于width*sizeof(TARGB32);
long width; //像素宽度
long height; //像素高度
};
//那么访问一个点的函数可以写为:
inline TARGB32& Pixels(const TPicRegion& pic,const long x,const long y)
{
return ( (TARGB32*)((TUInt8*)pic.pdata+pic.byte_width*y) )[x];
}
B: 缩放原理和公式图示:
缩放后图片 原图片
(宽DW,高DH) (宽SW,高SH) (Sx-0)/(SW-0)=(Dx-0)/(DW-0) (Sy-0)/(SH-0)=(Dy-0)/(DH-0)
=> Sx=Dx*SW/DW Sy=Dy*SH/DH
C: 缩放算法的一个参考实现
//给出一个最简单的缩放函数(插值方式为近邻取样,而且我“尽力”把它写得慢一些了:D)
//Src.PColorData指向源数据区,Dst.PColorData指向目的数据区
//函数将大小为Src.Width*Src.Height的图片缩放到Dst.Width*Dst.Height的区域中
void PicZoom0(const TPicRegion& Dst,const TPicRegion& Src)
{
if ( (0==Dst.width)||(0==Dst.height)
||(0==Src.width)||(0==Src.height)) return;
for (long x=0;x
{
for (long y=0;y
{
long srcx=(x*Src.width/Dst.width);
long srcy=(y*Src.height/Dst.height);
Pixels(Dst,x,y)=Pixels(Src,srcx,srcy);
}
}
}
////////////////////////////////////////////////////////////////////////////////
//速度测试:
//==============================================================================
// PicZoom0 19.4 fps
////////////////////////////////////////////////////////////////////////////////
D: 优化PicZoom0函数
a.PicZoom0函数并没有按照颜色数据在内存中的排列顺序读写(内部循环递增y行
索引),将造成CPU缓存预读失败和内存颠簸导致巨大的性能损失,(很多硬件都有这种特性,
包括缓存、内存、显存、硬盘等,优化顺序访问,随机访问时会造成巨大的性能损失)
所以先交换x,y循环的顺序: void PicZoom1(const TPicRegion& Dst,const TPicRegion& Src)
{
if ( (0==Dst.width)||(0==Dst.height)
||(0==Src.width)||(0==Src.height)) return;
for (long y=0;y
{
for (long x=0;x
{
long srcx=(x*Src.width/Dst.width);
long srcy=(y*Src.height/Dst.height);
Pixels(Dst,x,y)=Pixels(Src,srcx,srcy);
}
}
}
////////////////////////////////////////////////////////////////////////////////
//速度测试:
//==============================================================================
// PicZoom1 30.1 fps
////////////////////////////////////////////////////////////////////////////////
b.“(x*Src.Width/Dst.Width)”表达式中有一个除法运算,它属于很慢的操作(比一般
的加减运算慢几十倍!),使用定点数的方法来优化它;
void PicZoom2(const TPicRegion& Dst,const TPicRegion& Src)
{
if ( (0==Dst.width)||(0==Dst.height)
||(0==Src.width)||(0==Src.height)) return;
//函数能够处理的最大图片尺寸65536*65536
unsigned long xrIntFloat_16=(Src.width<<16)/Dst.width+1; //16.16格式定点数
unsigned long yrIntFloat_16=(Src.height<<16)/Dst.height+1; //16.16格式定点数
//可证明: (Dst.width-1)*xrIntFloat_16
for (unsigned long y=0;y
{
for (unsigned long x=0;x
{
unsigned long srcx=(x*xrIntFloat_16)>>16; unsigned long srcy=(y*yrIntFloat_16)>>16;
Pixels(Dst,x,y)=Pixels(Src,srcx,srcy);
}
}
}
////////////////////////////////////////////////////////////////////////////////
//速度测试:
//==============================================================================
// PicZoom2 185.8 fps
////////////////////////////////////////////////////////////////////////////////
c. 在x的循环中y一直不变,那么可以提前计算与y相关的值; 1.可以发现srcy的值和x变量无关,可以提前到x轴循环之前;2.展开Pixels函数,优化与y相关的指针计算;
void PicZoom3(const TPicRegion& Dst,const TPicRegion& Src)
{
if ( (0==Dst.width)||(0==Dst.height)
||(0==Src.width)||(0==Src.height)) return;
unsigned long xrIntFloat_16=(Src.width<<16)/Dst.width+1;
unsigned long yrIntFloat_16=(Src.height<<16)/Dst.height+1;
基于双立方插值算法的图像缩放硬件设计
ISSN 1009-3044 Compu ̄rKnowledge and Technology电脑知识与技术
Vo1.9,No.7,March 2013.
基于双立方插值算法的图像缩放硬件设计
邵欣欣 ,刘卫东 。
(1.中国海洋大学信息科学与工程学院,山东青岛266100;2.海信电器股份有限公司山东青岛266071) E—mail:edu dnzs.net.en
http://www.dnzs.net.en Tel:+86—551—65690963 65690964
摘要:该文首先介绍了三种图像缩放时常见的插值算法,并对它们进行比较分析,最终确定了该文是基于双立方插值(也
叫双三次插值)技术的实现,接着在此基础上设计了一种应用于视频图像缩放的算法,最后在硬件方面实现了相对应的图
像缩放的硬件设计并对它进行了功能仿真。该文的亮点在于视频图像缩放的双立方插值算法的设计,以及在硬件实现上
为节省硬件资源所做的设计。
关键词:双立方插值;图像缩放;算法;视频图像
中图分类号:TP391 文献标识码:A 文章编号:1009—3044(2013)O7—1638—04
Image Scaling Design Based on the Bicubic Algorithm
SHAO Xin—xin .LIU Wei—dong 1。
(1.CoHege of Information Science and Engineering,Ocean University of China,Qingdao 266100,China;2.Hisense Electric Ltd,
Qingdao 26607 1,China)
Abstract:Firstly,this paper introduces three kinds of interpolation algorithms in the image scaling,then analyzes the comparative
对数坐标系下图形缩放算法研究及VS2010实现
第14卷第4期2014年2月 1671—1815(2014)04—0205—08 科学技术与工程 Science Technology and Engineering Vo1.14 No.4 Feb.2014 ⑥2014 Sci.Tech.Engrg.
对数坐标系下图形缩放算法研究及
VS2010实现
刘波涛 , 王新海 ’ 张福祥 王青海 王 钊
(油气资源与勘探技术教育部重点实验室(长江大学) ;长江大学计算机科学学院 ,荆州434023 中国石油天然气股份有限公司塔里木油田 ,库尔勒841000; 山东省东营市胜利油田钻井工艺研究院信息中心 ,东营257000; 中国石油伊拉克公司 , E京100724)
摘要研究图形缩放功能的设计与实现,对于软件的开发有着实际的应用价值,尤其是在试井解释软件中存在着大量的双 对数及半对数坐标系,且缩放功能是该类软件实现其他功能的基础,因此对数坐标系下图形缩放功能的设计与实现研究对开 发类似软件就成为必要。系统地阐述了普通直角坐标系、双对数及半对数坐标系下图形缩放功能的设计及算法推导,给出了 相关坐标转换公式,随后利用该思路在VS2010环境下开发的试井解释软件为例,进行了详细测试,测试结果表明按该思路设
计实现的软件运行正确、可靠。 关键词 缩放功能 对数坐标系 坐标转换 VS2010 中图法分类号TE319; 文献标志码A
在开发试井解释软件的过程中¨ J,通常需要
绘制双对数图版曲线 和半对数压力曲线,以便
进行相关的分析与处理。而一个功能完善的试井解
释软件不仅仅要能绘制出双对数及半对数曲线,更
重要的是应该提供缩放曲线的功能,以便用户能查
看曲线的整体及局部信息,为随后的试井解释工作
打好基础。因此,研究对数坐标系下,图形的缩放功
能对于试井软件的开发就显得尤为必要。
调研显示,文献[10]根据坐标平移的原理,设
计出一个用于有限元网格图局部放大的程序。文献
如何使用计算机视觉技术进行图像尺度变换
如何使用计算机视觉技术进行图像尺度变换
图像尺度变换是计算机视觉领域中的重要技术之一,它可以将图像在大小上进行调整。图像尺度变换在很多应用中起着关键作用,如图像缩放、图像放大、图像裁剪等。本文将介绍如何使用计算机视觉技术进行图像尺度变换。
首先,介绍图像缩放技术。图像缩放是指按照一定的比例对图像进行大小上的调整。常见的图像缩放方法有最近邻插值、双线性插值和双立方插值等。最近邻插值是一种简单的方法,它通过选择最近的像素值来确定新图像中的像素值。双线性插值是一种更为常用的方法,它通过对周围4个像素进行加权平均来计算新图像中的像素值。双立方插值是一种更精确的方法,它考虑了更多的周围像素,并通过三次多项式来计算新图像中的像素值。通过选择合适的缩放方法,可以得到高质量的缩放图像。
接下来,介绍图像放大技术。图像放大是指对图像进行大小上的增加。在图像放大过程中,存在一个问题,即图像像素的增加如何填充。常见的图像放大方法有最近邻插值、双线性插值和基于波尔兹曼机的方法等。最近邻插值方法在放大图像时,将最近的像素值复制到新的像素位置。双线性插值方法通过对周围4个像素进行加权平均来计算新图像中的像素值。基于波尔兹曼机的方法则通过学习原始图像的分布特征,并根据先验知识生成新的像素值。这些方法在图像放大时都能产生较好的效果。
最后,介绍图像裁剪技术。图像裁剪是指对图像进行大小上的调整和剪裁。在图像裁剪中,通常需要选择一个感兴趣的区域,并将其剪裁出来。常见的图像裁剪方法包括手动选择和自动选择。手动选择方法需要用户手动指定感兴趣的区域,然后对图像进行裁剪。自动选择方法则通过计算图像中各个区域的特征,选择具有重要信息的区域进行裁剪。通过合适的图像裁剪方法,可以得到满足需求的图像区域。
在实际应用中,图像尺度变换技术有着广泛的应用。例如,在图像处理软件中,用户可以使用图像缩放技术对图像进行调整,以适应不同的显示设备或打印需求。在图像识别和物体检测中,图像尺度变换技术可以帮助识别算法适应不同尺度的图像,从而提高识别准确性。在计算机生成的图像中,图像放大技术可以提高图像的清晰度和细节。此外,在人脸识别和视频压缩等领域,图像裁剪技术也扮演着重要角色。
基于改进Catmull—Rom样条的图像缩放算法
第2 070 7 期 年4月 计算机技术与发展
(_、【) fPU丌 R TECFINOIX}GY AND DEVELOPⅣIFNT V()1.17 NO.4 Apr. 2007
基于改进Catmull—Rom样条的图像缩放算法
江巨浪
(安庆师范学院物理与电气工程学院,安徽安庆246011)
摘要: tI1roll—Rom样条函数具有C1连续性质与快速插值能力,其每一个节点的导数值部是由其相邻的2个节点确 定。文中通过相邻4个节点确定样条上各节点的导数值,由此重新构造了Catmull—Rom样条以进一步减少插值误差。实
验结果表明,将这种改进的Catmull—Rom样条用于图像的缩放处理,插值误差明显减少,插值效率高,适用于对图像缩放
的质量与速度都有较高要求的场合。 关键词:图像缩放;Ca ̄.ML—Rom样条;插值误差;插值效率
中图分类号:TP391.4 文献标识码:A 文章编号:1673—629X(2007)04—021l一03
Image Zooming Algorithm Based on the Improved
Catmull‘’Rom Spline
JIANG Ju—lang
(School of Physics and Electric ̄Engineering,. ̄mqing Teachers College,Anqing 246011,China)
Abstract:catmull—Rom spline function has efficient interpolating abiiiw m1d C continuity,and its derivative at each point is defined by
the previous and next point.To further reduce the interpolation errors,use the values at the 4 neighboring points to define the first deriva-
基于Sobel算子和均匀插值的非线性缩放算法
第38卷
Vl01.38 第4期
NO.4 计算机工程
Computer Engineering 2012年2月 February 2012
・图形图像处理・ 文章编号:1Ⅲlo_-3428(20l2)04_-0194-_02 文献标识码:A 中圈分类号:TP391
基于Sobel算子和均匀插值的非线性缩放算法
陈锋,沈庆宏
、 (南京大学电子科学与工程学院,南京210093)
摘要:针对图像缩放后产生的图像畸形与拉伸问题,提出一种基于Sobel算子和均匀插值的非线性缩放算法。通过图像能量区分出图像
强势区域和弱势区域,在保护强势区域的同时,对弱势区域进行非线性均匀插值缩放。实验结果表明,该算法可解决图像缩放时主体区域
产生的畸变问题,保证边缘区域的平稳过渡。 关奠词:非线性缩放;图像梯度;均匀插值;强势区域;弱势区域
Non—linear Scaling Algorithm
Based on Sobel Operator and Uniform Interpolation
CHEN Feng,SHEN Qing-hong
(School of Electronic Science and Engineering,Nanjing University,Nanjing 210093,China)
[Abstract]To solve the image defects and image stretching generated by image scaling,a non—linear scaling algorithm based on Sobel operator
and uniform interpolation is proposed in this paper.It uses gradient energy to distinguish the strong regions and the weak regions.Non—linear uniform interpolation scaling algorithm is used in weak regions,while it preserves those strong regions.Experimental results show that the algorithm can solve the problem of the main parts distortion generated by image scaling,and ensure a smooth transition between the region edges.
编程实现一幅图像的平移、镜像、旋转、缩小和放大
武汉理工大学《通信工程应用技术》课程设计任务说明书
课程设计任务书
学生姓名: 专业班级: 通信1003班
指导教师: 郭志强 工作单位: 信息工程学院
题 目: 通信工程应用技术
初始条件:
(1)使用matlab软件进行操作
(2)选择一个图像进行处理
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)编程实现一幅图像的平移、镜像、旋转、缩小和放大。
(2)给出所用算法的理论依据和必要的推导过程,给出原始图像和处理后的图像。
时间安排:
第15周:安排任务,布置题目;
第15—18周:设计仿真,撰写报告
第19周:完成设计,提交报告,答辩
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日武汉理工大学《通信工程应用技术》课程设计任务说明书
目录
摘要 .................................................................................................................................................................. I
Abstract ........................................................................................................................................................... II
基于Ferguson曲面插值的图像缩放方法
第35卷第1期 V_0l-35 No.1 河北工业大学学报 J0URNAL OF HEBEI UNⅣERSITY OF TECHNOLOGY 2006年2月 February 2006
文章编号:1007—2373(2006)O1—0049—05
基于Ferguson曲面插值的图像缩放方法
韩忠杰 ,饶道娟。,穆国旺
(1.天津大学理学院。天津300072;2.河北工业大学理学院,天津300130)
摘要图像缩放是数字图像处理中经常遇到的问题,可通过对图像插值来实现.在常用的插值方法中,邻近点插 值方法和双线性插值方法都不能保证插值处导数值连续,因而有些情况下无法满足实际需要.三次样条插值方法 可以达到 连续,因而具有较好的图像效果,但计算速度较慢.本文提出了一种利用Ferguson双三次曲面插值 进行图像缩放的算法,该方法的连续阶比邻近点插值和双线性插值高,同时,计算速度比三次样条插值快. 关键 词 图像缩放;邻近点插值;线性插值;双三次样条插值;Ferguson曲面插值 中图分类号TP391.4 文献标识码A
Image Scaling Based on Ferguson Surface Interpolation
HAN Zhong-jie。,RA0 Dao-juan ̄,MU Guo-wang
(1.School of Science,Tianjin University,Tianjin 300072,China;2,School ofSciences,Hebei University ofTechnology,Tianjin 300130,China)
Abstract Image scaling is often encountered in dealing with digital image,which can be implemented by image inter‘ polation,Among the generally used interpolation method,the nearest point interpolation and bilinear interpolation can not obtain C‘continuity,SO.they are not satisfied in some cases,The bicubic spline interpolation method can obtain continuity,therefore,it can get good quality ofimage,however,its computing speed is slower.In this paper a new method is presented,in which Ferguson surface interpolation is used to image scaling.It Can obtain C‘continuity,in this sense it is be ̄er than the nearest point interpolation and bilinear interpolation,meanwhile the computing speed is more quickly than that of bicubic spline interpolation. Keywords image scaling;thenearestpointinterpolation;bilinearinterpolation;bicubic splineinterpolation;Ferguson surface interpolation
一种结合Seam Carving和人脸检测的人像缩放算法
第22卷第6期 2012年6月 计算机技术与发展
COMPUTER TECHNOLOGY AND DEVELOPMENT V01.22 No.6 June 2012
一种结合Seam Carving和人脸检测的
人像缩放算法
唐彩虹
(广东轻工职业技术学院计算机工程系,广东广州5103oo)
摘要:人脸是人物图像中的重要特征区域。针对应用Seam Carving算法缩放人物图像后造成人脸畸变的现象,提出了一 种结合人脸检测的人物图像缩放算法。首先识别图像中的人脸区域,其次在使用Seam Ca ̄ing算法缩放图像的过程中提
高梯度图中人脸区域的梯度值,防止低能量线穿越人脸区域,进而达到在缩放图像的同时保持人脸特征的目的。实验结
果表明,该算法实现非等比缩放人物图像的同时有效保护了人脸区域,提升了缩放后的图像质量。
关键词:细缝提取;人脸检测;图像缩放;梯度图;人脸特征 中图分类粤:TP391.41 文献标识码:A 文章编号:1673-629X(2012)06-0111-03
People Image Resizing Algorithm By Combining Seam
Carving and Face Detection
TANG Cai-hong
(Department of Computer Engineering。Guangdong Industry Technical College,Guangzhou 5 10300,China)
Abstract:Face is all important feamre of people image.Seam Carving Call crea ̄serious artifacts upon face area dunng people images re— ducfion.An algorithm for people image reduction was presented in this paper.This algorithm overcomes this shortcoming by combining Seam Carving and face detection.First.face region is identified。followed by increasing the gradient of the human face region in gradient image during SeamCarving executionto preventface areafrom passingthrough of seams.andthusto retainthefacialfeatureswhile re・
cv2.resize原理
cv2.resize原理
cv2.resize是OpenCV中的一个函数,用于调整图像的大小。它的原理是将原始图像按照给定的大小比例进行缩放,同时使用特定的插值算法对像素进行重新采样。在这个过程中,我们需要指定目标图像的大小和插值算法类型。下面我们将对cv2.resize的原理进行详细分析。
1.缩放比例
cv2.resize函数的第一个参数是原图像,第二个参数是缩放比例。通常情况下,缩放比例是一个浮点数或一个整数元组。如果缩放比例是浮点数,则表示缩放的比例因子。
例如,如果缩放比例为0.5,则表示将原始图像缩小为一半。类似地,如果缩放比例为2,则表示将原始图像扩大两倍。
如果缩放比例是一个整数元组,则分别表示水平和垂直方向的缩放比例。例如,如果缩放比例为(500,300),则表示将原始图像缩小到水平方向的500像素,垂直方向的300像素。
2.插值算法
缩放是通过重新采样像素来实现的。 在缩放过程中,可能会出现一些像素没有对应像素值的问题,因此需要使用插值算法来确定这些像素的值。
常用的插值算法有三种:最近邻插值、双线性插值和立方插值。它们的工作原理如下所述:
最近邻插值算法:该算法从最近的像素中获取像素值。假设我们要将原始图像的尺寸乘以k倍,然后我们需要找到那些点最接近新图像像素( x', y') -这是我们想要查找的值。最近邻插值将返回在原始图像中距离( x', y') 最近的像素的值。
双线性插值算法:该算法使用距离目标点最近的四个像素来估算像素值。它计算x和y方向的插值。首先,它沿着水平方向插值图像的两个相邻像素,然后沿着竖直方向插值得到目标像素。这种插值方法是一种所谓的线性插值,因为函数的形式是一条直线。
3.实现原理
cv2.resize函数的实现原理是首先计算出目标图像的大小,然后根据指定的插值算法和缩放比例对原始图像进行重新采样来输出新图像。
基于mfc的opencv中resize
基于mfc的opencv中resize
1.引言
1.1 概述
概述:
本文主要介绍基于MFC的OpenCV中Resize的实现原理及其在图像处理中的应用。首先,我们将简要介绍MFC框架和OpenCV库,包括它们的基本概念和主要功能。然后,我们将重点探讨Resize函数的原理,该函数是OpenCV库中一个重要的图像缩放函数,可以实现图像的大小调整。最后,我们将详细介绍如何在基于MFC的应用程序中使用OpenCV库实现Resize功能,并给出实际代码示例。通过本文的学习,读者将能够更深入地了解MFC框架和OpenCV库的结合应用,以及如何使用Resize函数对图像进行处理和调整。在文章的结尾,我们将对本文进行总结,并展望Resize函数在未来的发展和应用前景。
1.2 文章结构
文章结构部分主要是对整篇文章进行简要的介绍和概括,包括各个章节的主要内容和组织结构。在本篇文章中,文章结构可以按照以下方式进行描述:
本文主要通过以下几个章节来介绍基于MFC的OpenCV中resize的实现。
第一章是引言部分,概述了文章的研究背景和重要性。首先介绍了基于MFC的OpenCV中resize的需求和应用场景,然后对文章的结构和内容进行了简单的介绍,最后明确了本文的目的和主要贡献。 第二章是正文部分,主要分为四个小节。首先是MFC介绍,介绍了MFC的基本概念和用途,以及MFC在图像处理中的应用。接着是OpenCV介绍,对OpenCV进行了简要的介绍,包括OpenCV的基本功能和使用方式。然后是Resize函数原理,对Resize函数的工作原理进行了详细的解释和说明。最后是基于MFC的OpenCV中resize的实现,详细介绍了基于MFC框架下如何实现resize功能,包括代码示例和实际应用。
第三章是结论部分,主要总结了本文的研究内容和结果,回顾了本文的主要贡献和创新点。同时,也对基于MFC的OpenCV中resize功能进行了展望,提出了一些待解决的问题和可能的改进方向。
