当前位置:文档之家› 图像缩放算法

图像缩放算法

图像缩放算法
图像缩放算法

图像缩放算法

摘要:首先给出一个基本的图像缩放算法,然后一步一步的优化其速度和缩放质量;

高质量的快速的图像缩放全文分为:

上篇近邻取样插值和其速度优化

中篇二次线性插值和三次卷积插值

下篇三次线性插值和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*Sr

c.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;

unsigned long dst_width=Dst.width;

TARGB32* pDstLine=Dst.pdata;

unsigned long srcy_16=0;

for (unsigned long y=0;y

{

TARGB32*

pSrcLine=((TARGB32*)((TUInt8*)Src.pdata+Src.byte_width*(srcy_16>>16))); unsigned long srcx_16=0;

for (unsigned long x=0;x

{

pDstLine[x]=pSrcLine[srcx_16>>16];

srcx_16+=xrIntFloat_16;

}

srcy_16+=yrIntFloat_16;

((TUInt8*&)pDstLine)+=Dst.byte_width;

}

}

//////////////////////////////////////////////////////////////////////// ////////

//速度测试:

//====================================================================== ========

// PicZoom3 414.4 fps

//////////////////////////////////////////////////////////////////////// ////////

d.定点数优化使函数能够处理的最大图片尺寸和缩放结果(肉眼不可察觉的误差)受到了一

定的影响,这里给出一个使用浮点运算的版本,可以在有这种需求的场合使用:

void PicZoom3_float(const TPicRegion& Dst,const TPicRegion& Src)

{

//注意: 该函数需要FPU支持

if ( (0==Dst.width)||(0==Dst.height)

||(0==Src.width)||(0==Src.height)) return;

double xrFloat=1.000000001/((double)Dst.width/Src.width);

double yrFloat=1.000000001/((double)Dst.height/Src.height);

unsigned short RC_Old;

unsigned short RC_Edit;

asm //设置FPU的取整方式为了直接使用fist浮点指令

{

FNSTCW RC_Old // 保存协处理器控制字,用来恢复

FNSTCW RC_Edit // 保存协处理器控制字,用来修改

FWAIT

OR RC_Edit, 0x0F00 // 改为 RC=11 使FPU向零取整

FLDCW RC_Edit // 载入协处理器控制字,RC场已经修改

}

unsigned long dst_width=Dst.width;

TARGB32* pDstLine=Dst.pdata;

double srcy=0;

for (unsigned long y=0;y

{

TARGB32* pSrcLine=((TARGB32*)((TUInt8*)Src.pdata+Src.byte_width* ((long)srcy)));

/**//*

double srcx=0;

for (unsigned long x=0;x

{

pDstLine[x]=pSrcLine[(unsigned long)srcx];//因为默认的浮点取整是

一个很慢

//的操作! 所以才使用了直接操作FPU的内联汇编代码。

srcx+=xrFloat;

}*/

asm fld xrFloat //st0==xrFloat

asm fldz //st0==0 st1==xrFloat

unsigned long srcx=0;

for (long x=0;x

{

asm fist dword ptr srcx //srcx=(long)st0

pDstLine[x]=pSrcLine[srcx];

asm fadd st,st(1) //st0+=st1 st1==xrFloat

}

asm fstp st

asm fstp st

srcy+=yrFloat;

((TUInt8*&)pDstLine)+=Dst.byte_width;

}

asm //恢复FPU的取整方式

{

FWAIT

FLDCW RC_Old

}

}

//////////////////////////////////////////////////////////////////////// ////////

//速度测试:

//====================================================================== ========

// PicZoom3_float 286.2 fps

//////////////////////////////////////////////////////////////////////// ////////

e.注意到这样一个事实:每一行的缩放比例是固定的;那么可以预先建立一个缩放映射表格

来处理缩放映射算法(PicZoom3_Table和PicZoom3_float的实现等价);

void PicZoom3_Table(const TPicRegion& Dst,const TPicRegion& Src)

{

if ( (0==Dst.width)||(0==Dst.height)

||(0==Src.width)||(0==Src.height)) return;

unsigned long dst_width=Dst.width;

unsigned long* SrcX_Table = new unsigned long[dst_width];

for (unsigned long x=0;x

{

SrcX_Table[x]=(x*Src.width/Dst.width);

}

TARGB32* pDstLine=Dst.pdata;

for (unsigned long y=0;y

{

unsigned long srcy=(y*Src.height/Dst.height);

TARGB32* pSrcLine=((TARGB32*)((TUInt8*)Src.pdata+Src.byte_width* srcy));

for (unsigned long x=0;x

pDstLine[x]=pSrcLine[SrcX_Table[x]];

((TUInt8*&)pDstLine)+=Dst.byte_width;

}

delete [] SrcX_Table;

}

//////////////////////////////////////////////////////////////////////// ////////

//速度测试:

//====================================================================== ========

// PicZoom3_Table 390.1 fps

//////////////////////////////////////////////////////////////////////// ////////

f.为了加快缩放,可以采用根据缩放比例动态生成函数的方式来得到更快的缩放函数;这

有点像编译器的工作原理;要实现它需要的工作量比较大(或比较晦涩)就不再实现了;

(动态生成是一种不错的思路,但个人觉得对于缩放,实现它的必要性不大)

g.现代CPU中,在读取数据和写入数据时,都有自动的缓存机制;很容易知道,算法中生

成的数据不会很快再次使用,所以不需要写入缓存的帮助;在SSE指令集中增加了movntq 等指令来完成这个功能;

(尝试过利用CPU显式prefetcht0、prefetchnta预读指令或直接的mov读取指令等速度反而略有下降:( 但预读在copy算法中速度优化效果很明显 )

void PicZoom3_SSE(const TPicRegion& Dst,const TPicRegion& Src)

{

//警告: 函数需要CPU支持MMX和movntq指令

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;

unsigned long dst_width=Dst.width;

TARGB32* pDstLine=Dst.pdata;

unsigned long srcy_16=0;

for (unsigned long y=0;y

{

TARGB32* pSrcLine=((TARGB32*)((TUInt8*)Src.pdata+Src.byte_width* (srcy_16>>16)));

asm

{

push ebp

mov esi,pSrcLine

mov edi,pDstLine

mov edx,xrIntFloat_16

mov ecx,dst_width

xor ebp,ebp //srcx_16=0

and ecx, (not 3) //循环4次展开

TEST ECX,ECX //nop

jle EndWriteLoop

lea edi,[edi+ecx*4]

neg ecx

//todo: 预读

WriteLoop:

mov eax,ebp

shr eax,16 //srcx_16>>16

lea ebx,[ebp+edx]

movd mm0,[esi+eax*4]

shr ebx,16 //srcx_16>>16

PUNPCKlDQ mm0,[esi+ebx*4]

lea ebp,[ebp+edx*2]

// movntq qword ptr [edi+ecx*4], mm0 //不使用缓存的写入指令

asm _emit 0x0F asm _emit 0xE7 asm _emit 0x04 asm _emit 0x8F

mov eax,ebp

shr eax,16 //srcx_16>>16

lea ebx,[ebp+edx]

movd mm1,[esi+eax*4]

shr ebx,16 //srcx_16>>16

PUNPCKlDQ mm1,[esi+ebx*4]

lea ebp,[ebp+edx*2]

// movntq qword ptr [edi+ecx*4+8], mm1 //不使用缓存的写入指令

asm _emit 0x0F asm _emit 0xE7 asm _emit 0x4C asm _emit 0x8F asm _emit 0x08

add ecx, 4

jnz WriteLoop

//sfence //刷新写入

asm _emit 0x0F asm _emit 0xAE asm _emit 0xF8 emms

EndWriteLoop:

mov ebx,ebp

pop ebp

//处理边界循环次数为0,1,2,3;(这个循环可以展开,做一个跳转表,略)

mov ecx,dst_width

and ecx,3

TEST ECX,ECX

jle EndLineZoom

lea edi,[edi+ecx*4]

neg ecx

StartBorder:

mov eax,ebx

shr eax,16 //srcx_16>>16

mov eax,[esi+eax*4]

mov [edi+ecx*4],eax

add ebx,edx

inc ECX

JNZ StartBorder

EndLineZoom:

}

//

srcy_16+=yrIntFloat_16;

((TUInt8*&)pDstLine)+=Dst.byte_width;

}

}

//===================================================================== //鉴于有读者反映汇编代码阅读困难,这里给出一个使用intel提供的函数调用方式的实现,

//读者可以相互对照来阅读代码

//要编译PicZoom3_SSE_mmh,需要#include #include //并且需要编译器支持

//函数PicZoom3_SSE_mmh速度为 593.7 fps

void PicZoom3_SSE_mmh(const TPicRegion& Dst,const TPicRegion& Src)

{

//警告: 函数需要CPU支持MMX和movntq指令

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;

unsigned long dst_width=Dst.width;

TARGB32* pDstLine=Dst.pdata;

unsigned long srcy_16=0;

unsigned long for4count=dst_width/4*4;

for (unsigned long y=0;y

{

TARGB32*

pSrcLine=((TARGB32*)((TUInt8*)Src.pdata+Src.byte_width*(srcy_16>>16))); unsigned long srcx_16=0;

unsigned long x;

for (x=0;x

{

__m64 m0=_m_from_int(*(int*)(&pSrcLine[srcx_16>>16]));

srcx_16+=xrIntFloat_16;

m0=_m_punpckldq(m0,

_m_from_int(*(int*)(&pSrcLine[srcx_16>>16])) );

srcx_16+=xrIntFloat_16;

__m64 m1=_m_from_int(*(int*)(&pSrcLine[srcx_16>>16]));

srcx_16+=xrIntFloat_16;

m1=_m_punpckldq(m1,

_m_from_int(*(int*)(&pSrcLine[srcx_16>>16])) );

srcx_16+=xrIntFloat_16;

_mm_stream_pi((__m64 *)&pDstLine[x],m0); //不使用缓存的写入指令 _mm_stream_pi((__m64 *)&pDstLine[x+2],m1); //不使用缓存的写入指令 }

for (x=for4count;x

{

pDstLine[x]=pSrcLine[srcx_16>>16];

srcx_16+=xrIntFloat_16;

}

srcy_16+=yrIntFloat_16;

((TUInt8*&)pDstLine)+=Dst.byte_width;

}

_m_empty();

}

//////////////////////////////////////////////////////////////////////// ////////

//速度测试:

//====================================================================== ========

// PicZoom3_SSE 711.7 fps

//////////////////////////////////////////////////////////////////////// ////////

E: 缩放效果图:

原图放大图(x轴放大8倍,y轴放大12倍)

原图缩小图(缩小到0.66倍) 放大图(放大到1.6倍)

F: 把测试成绩放在一起:

//////////////////////////////////////////////////////////////////////// ////////

//CPU: AMD64x2 4200+(2.1G) zoom 800*600 to 1024*768

//====================================================================== ========

// 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

//

// PicZoom0 19.4 fps

// PicZoom1 30.1 fps

// PicZoom2 185.8 fps

// PicZoom3 414.4 fps

// PicZoom3_float 286.2 fps

// PicZoom3_Table 390.1 fps

// PicZoom3_SSE 711.7 fps

//////////////////////////////////////////////////////////////////////// ////////

补充Intel Core2 4400上的测试成绩:

//////////////////////////////////////////////////////////////////////// ////////

//CPU: Intel Core2 4400(2.00G) zoom 800*600 to 1024*768

//====================================================================== ========

// PicZoom0 15.0 fps

// PicZoom1 63.9 fps

// PicZoom2 231.2 fps

// PicZoom3 460.5 fps

// PicZoom3_float 422.5 fps

// PicZoom3_Table 457.6 fps

// PicZoom3_SSE 1099.7 fps

//////////////////////////////////////////////////////////////////////// ////////

摘要:首先给出一个基本的图像缩放算法,然后一步一步的优化其速度和缩放质量;

高质量的快速的图像缩放全文分为:

上篇近邻取样插值和其速度优化

中篇二次线性插值和三次卷积插值

下篇三次线性插值和MipMap链

正文:

为了便于讨论,这里只处理32bit的ARGB颜色;

代码使用C++;涉及到汇编优化的时候假定为x86平台;使用的编译器为vc2005;

为了代码的可读性,没有加入异常处理代码;

测试使用的CPU为AMD64x2 4200+(2.37G) 和 Intel Core2 4400(2.00G);

速度测试说明:

只测试内存数据到内存数据的缩放

测试图片都是800*600缩放到1024*768; fps表示每秒钟的帧数,值越大表示函数越快A:近邻取样插值、二次线性插值、三次卷积插值缩放效果对比

原图近邻取样缩放到0.6倍近邻取样缩放到1.6倍

二次线性插值缩放到0.6倍二次线性插值缩放到1.6倍

三次卷积插值缩放到0.6倍三次卷积插值缩放到1.6倍

原图近邻取样缩放到8倍二次线性插值缩放到8倍三次卷积插值缩放到8倍二次线性插值(近似公式)

近邻取样插值缩放简单、速度快,但很多时候缩放出的图片质量比较差(特别是对于人物、景色等),

图片的缩放有比较明显的锯齿;使用二次或更高次插值有利于改善缩放效果;

B: 首先定义图像数据结构:

#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];

}

二次线性插值缩放:

C: 二次线性插值缩放原理和公式图示:

缩放后图片原图片

(宽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

聚焦看看(Sx,Sy)坐标点(Sx,Sy为浮点数)附近的情况;

对于近邻取样插值的缩放算法,直接取Color0颜色作为缩放后点的颜色;

二次线性插值需要考虑(Sx,Sy)坐标点周围的4个颜色值Color0\Color1\Color2\Color3,把(Sx,Sy)到A\B\C\D坐标点的距离作为系数来把4个颜色混合出缩放后点的颜色;

( u=Sx-floor(Sx); v=Sy-floor(Sy); 说明:floor函数的返回值为小于等于参数的最大整数 )

二次线性插值公式为:

tmpColor0=Color0*(1-u) + Color2*u;

tmpColor1=Color1*(1-u) + Color3*u;

DstColor =tmpColor0*(1-v) + tmpColor2*v;

展开公式为:

pm0=(1-u)*(1-v);

pm1=v*(1-u);

pm2=u*(1-v);

pm3=u*v;

则颜色混合公式为:

DstColor = Color0*pm0 + Color1*pm1 + Color2*pm2 + Color3*pm3;

参数函数图示:

二次线性插值函数图示

对于上面的公式,它将图片向右下各移动了半个像素,需要对此做一个修正;

=> Sx=(Dx+0.5)*SW/DW-0.5; Sy=(Dy+0.5)*SH/DH-0.5;

而实际的程序,还需要考虑到边界(访问源图片可能超界)对于算法的影响,边界的处理可能有各种方案(不处理边界或边界回绕或边界饱和或边界映射或用背景颜色混合等;文章中默认使用边界饱和来处理超界);

比如:边界饱和函数:

//访问一个点的函数,(x,y)坐标可能超出图片边界; //边界处理模式:边界饱和

inline TARGB32 Pixels_Bound(const TPicRegion& pic,long x,long y)

{

//assert((pic.width>0)&&(pic.height>0));

bool IsInPic=true;

if (x<0) {x=0; IsInPic=false; } else if (x>=pic.width ) {x=pic.width -1; IsInPic=false; }

if (y<0) {y=0; IsInPic=false; } else if (y>=pic.height) {y=pic.heigh t-1; IsInPic=false; }

TARGB32 result=Pixels(pic,x,y);

if (!IsInPic) result.a=0;

return result;

}

D: 二次线性插值缩放算法的一个参考实现:PicZoom_BilInear0

该函数并没有做什么优化,只是一个简单的浮点实现版本;

inline void Bilinear0(const TPicRegion& pic,float fx,float fy,TARGB3 2* result)

{

long x=(long)fx; if (x>fx) --x; //x=floor(fx);

long y=(long)fy; if (y>fy) --y; //y=floor(fy);

TARGB32 Color0=Pixels_Bound(pic,x,y);

TARGB32 Color2=Pixels_Bound(pic,x+1,y);

TARGB32 Color1=Pixels_Bound(pic,x,y+1);

TARGB32 Color3=Pixels_Bound(pic,x+1,y+1);

float u=fx-x;

float v=fy-y;

float pm3=u*v;

float pm2=u*(1-v);

float pm1=v*(1-u);

float pm0=(1-u)*(1-v);

result->a=(pm0*Color0.a+pm1*Color1.a+pm2*Color2.a+pm3*Color3.a); result->r=(pm0*Color0.r+pm1*Color1.r+pm2*Color2.r+pm3*Color3.r); result->g=(pm0*Color0.g+pm1*Color1.g+pm2*Color2.g+pm3*Color3.g); result->b=(pm0*Color0.b+pm1*Color1.b+pm2*Color2.b+pm3*Color3.b); }

void PicZoom_Bilinear0(const TPicRegion& Dst,const TPicRegion& Src)

{

if ( (0==Dst.width)||(0==Dst.height)

||(0==Src.width)||(0==Src.height)) return;

unsigned long dst_width=Dst.width;

TARGB32* pDstLine=Dst.pdata;

for (unsigned long y=0;y

{

float srcy=(y+0.4999999)*Src.height/Dst.height-0.5;

for (unsigned long x=0;x

{

float srcx=(x+0.4999999)*Src.width/Dst.width-0.5;

Bilinear0(Src,srcx,srcy,&pDstLine[x]);

}

((TUInt8*&)pDstLine)+=Dst.byte_width;

}

}

//////////////////////////////////////////////////////////////////////// ////////

//速度测试:

//====================================================================== ========

// PicZoom_BilInear0 8.3 fps

//////////////////////////////////////////////////////////////////////// ////////

E: 把PicZoom_BilInear0的浮点计算改写为定点数实现:PicZoom_BilInear1

inline void Bilinear1(const TPicRegion& pic,const long x_16,const lo ng y_16,TARGB32* result)

{

long x=x_16>>16;

long y=y_16>>16;

TARGB32 Color0=Pixels_Bound(pic,x,y);

TARGB32 Color2=Pixels_Bound(pic,x+1,y);

TARGB32 Color1=Pixels_Bound(pic,x,y+1);

TARGB32 Color3=Pixels_Bound(pic,x+1,y+1);

unsigned long u_8=(x_16 & 0xFFFF)>>8;

unsigned long v_8=(y_16 & 0xFFFF)>>8;

unsigned long pm3_16=(u_8*v_8);

unsigned long pm2_16=(u_8*(unsigned long)(256-v_8));

unsigned long pm1_16=(v_8*(unsigned long)(256-u_8));

unsigned long pm0_16=((256-u_8)*(256-v_8));

result->a=((pm0_16*Color0.a+pm1_16*Color1.a+pm2_16*Color2.a+pm3_ 16*Color3.a)>>16);

result->r=((pm0_16*Color0.r+pm1_16*Color1.r+pm2_16*Color2.r+pm3_ 16*Color3.r)>>16);

result->g=((pm0_16*Color0.g+pm1_16*Color1.g+pm2_16*Color2.g+pm3_ 16*Color3.g)>>16);

result->b=((pm0_16*Color0.b+pm1_16*Color1.b+pm2_16*Color2.b+pm3_ 16*Color3.b)>>16);

}

void PicZoom_Bilinear1(const TPicRegion& Dst,const TPicRegion& Src)

{

if ( (0==Dst.width)||(0==Dst.height)

图像增强算法综述

图像增强算法研究综述 刘璐璐 宁波工程学院电子与信息工程学院计算机科学与技术071班,邮编:(315100) E-mail:375212239@https://www.doczj.com/doc/f64024583.html, 摘要:本文简要介绍图像增强的概念和图像增强算法的分类,从图像的直方图均衡化处理方法,直方图规定化处理方法和图像平滑处理方法三方面对图像增强算法进行讨论和研究,并说明了图像增强技术的应用和前景展望。 关键词:图像增强直方图均衡化直方图规定化平滑处理 近年来,随着电子计算机技术的进步,计算机图像处理得到了飞跃的发展,己经成功的应用于几乎所有与成像有关的领域,并正发挥着相当重要的作用。它利用计算机对数字图像进行系列操作,从而获得某种预期的结果。对图像进行处理时,经常运用图像增强技术以改善图像的质量增强对某种信息的辨识能力,以更好的应用于现代各种科技领域,图像增强技术的快速发展同它的广泛应用是分不开的,发展的动力来自稳定涌现的新的应用,我们可以预料,在未来社会中图像增强技术将会发挥更为重要的作用。在图像处理过程中,图像增强是十分重要的一个环节。 1.图像增强概念及现实应用 1.1 图像增强技术 图像增强是数字图像处理的基本内容之一。图像增强是指按特定的需要突出一幅图像中的某些信息,同时,削弱或去除某些不需要的信息。这类处理是为了某种应用目的去改善图像质量,处理的结果更适合于人的视觉特性或机器识别系统,图像增强处理并不能增加原始图像的信息,而只能增强对某种信息的辨识能力,使处理后的图像对某些特定的应用比原来的图像更加有效。 1.2图像增强技术的现实应用 目前,图像增强处理技术的应用己经渗透到医学诊断、航空航天、军事侦察、纹识别、无损探伤、卫星图片的处理等领域,在国民经济中发挥越来越大的作用。其中最典型的应用主要体现以下方面。 1

任意比例视频图像放大算法的研究与实现

任意比例视频图像放大算法的研究与实现 摘要:随着多媒体信息技术的发展,针对视频信号的处理技术应运而生。其中实时缩放正是视频信号处理技术的关键。对于图像缩放,所用数学模型的优劣会直接影响用户观看图像的质量。在视频处理中,图像的缩放算法不仅影响视频质量,而且算法的处理速度也会影响视频流的显示,从而影响用户观看的连续性。本文针对视频信号对处理速度和精度的要求,采用只对亮度信号进行复杂处理的方法。分析图像边缘区域的特性,并通过数学推导,在边缘区域的插值中设计四个模板,从而设计改进的视频缩放算法。实验结果表明,本设计的视频信号缩放算法在主观视觉上保持了图像纹理细节和边缘信息。客观评价中,本算法处理得到的图像高频分量丢失少,且保证较好的低频分量处理效果;平均峰值信噪比较双线性插值提高0.24dB。 关键词:视频信号;图像处理;缩放;边缘 ABRSTRACT:With the rapid development of multimedia information technology,video signal's processing technology emerges at that time. Video’s real-time scaling is the key issue in video signal's processing technology. For image scaling,the mathematical model affects the picture’s visual quality. In video processing,not only the scaling algorithm influences the video’s quality,but also the alg orithm’s performance affects the display of the video so that influences the video playing smoothly.Due to the speed and precision demanded in video signal’s processing,only employ the proposed algorithm in Y channel signal. Under the analysis on the characteristic of the edge in image,four scaling masks are deduced mathematically. This paper issues a lot of experiments on the infrastructure of the theoretical study,which show that the video signal's scaling algorithm designed in this paper has obtained the better effectiveness than traditional algorithms. Our design keeps texture details in subjective vision,raises the PSNR 0.24dB on average,and it has well performance in both high and low frequency component in spectrum at the same. This is satisfied with the designated target of the project. Key words: video signals; image processing; scaling; edge 1 绪论 1.1 研究背景及意义 信息技术和互联网发展到今天,多媒体信息技术的应用范围日趋广泛,多媒体信息包括音频数据、图像和视频数据及文字数据。而人类获取的各种信息中,图像信息占有绝大部分,图像带给人们直观并具体的事物形象,这是声音、语言和文字不能比拟的。 人眼看到的是连续变化的景物,是模拟图像,而在数字设备中存储和显示的图像是经过采样和量化的数字图像。为满足人类视觉和实现信息传输的需求,针对图像和视频信息的实时缩放技术在生活中起着不可忽略的作用[1]。 视频图像的后期缩放处理势必将会作为显示呈现在终端之前的一个重要环节。无论其输入视频信源的分辨率大小尺寸多少,最终都应该以用户的实际物理显示设备的最佳观看分辨率作为显示输出结果,通常由于带宽有限的关系,该显示过程通常以放大为主,即输入视频图像分辨率小于输出分辨率。为了满足不同终端用户对图像尺寸的需求,改变图像尺寸的缩放技术应运而生。 图像缩放是数字图像处理中非常重要的技术之一。对于网络传输的图像,由于客观条件的种种限制,想要快速地传输高分辨率的图像一般难以达到,同时由于硬件性能的限制,图片往往也无法满足所需要的分辨率,而硬件的改进却需要复杂的技术并付出昂贵的代价,所以如果能够从软件技术方面进行改进,采用图像插值技术提高图像质量来达到所期望的分辨率和清晰度,其具有的实用意义将是十分重大的。因此,利用插值的方法将低分辨率图像插值放大成高分辨率图像就成为人们追求的目标。 用图像缩放算法进行处理时,存在一对相悖的要素:图像处理速度和图像精度。一般情况下,要想获得比较高的速度甚至达到实时的图像输出速率,只能采用相对来说运算量比较简单的缩放算法;而如果要想获得处理效果比较好的图像,就只能考虑牺牲处理速度,采用计算量大、比较复杂的缩放算法。图像缩

线性插值算法实现图像缩放详解

线性插值算法实现图像缩放详解 在Windows中做过图像方面程序的人应该都知道Windows的GDI有?个API函数:StretchBlt,对应在VCL中是 TCanvas类的StretchDraw方法。它可以很简单地实现图像的缩放操作。但问题是它是用了速度最快,最简单但效果也是最差的“最近邻域法”,虽然在大多数情况下,它也够用了,但对于要求较高的情况就不行了。 不久前做了?个小玩意儿,用于管理我用DC拍的?堆照片,其中有?个插件提供了缩放功能,目前的版本就是用了StretchDraw,有时效果不能令人满意,我?直想加入两个更好的:线性插值法和三次样条法。经过研究发现三次样条法的计算量实在太大,不太实用,所以决定就只做线性插值法的版本了。 从数字图像处理的基本理论,我们可以知道:图像的变形变换就是源图像到目标图像的坐标变换。简单的想法就是把源图像的每个点坐标通过变形运算转为目标图像的相应点的新坐标,但是这样会导致?个问题就是目标点的坐标通常不会是整数,而且像放大操作会导致目标图像中没有被源图像的点映射到,这是所谓 “向前映射”方法的缺点。所以?般都是采用“逆向映射”法。 但是逆向映射法同样会出现映射到源图像坐标时不是整数的问题。这里就需要“重采样滤波器”。这个术语看起来很专业,其实不过是因为它借用了电子信号处理中的惯用说法(在大多数情 况下,它的功能类似于电子信号处理中的带通滤波器),理解起来也不复杂,就是如何确定这个非整数坐标处的点应该是什么颜色的问题。前面说到的三种方法:最近邻域法,线性插值法和三次样条法都是所谓的“重采样滤波器”。 所谓“最近邻域法”就是把这个非整数坐标作?个四舍五入,取最近的整数点坐标处的点的颜色。而“线性插值法”就是根据周围最接近的几个点(对于平面图像来说,共有四点)的颜色作线性插值计算(对于平面图像来说就是二维线性插值)来估计这点的颜色,在大多数情况下,它的准确度要高于最近邻域法,当然效果也要好得多,最明显的就是在放大时,图像边缘的锯齿比最近邻域法小非常多。当然它同时还带业个问题:就是图像会显得比较柔和。这个滤波器用专业术语来说(呵呵,卖弄?下偶的专业^_^)叫做:带阻性能好,但有带通损失,通带曲线的矩形系数不高。至于三次样条法我就不说了,复杂了?点,可自行参考数字图像处理方面的专业书籍,如本文的参考文献。 再来讨论?下坐标变换的算法。简单的空间变换可以用?个变换矩阵来表示: [x’,y’,w’]=[u,v,w]*T 其中:x’,y’为目标图像坐标,u,v为源图像坐标,w,w’称为齐次坐标,通常设为1,T为?个3X3的变换矩阵。 这种表示方法虽然很数学化,但是用这种形式可以很方便地表示多种不同的变换,如平移,旋转,缩放等。对于缩放来说,相当于: [Su 0 0 ] [x, y, 1] = [u, v, 1] * | 0 Sv 0 | [0 0 1 ] 其中Su,Sv分别是X轴方向和Y轴方向上的缩放率,大于1时放大,大于0小于1时缩小,小于0时 反转。 矩阵是不是看上去比较晕?其实把上式按矩阵乘法展开就是: { x = u * Su

开题报告(基于内容感知的图像缩放处理方法研究与实现)

长江大学 毕业设计(论文)开题报告 题目名称:基于内容感知的图像缩放方法研究与实现院 (系):计算机科学学院 专业班级:软工(实)11001班 学生姓名:邹会明 指导教师:余华平 辅导教师:余华平 开题报告日期: 2013年12月15日

基于内容感知的图像缩放方法研究与实现学生:邹会明院系:长江大学计算机科学学院 指导教师:余华平工作单位:长江大学计算机科学学院 1.题目来源 随着大屏幕显示设备的普及,4:3的图像信号与16:9的屏幕大小之间的矛盾变得日益突出。我们可以经常见到当4:3的图像变换为16:9的图像时,屏幕两侧或者上下会出现两条黑带。常规的图像等比例缩放显然已经不能满足这种需求,这就需要运用图像缩放技术对原始视频图像进行非等比例缩放。 图像缩放技术是数字图像处理领域一项基础而重要的技术,传统的图像缩放技术一般采用最近邻插值法,双线性插值法和双三次插值法这几种常用的差值法或者图像切割法进行缩放,这类方法存在的最大问题是,在将4:3视频图像转换为16:9时,X、Y方向是非等比例缩放,景物的畸变较大,使人难以接受。如果对图像切割,会使得图像部分内容丢失。而基于内容感知的图像缩放方法,它是采用Seam Carving技术的自适应图像缩放方法,通过不断移除或插入图像中对内容影响较小的缝合线,可以改变图像的长度比、实现图像重构、保留图像感兴趣区域、实现图像目标移除,实现图像尺寸的缩小和放大,并能够在缩放过程中保留图像重要内容,是目前非常有效的一种方法。所以基于内容感知的图像缩放方法研究与实现在自然图像处理方面有其较高应用价值和意义,以及研究的必要性。2.研究的目的及意义 1)目的 本文通过介绍一种基于内容感知的图像缩放方法,运用seam carving 技术,对图像上的关键部分和不重要区域进行计算,确定图像的能量低值点,找到最短路径,在纵横向上进行无缝裁剪,从而使得随意改变一个图像的高宽比但不让内容变得扭曲成为可能。 2)意义 电子产品的多样性对数字媒体提出了更高的要求,当把相同的图像或视频信息在不同分辨率和纵横比的电子产品上显示时,传统的缩放方法已经不能很好地满足用户的需求,传统的缩放方法一致地把这些信息缩放到目标大小,这样图像

视觉检测原理介绍

技术细节 本项目应用了嵌入式中央控制及工业级图像高速传输控制技术,基于CCD/CMOS与DSP/FPGA的图像识别与处理技术,成功建立了光电检测系统。应用模糊控制的精选参数自整定技术,使系统具有对精确检测的自适应调整,实现产品的自动分选功能。 图1 控制系统流程图 光电检测系统主要通过检测被检物的一些特征参数(灰度分布,RGB分值等),从而将缺陷信息从物体中准确地识别出来,通过后续的系统进行下一步操作,主要分为以下几部分 CCD/CMOS图像采集部分 系统图像数据采集处理板中光信号检测元件CCD/CMOS采用进口的适合于高精度检测的动态分析单路输出型、保证实际数据输出速率为320MB/s的面阵CCD/CMOS。像素分别为4000*3000和1600*1200,帧率达到10FPS。使用CCD/CMOS 作为输入图像传感器,从而实现了图像信息从空间域到时间域的变换。为了保证所需的检测精度,需要确定合理的分辨率。根据被检测产品的大小,初步确定系统设计分辨率为像素为0.2mm。将CCD/CMOS接收的光强信号转换成电压幅值,再经过A/D转换后由DSP/ FPGA芯片进行信号采集,即视频信号的量化处理过程,图像采集处理过程如图所示:

图2 图像采集处理过程 数据处理部分 在自动检测中,是利用基于分割的图像匹配算法来进行图像的配对为基础的。图像分割的任务是将图像分解成互不相交的一些区域,每一个区域都满足特定区域的一致性,且是连通的,不同的区域有某种显著的差异性。分割后根据每个区域的特征来进行图像匹配,基于特征的匹配方法一般分为四个步骤:特征检测、建立特征描述、特征匹配、利用匹配的“特征对”求取图像配准模型参数。 算法基本步骤如下: 1)利用图像的色彩、灰度、边缘、纹理等信息对异源图像分别进行分割,提取区域特征; 2)进行搜索匹配,在每一匹配位置将实时图与基准图的分割结果进行融合,得到综合分割结果; 3)利用分割相似度描述或最小新增边缘准则找出正确匹配位置。 设实时图像分割为m个区域,用符号{A1,A2,… Am}表示,其异源基准图像分割为n个区域,用符号{B1,B2,…Bn}表示。分割结果融合方法如下: 在每一个匹配位置,即假设的图像点对应关系成立时,图像点既位于实时图中,又位于其异源基准图像中,则融合后区域点的标识记为:(A1B1,A1B2,…,A2B1,A2B2,…)。标识AiBj表示该点在实时图中位于区域i,在基准图中位于区域j。算法匹配过程如下图所示:

(完整版)基于matlab的图像缩小算法

一、基于matlab图像缩小算法 缩小算法与放大算法不同,图像缩小是通过减少像素个数来实现的。因此,需要根据缩小的尺寸来选择合适的像素点,使得图像缩小后尽可能保持源图像特征。基于等间隔采样的缩小算法。 这种算法是通过对图像像素的均匀采样来保持所选择的像素仍旧保持像素的概貌特征。 算法1通过matlab实现可得: function small=big2small(A,h,l) [m,n]=size(A); k1=m/h;k2=n/l; small=zeros(h,l); for i=1:h for j=1:l i0=i*k1;j0=j*k2; i1=floor(i0+0.5); j1=floor(j0+0.5); small(i,j)=A(i1,j1); end end end 1、基于局部均值的缩小算法。 这种算法通过采样间隔dx,dy将原图像矩阵分割为一系列小的矩阵,并计算这些小矩阵的元素的和,再求其均值赋给目标矩阵相应的像素。这样就避免了算法1中某些未取到的元素不能将其信息反映到目标矩阵的缺点。 算法2通过matlab实现可得: function small=big2small2(A,h,l) [m,n]=size(A); %获得矩阵A大小 A=im2double(A); small=zeros(h,l); for i=1:h for j=1:l sum=0; i1=round((m/h).*(i-1)+1); %将矩阵分块 j1=round((n/l).*(j-1)+1); %i1,j1为矩阵小块左上角元素下标 i2=round((m/h).*i); j2=round((n/l).*j); %i2,j2为矩阵小块右下角元素下标 for ii=i1:i2 for jj=j1:j2 sum=sum+A(ii,jj); %计算矩阵内元素值的和 end end small(i,j)=sum/((i2-i1+1).*(j2-j1+1)); %将均值赋给目标矩阵 end end end

数字图像镶嵌技术综述

1引言 传统的航空遥感图像镶嵌是先将一系列具有重叠区域的图像进行手工镶嵌,去除多余的重叠部分,再进行大幅区域的判读识别。随着航空航天遥感手段的不断进步,数字传感器大量应用于航空航天遥感图像的拍摄,获得的数字图像数量日益增多,依靠传统的人工镶嵌已不能满足“实时性”的需要。因此,依靠计算机技术的数字图像自动镶嵌技术应运而生。数字图像镶嵌技术就是通过计算机将一系列具有重叠区域的图像集合拼接成一幅大型的无缝的图像。通过图像镶嵌技术,可以剔除冗余信息,压缩信息存储量,从而更加有效地表达信息量。 图像镶嵌技术在宇宙空间探测、海底勘测、医学、气象、地质勘测、军事、视频压缩和传输,档案的数字化保存,视频的索引和检索,物体的3-D重建,军事侦察和公安取证等领域都有广泛的应用。主要表现为: (1)全景图和超宽视角图像的合成: 将普通图像或视频图像进行无缝镶嵌,得到超宽视角甚至360度全景图,这样就可以用普通相机实现场面宏大的景物拍摄。 (2)碎片图像的组合: 将医学和科研的显微碎片图像或者空间、海底探测得到的局部图像合成大幅的整体图像。 (3)虚拟现实: 图像镶嵌是虚拟现实领域里场景绘制(Image—basedRenderi-ng,IBR)方法中的一项基本技术。利用图像镶嵌技术可以生成全方位图像,用全景图表示实景可代替3D场景建模和绘制。 数字图像镶嵌技术综述 王志强,程红 (中国人民解放军空军航空大学,长春130022) 摘要:图像镶嵌技术可分为图像预处理、图像配准和图像缝合三个基本步骤,在现实生活中有着广泛的应用。 本文综述了国内外研究数字图像镶嵌的几类经典算法,对各步骤中所使用的算法进行了分析比较,总结了在不同情况下使用不同方法的优缺点,并对图像镶嵌技术的发展进行了展望。 关键词:图像镶嵌;几何校正;图像配准 中图分类号:TP751.1文献标识码:A文章编号:1001-0270(2008)02-0011-04 AReviewonDigitalImageMosaicTechnique WANGZhi-qiang,CHENGHong (PLAAirForceAviationUniversity,Changchun130022) Abstract:Thebasicimagemosaictechniqueincludesthreesteps:imagepretreatment,registrationandstitchingandisveryusefulinreallife.Inthispaper,sometypicaldomesticandoverseasalgorithmswerereviewedandcomparedbyeachstep.Theadvantagesandshortcomingsofusingdifferentmethodsindifferentconditionsweresummarized;theprospectsofthedevelopmentofimagemosaictechniquewerealsoputforward. KeyWords:imagemosaic;geometricrectification;imageregistration 作者简介:王志强,男(1982-),空军航空大学军事情报学专业在读研究生。 程红,女(1969-),硕士生导师、教授,主要从事遥感图像信息处理。 收稿日期:2007-06-14

人脸识别主要算法原理

人脸识别主要算法原理 主流的技术基本上可以归结为三类,即:基于几何特征的方法、基于模板的方法和基于模型的方法。 1. 基于几何特征的方法是最早、最传统的方法,通常需要和其他结合才能有比较好的效果; 2. 基于模板的方法可以分为基于相关匹配的方法、特征脸方法、线性判别分析方法、奇异值分解方法、神经网络方法、动态连接匹配方法等。 3. 基于模型的方法则有基于隐马尔柯夫模型,主动形状模型和主动外观模型的方法等。 1. 基于几何特征的方法 人脸由眼睛、鼻子、嘴巴、下巴等部件构成,正因为这些部件的形状、大小和结构上的各种差异才使得世界上每个人脸千差万别,因此对这些部件的形状和结构关系的几何描述,可以做为人脸识别的重要特征。几何特征最早是用于人脸侧面轮廓的描述与识别,首先根据侧面轮廓曲线确定若干显著点,并由这些显著点导出一组用于识别的特征度量如距离、角度等。Jia 等由正面灰度图中线附近的积分投影模拟侧面轮廓图是一种很有新意的方法。 采用几何特征进行正面人脸识别一般是通过提取人眼、口、鼻等重要特征点的位置和眼睛等重要器官的几何形状作为分类特征,但Roder对几何特征提取的精确性进行了实验性的研究,结果不容乐观。

可变形模板法可以视为几何特征方法的一种改进,其基本思想是:设计一个参数可调的器官模型(即可变形模板),定义一个能量函数,通过调整模型参数使能量函数最小化,此时的模型参数即做为该器官的几何特征。 这种方法思想很好,但是存在两个问题,一是能量函数中各种代价的加权系数只能由经验确定,难以推广,二是能量函数优化过程十分耗时,难以实际应用。基于参数的人脸表示可以实现对人脸显著特征的一个高效描述,但它需要大量的前处理和精细的参数选择。同时,采用一般几何特征只描述了部件的基本形状与结构关系,忽略了局部细微特征,造成部分信息的丢失,更适合于做粗分类,而且目前已有的特征点检测技术在精确率上还远不能满足要求,计算量也较大。 2. 局部特征分析方法(Local Face Analysis) 主元子空间的表示是紧凑的,特征维数大大降低,但它是非局部化的,其核函数的支集扩展在整个坐标空间中,同时它是非拓扑的,某个轴投影后临近的点与原图像空间中点的临近性没有任何关系,而局部性和拓扑性对模式分析和分割是理想的特性,似乎这更符合神经信息处理的机制,因此寻找具有这种特性的表达十分重要。基于这种考虑,Atick提出基于局部特征的人脸特征提取与识别方法。这种方法在实际应用取得了很好的效果,它构成了FaceIt人脸识别软件的基础。 3. 特征脸方法(Eigenface或PCA)

图像处理文献综述

文献综述 近年来,随着计算机视觉技术的日益发展,图像处理作为该领域的关键方向受到越来越多研究人员的关注与思考。在现在的日常生活中,由于通信设备低廉的价格和便捷的操作,人们越来越喜欢用图像和视频来进行交流和分享,消费性的电子产品在消费者中已经非常普遍,例如移动手机和数码相机等等。在这个纷繁多变的世界,每天都有数以万计的图像产生,同时信息冗余问题也随之而来。尽管在一定的程度上,内存技术的增加和网络带宽的提高解决了图像的压缩和传输问题,但是智能的图像检索和有效的数据存储,以及图像内容的提取依然没有能很好的解决。 视觉注意机制可以被看做是人类对视觉信息的一个筛选过程,也就是说只有一小部分重要的信息能够被大脑进行处理。人类在观察一个场景时,他们往往会将他们的注意力集中在他们感兴趣的区域,例如拥有鲜艳的颜色,光滑的亮度,特殊的形状以及有趣的方位的区域。传统的图像处理方法是将整幅图像统一的处理,均匀的分配计算机资源;然而许多的视觉任务仅仅只关系图像中的一个或几个区域,统一的处理整幅图像很明显会浪费过多的计算机资源,减少处理的效率[1,2]。因此,在计算机视觉领域,建立具有人类视觉系统独特数据筛选能力的数学模型显得至关重要。受高效的视觉信息处理机制的启发,计算机视觉领域的显著性检测应运而生。图像显著性检测是通过建立一定的数学模型,让计算机来模拟人类的视觉系统,使得计算机能够准确高效的定位到感兴趣的区域。 一般来说,一个信号的显著性可以表示为其和周围环境的差异性。正是因为这个信号和周围的其他信号的迥异性,使得视觉系统不需要对环境中的所有感兴趣的区域进行逐个的扫描,显著的目标会自动从环境中凸显出来。另外,一些心理学研究表明人类的视觉机制不仅仅是由低级的视觉信号来驱动的,基于记忆、经验等的先验知识同样能够决定场景中的不同信号的显著性,而这些先验知识往往是和一些高层次的事件以及视觉任务联系在一起的。基于当前场景的视觉显著性机制是低级的,慢速的。而基于先验知识的显著性机制通常是和高层次的任务关联在一起的,其效率通常低于由视觉信号驱动的显著性机制。人眼视觉系统通过显著性原理来处理复杂的视觉感知是不争的事实,这种显著性的处理机制使得复杂背景下的目标检测、识别有了很大程度的提升。 在模式识别、计算机视觉等领域,越来越多的计算机工作者致力于开发显著性计算模型,用以简单的表达图像的主要信息。这些显著性模型的检测结果是一个显著性灰度图,其每个像素点的灰度值表示了该像素的显著性,灰度值越大,表明该像素越显著。从信息处理的方式看,显著性模型大致可以分为两类:自顶向下(任务驱动)和自底向上(数据驱动)的方法。 自顶向下的显著性检测方法之所以是任务驱动,这是因为该类模型通常是和某一特定的任务相关。在同样的场景或模式下,检测到的结果因任务的不同而不同是自顶向下模型最突出的特点。例如在目标检测中,检测者需要首先告诉需要检测的目标是什么,检测到的显著性图则表示目标可能出现的位置。自顶向下的显著性检测方法的依据是:如果研究者事先知道需要检测目标的颜色、形状或者方向等特征,那么该检测算法自然会高效的检测到需要检测的目标。因此,自顶向下的算法通常需要人工标记,或是从大量的包含某种特定目标的图像中学习该类目标的特征信息,这些学习方法一般是监督的;然后求测试图像对于训练学习得到的信息的响应,从而得到测试图像的显著性图。现存的一些自顶向下的算法在某些特定的目标上取得了一定的效果,不过这些算法往往只对某些特定的目标有效,对于复杂多变的自然图像,该类算法存在很大的缺陷。自顶向下的模型是慢速的、任务驱动的,有意识的,以及封闭回路的。由于自顶向下模型的特点,其应用受到了很大的限制。

基于matlab的数字图像增强算法研究与实现

基于matlab的数字图像增强算法研究与实现 摘要图像在获取和传输过程中,会受到各种噪声的干扰,使图像退化质量下降,对分析图像不利。图像的平滑或去噪一直是数字图像处理技术中的一项重要工作。为此,论述了在空间域中的各种数字图像平滑技术方法。 关键字:数字图像;图像增强;平滑处理

目录 第一章、概述 2 1.1 图像平滑意义 2 1.2图像平滑应用 2 1.3噪声模 型 (3) 第二章 、图像平滑方法 5 2.1 空域低通滤波 5 2.1.1 均值滤波器 6 2.1.2 中值滤波器 6 2.2 频域低通滤波 7 第三章、图像平滑处理与调试 9 3.1 模拟噪声图像 9 3.2均值滤波法 11 3.3 中值滤波法 14 3.4 频域低通滤波法 17 第四章、总结与体会 19 参考文献 20 第一章、概述 1.1图像平滑意义 图像平滑(S m o o t h i n g)的主要目的是减少图像噪声。图像噪声来自于多方面,有来自于系统外部的干扰(如电磁波或经

电源窜进系统内部的外部噪声),也有来自于系统内部的干扰(如摄像机的热噪声,电器机械运动而产生的抖动噪声内部噪声)。实际获得的图像都因受到干扰而有噪声,噪声产生的原因决定了噪声分布的特性及与图像信号的关系。减少噪声的方法可以在空间域或在频率域处理。在空间域中进行时,基本方法就是求像素的平均值或中值;在频域中则运用低通滤波技术。 图像中的噪声往往是和信号交织在一起的,尤其是乘性噪声,如果平滑不当,就会使图像本身的细节如边缘轮廓,线条等模糊不清,从而使图像降质。图像平滑总是要以一定的细节模糊为代价的,因此如何尽量平滑掉图像的噪声,又尽量保持图像的细节,是图像平滑研究的主要问题之一。 1.2图像平滑应用 图像平滑主要是为了消除被污染图像中的噪声,这是遥感图像处理研究的最基本内容之一,被广泛应用于图像显示、传 输、分析、动画制作、媒体合成等多个方面。该技术是出于人类视觉系统的生理接受特点而设计的一种改善图像质量的方法。处理对象是在图像生成、传输、处理、显示等过程中受到多种因素扰动形成的加噪图像。在图像处理体系中,图像平滑是图像复原技术针对“一幅图像中唯一存在的退化是噪声”时的特例。 1.3噪声模型 1.3.1噪声来源 一幅图像可能会受到各种噪声的干扰,而数字图像的实质就是光电信息,因此图像噪声主要可能来源于以下几个方面:光电传感器噪声、大气层电磁暴、闪电等引起的强脉冲干扰、

图像缩放算法比较分析(IJIGSP-V5-N5-7)

I.J. Image, Graphics and Signal Processing, 2013, 5, 55-62 Published Online April 2013 in MECS (https://www.doczj.com/doc/f64024583.html,/) DOI: 10.5815/ijigsp.2013.05.07 A Comparative Analysis of Image Scaling Algorithms Chetan Suresh Department of Electrical and Electronics Engineering, BITS Pilani Pilani - 333031, Rajasthan, India E-mail: shivchetan@https://www.doczj.com/doc/f64024583.html, Sanjay Singh, Ravi Saini, Anil K Saini Scientist, IC Design Group, CSIR – Central Electronics Engineering Research Institute (CSIR-CEERI) Pilani – 333031, Rajasthan, India Abstract—Image scaling, fundamental task of numerous image processing and computer vision applications, is the process of resizing an image by pixel interpolation. Image scaling leads to a number of undesirable image artifacts such as aliasing, blurring and moiré. However, with an increase in the number of pixels considered for interpolation, the image quality improves. This poses a quality-time trade off in which high quality output must often be compromised in the interest of computation complexity. This paper presents a comprehensive study and comparison of different image scaling algorithms. The performance of the scaling algorithms has been reviewed on the basis of number of computations involved and image quality. The search table modification to the bicubic image scaling algorithm greatly reduces the computational load by avoiding massive cubic and floating point operations without significantly losing image quality. Index Terms—Image Scaling, Nearest-neighbour, Bilinear, Bicubic, Lanczos, Modified Bicubic I.I NTRODUCTION Image scaling is a geometric transformation used to resize digital images and finds widespread use in computer graphics, medical image processing, military surveillance, and quality control [1]. It plays a key role in many applications [2] including pyramid construction [3]-[4], super-sampling, multi-grid solutions [5], and geometric normalization [6]. In surveillance-based applications, images have to be monitored at a high frame rate. Since, the images need not be of the same size, image scaling is necessary for comparison and manipulation of images. However, image scaling is a computationally intensive process due to the convolution operation, which is necessary to band-limit the discrete input and thereby diminishes undesirable aliasing artifacts [2]. Various image scaling algorithms are available in literature and employ different interpolation techniques to the same input image. Some of the common interpolation algorithms are the nearest neighbour, bilinear [7], and bicubic [8]-[9]. Lanczos algorithm utilizes the 3-lobed Lanczos window function to implement interpolation [10]. There are many other higher order interpolators which take more surrounding pixels into consideration, and thus also require more computations. These algorithms include spline [11] and sinc interpolation [12], and retain the most of image details after an interpolation. They are extremely useful when the image requires multiple rotations/distortions in separate steps. However, for single-step enlargements or rotations, these higher-order algorithms provide diminishing visual improvement and processing time increases significantly. Novel interpolation algorithms have also been proposed such as auto-regression based method [13], fuzzy area-based scaling [14], interpolation using classification and stitching [15], isophote-based interpolation [16], and even interpolation scheme combined with Artificial Neural Networks [17]. Although these algorithms perform well, they require a lengthy processing time due to their complexity. This is intolerable for real-time image scaling in video surveillance system. Hence, these algorithms have not been considered for the comparative analysis in this paper. In this paper, firstly, image interpolation algorithms are classified and reviewed; then evaluation and comparison of five image interpolation algorithms are discussed in depth based on the reason that evaluation of image interpolation is essential in the aspect of designing a real-time video surveillance system. Analysis results of the five interpolation algorithms are summarized and presented. II.I MAGE S CALING Image scaling is obtained by performing interpolation over one or two directions to approximate a pixel’s colour and intensity based on the values at neighbouring

人脸识别主要算法原理

人脸识别主要算法原理 主流的人脸识别技术基本上可以归结为三类,即:基于几何特征的方法、基于模板的方法和基于模型的方法。 1. 基于几何特征的方法是最早、最传统的方法,通常需要和其他算法结合才能有比较好的效果; 2. 基于模板的方法可以分为基于相关匹配的方法、特征脸方法、线性判别分析方法、奇异值分解方法、神经网络方法、动态连接匹配方法等。 3. 基于模型的方法则有基于隐马尔柯夫模型,主动形状模型和主动外观模型的方法等。 1. 基于几何特征的方法 人脸由眼睛、鼻子、嘴巴、下巴等部件构成,正因为这些部件的形状、大小和结构上的各种差异才使得世界上每个人脸千差万别,因此对这些部件的形状和结构关系的几何描述,可以做为人脸识别的重要特征。几何特征最早是用于人脸侧面轮廓的描述与识别,首先根据侧面轮廓曲线确定若干显著点,并由这些显著点导出一组用于识别的特征度量如距离、角度等。Jia 等由正面灰度图中线附近的积分投影模拟侧 面轮廓图是一种很有新意的方法。 采用几何特征进行正面人脸识别一般是通过提取人眼、口、鼻等重要特征点的位置和眼睛等重要器官的几何形状作为分类特征,但Roder对几何特征提取的精确性进行了实验性的研究,结果不容乐观。

可变形模板法可以视为几何特征方法的一种改进,其基本思想是: 设计一个参数可调的器官模型(即可变形模板),定义一个能量函数,通过调整模型参数使能量函数最小化,此时的模型参数即做为该器官的几何特征。 这种方法思想很好,但是存在两个问题,一是能量函数中各种代价的加权系数只能由经验确定,难以推广,二是能量函数优化过程十分耗时,难以实际应用。基于参数的人脸表示可以实现对人脸显著特征的一个高效描述,但它需要大量的前处理和精细的参数选择。同时,采用一般几何特征只描述了部件的基本形状与结构关系,忽略了局部细微特征,造成部分信息的丢失,更适合于做粗分类,而且目前已有的特征点检测技术在精确率上还远不能满足要求,计算量也较大。 2. 局部特征分析方法(Local Face Analysis) 主元子空间的表示是紧凑的,特征维数大大降低,但它是非局部化的,其核函数的支集扩展在整个坐标空间中,同时它是非拓扑的,某个轴投影后临近的点与原图像空间中点的临近性没有任何关系,而局部性和拓扑性对模式分析和分割是理想的特性,似乎这更符合神经信息处理的机制,因此寻找具有这种特性的表达十分重要。基于这种考虑,Atick提出基于局部特征的人脸特征提取与识别方法。这种方法在实际应用取得了很好的效果,它构成了FaceIt人脸识别软件的 基础。 3. 特征脸方法(Eigenface或PCA)

图像增强方法的研究

图像增强方法的研究 摘要 数字图像处理是指将图像信号转换成数字格式并利用计算机对其进行处理的过程。在图像处理中,图像增强技术对于提高图像的质量起着重要的作用。本文先对图像增强的原理以及各种增强方法进行概述,然后着重对灰度变换、直方图均衡化、平滑和锐化等几种常用的增强方法进行了深入的研究,在学习数字图像的基本表示与处理方法的基础上,针对图像增强的普遍性问题,研究和实现常用的图像增强方法及其算法,通过Matlab实验得出的实际处理效果来对比各种算法的优缺点,讨论不同的增强算法的适用场合,并对其图像增强方法进行性能评价。如何选择合适的方法对图像进行增强处理,是本文的主要工作,为了突出每种增强方法的差异,本文在Matlab的GUI图形操作界面中集合了四种常用算法的程序,以达到对各种算法的对比更直观和鲜明的效果。 关键词:图像增强直方图均衡化灰度变换平滑锐化

目录 1 图像增强的基本理论 (3) 1.1 课题背景及意义 (3) 1.2 课题的主要内容 (4) 1.3 数字图像基本概念 (5) 1.3.1数字图像的表示 (5) 1.3.2 图像的灰度 (5) 1.3.3灰度直方图 (5) 1.4 图像增强概述 (6) 1.5图像增强概述 (8) 1.5.1图像增强的定义 (8) 1.5.2常用的图像增强方法 (8) 1.5.3图像增强的现状与应用 (9) 2 图像增强方法与原理 (10) 2.1 图像变换 (10) 2.1.1 离散图像变换的一般表达式 (10) 2.1.2 离散沃尔什变换 (11) 2.2 灰度变换 (12) 2.2.1 线性变换 (12) 2.2.2 分段线性变换 (13) 2.2.3 非线性变换 (13) 2.3 直方图变换 (14) 2.3.1 直方图修正基础 (14) 2.3.2 直方图均衡化 (16) 2.3.3 直方图规定化 (17) 2.4 图像平滑与锐化 (18) 2.4.1 平滑 (18) 2.4.2 锐化 (19)

相关主题
文本预览
相关文档 最新文档