基于meanshift算法的图像处理

基于meanshift算法的图像处理
基于meanshift算法的图像处理

Mean Shift,我们翻译为“均值飘移”。其在聚类,图像平滑。图像分割和跟踪方面得到了比较广泛的应用。由于本人目前研究跟踪方面的东西,故此主要介绍利用Mean Shift 方法进行目标跟踪,从而对MeanShift有一个比较全面的介绍。

(以下某些部分转载常峰学长的“Mean Shift概述”)Mean Shift 这个概念最早是由Fukunaga等人于1975年在一篇关于概率密度梯度函数的估计(The Estimation of the Gradient of a Density Function, with Applications in Pattern Recognition )中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里Mean Shift是一个名词,它指代的是一个向量,但随着Mean Shift理论的发展,Mean Shift的含义也发生了变化,如果我们说Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束.

然而在以后的很长一段时间内Mean Shift并没有引起人们的注意,直到20年以后,也就是1995年,另外一篇关于Mean Shift的重要文献(Mean shift, mode seeking, and clustering )才发表.在这篇重要的文献中,Yizong Cheng对基本的Mean Shift算法在以下两个方面做了推广,首先Yizong Cheng定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同,其次Yizong Cheng还设定了一个权重系数,使得不同的样本点重要性不一样,这大大扩大了Mean Shift的适用范围.另外Yizong Cheng指出了Mean Shift可能应用的领域,并给出了具体的例子。

Comaniciu等人在还(Mean-shift Blob Tracking through Scale Space)中把非刚体的跟踪问题近似为一个Mean Shift最优化问题,使得跟踪可以实时的进行。目前,利用Mean Shift进行跟踪已经相当成熟。

目标跟踪不是一个新的问题,目前在计算机视觉领域内有不少人在研究。所谓跟踪,就是通过已知的图像帧中的目标位置找到目标在下一帧中的位置。

下面主要以代码形式展现Mean Shift在跟踪中的应用。

void CObjectTracker::ObjeckTrackerHandlerByUser(IplImage *frame)//跟踪函数{

m_cActiveObject = 0;

if (m_sTrackingObjectTable[m_cActiveObject].Status)

{

if (!m_sTrackingObjectTable[m_cActiveObject].assignedAnObject)

{

FindHistogram(frame,m_sTrackingObjectTable[m_cActiveObject].initHistogram);

m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = true;

}

else

{

FindNextLocation(frame);//利用mean shift 迭代找出目标下一个位置点

DrawObjectBox(frame);

}

}

}

void CObjectTracker::FindNextLocation(IplImage *frame)

{

int i, j, opti, optj;

SINT16 scale[3]={-3, 3, 0};

FLOAT32 dist, optdist;

SINT16 h, w, optX, optY;

//try no-scaling

FindNextFixScale(frame);//找出目标的下一个大致范围

optdist=LastDist;

optX=m_sTrackingObjectTable[m_cActiveObject].X;

optY=m_sTrackingObjectTable[m_cActiveObject].Y;

//try one of the 9 possible scaling

i=rand()*2/RAND_MAX;

j=rand()*2/RAND_MAX;

h=m_sTrackingObjectTable[m_cActiveObject].H;

w=m_sTrackingObjectTable[m_cActiveObject].W;

if(h+scale[i]>10 && w+scale[j]>10 && h+scale[i]

{

m_sTrackingObjectTable[m_cActiveObject].H=h+scale[i];

m_sTrackingObjectTable[m_cActiveObject].W=w+scale[j];

FindNextFixScale(frame);

if( (dist=LastDist) < optdist ) //scaling is better

{

optdist=dist;

// printf("Next%f->\n", dist);

}

else //no scaling is better

{

m_sTrackingObjectTable[m_cActiveObject].X=optX;

m_sTrackingObjectTable[m_cActiveObject].Y=optY;

m_sTrackingObjectTable[m_cActiveObject].H=h;

m_sTrackingObjectTable[m_cActiveObject].W=w;

}

};

TotalDist+=optdist; //the latest distance

// printf("\n");

}

这里仍然在跟踪的基础上讲解mean shift。首先还是把mean shift的原理用数学公式说一下吧。1、目标模型,算法采用的是特征值的加权概率分布来描述目标模型。这应该是模式识别中主要描述目标的模型,不同于自动控制理论中采用的状态方程。目标模型共m个特征值(可以理解为像素灰度值)

其中X0是窗口中心点向量值(可能为RBG 向量或者灰度值),Xi 是窗口内第i 点向量值。C 为归一化常数,保障q1+q2+q3+……qm=1,H 为核函数的带宽向量。M 为特征值的个数,对应于图像处理可以理解为灰度等级划分的个数,从而特征值u 为对应的灰度等级。d 函数为脉冲函数,保证只有具有u 特征值的像素才对概率分布作出贡献。从而k函数可以理解为u 灰度值的一个加权频数。

2、匹配对象,也采用特征值加权概率分布

其中,Y 为匹配对象的中心,Xi 是匹配窗口内第i 点向量值,Hh 为匹配窗口的核函数带宽向量。Ch 为匹配窗口特征向量的归一化常数。

3、匹配对象与目标模型的相似程度,相似函数可采用Bhattacharyya 函数

4、匹配过程就是寻找相似函数最大值的寻优过程,Mean-Shift 采用的是梯度下降法。首先将(Y) 在

(Y0)附近进行泰勒级数展开,取前两项。即:

要使得(Y) 向最大值迭代,只要Y 的搜索方向与梯度方向一致即可,通过求导可得到Y0的梯度方向为:

为权值。因此如果如下确定Y1,那么Y1-Y0将与梯度方向一致。

以上为mean shift的数学原理。有关文字的叙述已经在上一篇中提到了。用mean shift来跟踪属于确定性算法,粒子滤波器属于统计学方法。meanshift跟踪算法相对于粒子滤波器来说可能实时性更好一些,但是跟踪的准确性在理论上还是略逊于粒子滤波器的。mean shift 跟踪的的实质就是通过对应的模板来确定目标的下一个位置。通过迭代找到新的中心点(即是目标的新的位置点)。有关跟踪的code如下所示:

/**********************************************************************

Bilkent University:

Mean-shift Tracker based Moving Object Tracker in Video

Version: 1.0

Compiler: Microsoft Visual C++ 6.0 (tested in both debug and release

mode)

Modified by Mr Zhou

**********************************************************************/

#include "ObjectTracker.h"

#include "utils.h"

#include

#include

#include

/*

#define GetRValue(rgb) ((UBYTE8) (rgb))

#define GetGValue(rgb) ((UBYTE8) (((ULONG_32) (rgb)) >> 8))

#define GetBValue(rgb) ((UBYTE8) ((rgb) >> 16))

*/

//#define RGB(r, g ,b) ((ULONG_32) (((UBYTE8) (r) | ((UBYTE8) (g) << 8)) | (((ULONG_32) (UBYTE8) (b)) << 16)))

#define min(a, b) (((a) < (b)) ? (a) : (b))

#define max(a, b) (((a) > (b)) ? (a) : (b))

#define MEANSHIFT_ITARA TION_NO 5

#define DISTANCE_ITARA TION_NO 1

#define ALPHA 1

#define EDGE_DETECT_TRESHOLD 32

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

/*

1 给定目标的初始位置和尺寸, 计算目标在图像中的直方图;

2 输入新图像, 迭代直到收敛:

计算图像上对应区域的新直方图;

新直方图与目标直方图比较,计算权重;

根据权重,计算图像上对应区域的形心/质心;

根据形心,修正目标位置;

直方图分为两部分, 每部分大小4096,

RGB的256*256*256种组合, 缩减为16*16*16=4096种组合.

如果目标区域的点是边缘点, 则计入直方图的后一部分,

否则计入直方图的前一部分.

*/

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

CObjectTracker::CObjectTracker(INT32 imW,INT32 imH,IMAGE_TYPE eImageType) {

m_nImageWidth = imW;

m_nImageHeight = imH;

m_eIMAGE_TYPE = eImageType;

m_cSkipValue = 0;

for (UBYTE8 i=0;i

{

m_sTrackingObjectTable[i].Status = false;

for(SINT16 j=0;j

m_sTrackingObjectTable[i].initHistogram[j] = 0;

}

m_nFrameCtr = 0;

m_uTotalTime = 0;

m_nMaxEstimationTime = 0;

m_cActiveObject = 0;

TotalDist=0.0;

LastDist=0.0;

switch (eImageType)

{

case MD_RGBA:

m_cSkipValue = 4 ;

break ;

case MD_RGB:

m_cSkipValue = 3 ;

break ;

};

};

CObjectTracker::~CObjectTracker()

{

}

//returns pixel values in format |0|B|G|R| wrt to (x.y)

/*

ULONG_32 CObjectTracker::GetPixelValues(UBYTE8 *frame,SINT16 x,SINT16 y)

{

ULONG_32 pixelValues = 0;

pixelValues = *(frame+(y*m_nImageWidth+x)*m_cSkipValue+2)|//0BGR

*(frame+(y*m_nImageWidth+x)*m_cSkipValue+1) << 8|

*(frame+(y*m_nImageWidth+x)*m_cSkipValue) << 16;

return(pixelValues);

}*/

//set RGB components wrt to (x.y)

void CObjectTracker::SetPixelValues(IplImage *r,IplImage *g,IplImage *b,ULONG_32 pixelValues,SINT16 x,SINT16 y)

{

// *(frame+(y*m_nImageWidth+x)*m_cSkipValue+2) = UBYTE8(pixelValues & 0xFF);

// *(frame+(y*m_nImageWidth+x)*m_cSkipValue+1) = UBYTE8((pixelValues >> 8) & 0xFF); // *(frame+(y*m_nImageWidth+x)*m_cSkipValue) = UBYTE8((pixelValues >> 16) & 0xFF);

//setpix32f

setpix8c(r, y, x, UBYTE8(pixelValues & 0xFF));

setpix8c(g, y, x, UBYTE8((pixelValues >> 8) & 0xFF));

setpix8c(b, y, x, UBYTE8((pixelValues >> 16) & 0xFF));

}

// returns box color

ULONG_32 CObjectTracker::GetBoxColor() {

ULONG_32 pixelValues = 0;

switch(m_cActiveObject)

{

case 0:

pixelValues = RGB(255,0,0);

break;

case 1:

pixelValues = RGB(0,255,0);

break;

case 2:

pixelValues = RGB(0,0,255);

break;

case 3:

pixelValues = RGB(255,255,0);

break;

case 4:

pixelValues = RGB(255,0,255);

break;

case 5:

pixelValues = RGB(0,255,255);

break;

case 6:

pixelValues = RGB(255,255,255);

break;

case 7:

pixelValues = RGB(128,0,128);

break;

case 8:

pixelValues = RGB(128,128,0);

break;

case 9:

pixelValues = RGB(128,128,128);

break;

case 10:

pixelValues = RGB(255,128,0);

break;

case 11:

pixelValues = RGB(0,128,128);

break;

case 12:

pixelValues = RGB(123,50,10);

break;

case 13:

pixelValues = RGB(10,240,126);

break;

case 14:

pixelValues = RGB(0,128,255);

break;

case 15:

pixelValues = RGB(128,200,20);

break;

default:

break;

}

return(pixelValues);

}

//初始化一个目标的参数

void CObjectTracker::ObjectTrackerInitObjectParameters(SINT16 x,SINT16 y,SINT16 Width,SINT16 Height)

{

m_cActiveObject = 0;

m_sTrackingObjectTable[m_cActiveObject].X = x;

m_sTrackingObjectTable[m_cActiveObject].Y = y;

m_sTrackingObjectTable[m_cActiveObject].W = Width;

m_sTrackingObjectTable[m_cActiveObject].H = Height;

m_sTrackingObjectTable[m_cActiveObject].vectorX = 0;

m_sTrackingObjectTable[m_cActiveObject].vectorY = 0;

m_sTrackingObjectTable[m_cActiveObject].Status = true;

m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = false;

}

//进行一次跟踪

void CObjectTracker::ObjeckTrackerHandlerByUser(IplImage *frame)

{

m_cActiveObject = 0;

if (m_sTrackingObjectTable[m_cActiveObject].Status)

{

if (!m_sTrackingObjectTable[m_cActiveObject].assignedAnObject)

{

//计算目标的初始直方图

FindHistogram(frame,m_sTrackingObjectTable[m_cActiveObject].initHistogram);

m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = true;

}

else

{

//在图像上搜索目标

FindNextLocation(frame);

DrawObjectBox(frame);

}

}

}

//Extracts the histogram of box

//frame: 图像

//histogram: 直方图

//在图像frame中计算当前目标的直方图histogram

//直方图分为两部分,每部分大小4096,

//RGB的256*256*256种组合,缩减为16*16*16=4096种组合

//如果目标区域的点是边缘点,则计入直方图的后一部分,

//否则计入直方图的前一部分

void CObjectTracker::FindHistogram(IplImage *frame, FLOAT32 (*histogram))

{

SINT16 i = 0;

SINT16 x = 0;

SINT16 y = 0;

UBYTE8 E = 0;

UBYTE8 qR = 0,qG = 0,qB = 0;

// ULONG_32 pixelValues = 0;

UINT32 numberOfPixel = 0;

IplImage* r, * g, * b;

r = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

g = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

b = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

cvCvtPixToPlane( frame, b, g, r, NULL ); //divide color image into separate planes r, g, b. The exact sequence doesn't matter.

for (i=0;i

histogram[i] = 0.0;

//for all the pixels in the region

for

(y=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObje ct].H/2,0);y<=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_c ActiveObject].H/2,m_nImageHeight-1);y++)

for

(x=max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObje ct].W/2,0);x<=min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_c ActiveObject].W/2,m_nImageWidth-1);x++)

{

//边缘信息: 当前点与上下左右4点灰度差异是否超过阈值

E = CheckEdgeExistance(r, g, b,x,y);

qR = (UBYTE8)pixval8c( r, y, x )/16;//quantize R component

qG = (UBYTE8)pixval8c( g, y, x )/16;//quantize G component

qB = (UBYTE8)pixval8c( b, y, x )/16;//quantize B component

histogram[4096*E+256*qR+16*qG+qB] += 1; //根据边缘信息, 累计直方图//HISTOGRAM_LENGTH=8192

numberOfPixel++;

}

for (i=0;i

histogram[i] = histogram[i]/numberOfPixel;

//for (i=0;i

// printf("histogram[%d]=%d\n",i,histogram[i]);

// printf("numberOfPixel=%d\n",numberOfPixel);

cvReleaseImage(&r);

cvReleaseImage(&g);

cvReleaseImage(&b);

}

//Draw box around object

void CObjectTracker::DrawObjectBox(IplImage *frame)

{

SINT16 x_diff = 0;

SINT16 x_sum = 0;

SINT16 y_diff = 0;

SINT16 y_sum = 0;

SINT16 x = 0;

SINT16 y = 0;

ULONG_32 pixelValues = 0;

IplImage* r, * g, * b;

r = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

g = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

b = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

cvCvtPixToPlane( frame, b, g, r, NULL );

pixelValues = GetBoxColor();

//the x left and right bounds

x_sum = min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_cActiveObject]. W/2+1,m_nImageWidth-1);//右边界

x_diff = max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObject]. W/2,0);//左边界

//the y upper and lower bounds

y_sum = min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_cActiveObject]. H/2+1,m_nImageHeight-1);//下边界

y_diff = max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObject]. H/2,0);//上边界

for (y=y_diff;y<=y_sum;y++)

{

SetPixelValues(r, g, b,pixelValues,x_diff,y);

SetPixelValues(r, g, b,pixelValues,x_diff+1,y);

SetPixelValues(r, g, b,pixelValues,x_sum-1,y);

SetPixelValues(r, g, b,pixelValues,x_sum,y);

}

for (x=x_diff;x<=x_sum;x++)

{

SetPixelValues(r, g, b,pixelValues,x,y_diff);

SetPixelValues(r, g, b,pixelValues,x,y_diff+1);

SetPixelValues(r, g, b,pixelValues,x,y_sum-1);

SetPixelValues(r, g, b,pixelValues,x,y_sum);

}

cvCvtPlaneToPix(b, g, r, NULL, frame);

cvReleaseImage(&r);

cvReleaseImage(&g);

cvReleaseImage(&b);

}

// Computes weights and drives the new location of object in the next frame

//frame: 图像

//histogram: 直方图

//计算权重, 更新目标的坐标

void CObjectTracker::FindWightsAndCOM(IplImage *frame, FLOAT32 (*histogram))

{

SINT16 i = 0;

SINT16 x = 0;

SINT16 y = 0;

UBYTE8 E = 0;

FLOAT32 sumOfWeights = 0;

SINT16 ptr = 0;

UBYTE8 qR = 0,qG = 0,qB = 0;

FLOAT32 newX = 0.0;

FLOAT32 newY = 0.0;

// ULONG_32 pixelValues = 0;

IplImage* r, * g, * b;

FLOAT32 *weights = new FLOAT32[HISTOGRAM_LENGTH];

for (i=0;i

{

if (histogram[i] >0.0 )

weights[i] = m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]/histogram[i]; //qu/pu(y0)

else

weights[i] = 0.0;

}

r = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

g = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

b = cvCreateImage( cvGetSize(frame), frame->depth, 1 );

cvCvtPixToPlane( frame, b, g, r, NULL ); //divide color image into separate planes r, g, b. The exact sequence doesn't matter.

for

(y=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObje

ct].H/2,0);y<=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_c ActiveObject].H/2,m_nImageHeight-1);y++)

for

(x=max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObje ct].W/2,0);x<=min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_c ActiveObject].W/2,m_nImageWidth-1);x++)

{

E = CheckEdgeExistance(r, g, b,x,y);

qR = (UBYTE8)pixval8c( r, y, x )/16;

qG = (UBYTE8)pixval8c( g, y, x )/16;

qB = (UBYTE8)pixval8c( b, y, x )/16;

ptr = 4096*E+256*qR+16*qG+qB; //some recalculation here. The bin number of (x, y) can be stroed somewhere in fact.

newX += (weights[ptr]*x);

newY += (weights[ptr]*y);

sumOfWeights += weights[ptr];

}

if (sumOfWeights>0)

{

m_sTrackingObjectTable[m_cActiveObject].X = SINT16((newX/sumOfWeights) + 0.5); //update location

m_sTrackingObjectTable[m_cActiveObject].Y = SINT16((newY/sumOfWeights) + 0.5);

}

cvReleaseImage(&r);

cvReleaseImage(&g);

cvReleaseImage(&b);

delete[] weights, weights = 0;

}

// Returns the distance between two histograms.

FLOAT32 CObjectTracker::FindDistance(FLOAT32 (*histogram))

{

SINT16 i = 0;

FLOAT32 distance = 0;

for(i=0;i

distance += FLOAT32(sqrt(DOUBLE64(m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]

*histogram[i])));

return(sqrt(1-distance));

}

//An alternative distance measurement

FLOAT32 CObjectTracker::CompareHistogram(UBYTE8 (*histogram))

{

SINT16 i = 0;

FLOAT32 distance = 0.0;

FLOAT32 difference = 0.0;

for (i=0;i

{

difference = FLOAT32(m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]

-histogram[i]);

if (difference>0)

distance += difference;

else

distance -= difference;

}

return(distance);

}

// Returns the edge insformation of a pixel at (x,y), assume a large jump of value around edge pixels

UBYTE8 CObjectTracker::CheckEdgeExistance(IplImage *r, IplImage *g, IplImage *b, SINT16 _x,SINT16 _y)

{

UBYTE8 E = 0;

SINT16 GrayCenter = 0;

SINT16 GrayLeft = 0;

SINT16 GrayRight = 0;

SINT16 GrayUp = 0;

SINT16 GrayDown = 0;

// ULONG_32 pixelValues = 0;

// pixelValues = GetPixelValues(frame,_x,_y);

GrayCenter = SINT16(3*pixval8c( r, _y, _x )+6*pixval8c( g, _y, _x )+pixval8c( b, _y, _x ));

if (_x>0)

{

// pixelValues = GetPixelValues(frame,_x-1,_y);

GrayLeft = SINT16(3*pixval8c( r, _y, _x-1 )+6*pixval8c( g, _y, _x-1 )+pixval8c( b, _y, _x-1 ));

}

if (_x < (m_nImageWidth-1))

{

// pixelValues = GetPixelValues(frame,_x+1,_y);

GrayRight = SINT16(3*pixval8c( r, _y, _x+1 )+6*pixval8c( g, _y, _x+1 )+pixval8c( b, _y, _x+1 ));

}

if (_y>0)

{

// pixelValues = GetPixelValues(frame,_x,_y-1);

GrayUp = SINT16(3*pixval8c( r, _y-1, _x )+6*pixval8c( g, _y-1, _x )+pixval8c( b, _y-1, _x ));

}

if (_y<(m_nImageHeight-1))

{

// pixelValues = GetPixelValues(frame,_x,_y+1);

GrayDown = SINT16(3*pixval8c( r, _y+1, _x )+6*pixval8c( g, _y+1, _x )+pixval8c( b, _y+1, _x ));

}

if (abs((GrayCenter-GrayLeft)/10)>EDGE_DETECT_TRESHOLD)

E = 1;

if (abs((GrayCenter-GrayRight)/10)>EDGE_DETECT_TRESHOLD)

E = 1;

if (abs((GrayCenter-GrayUp)/10)>EDGE_DETECT_TRESHOLD)

E = 1;

if (abs((GrayCenter-GrayDown)/10)>EDGE_DETECT_TRESHOLD)

E = 1;

return(E);

}

// Alpha blending: used to update initial histogram by the current histogram

void CObjectTracker::UpdateInitialHistogram(UBYTE8 (*histogram))

{

SINT16 i = 0;

for (i=0; i

m_sTrackingObjectTable[m_cActiveObject].initHistogram[i] = ALPHA*m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]

+(1-ALPHA)*histogram[i];

}

// Mean-shift iteration

//frame: 图像

//MeanShift迭代找出中心点

void CObjectTracker::FindNextLocation(IplImage *frame)

{

int i, j, opti, optj;

SINT16 scale[3]={-3, 3, 0};

FLOAT32 dist, optdist;

SINT16 h, w, optX, optY;

//try no-scaling

FindNextFixScale(frame);

optdist=LastDist;

optX=m_sTrackingObjectTable[m_cActiveObject].X;

optY=m_sTrackingObjectTable[m_cActiveObject].Y;

//try one of the 9 possible scaling

i=rand()*2/RAND_MAX;

j=rand()*2/RAND_MAX;

h=m_sTrackingObjectTable[m_cActiveObject].H;

w=m_sTrackingObjectTable[m_cActiveObject].W;

if(h+scale[i]>10 && w+scale[j]>10 && h+scale[i]

{

m_sTrackingObjectTable[m_cActiveObject].H=h+2*scale[i];

m_sTrackingObjectTable[m_cActiveObject].W=w+2*scale[j];

FindNextFixScale(frame);

if( (dist=LastDist) < optdist ) //scaling is better

{

optdist=dist;

// printf("Next%f->\n", dist);

}

else //no scaling is better

{

m_sTrackingObjectTable[m_cActiveObject].X=optX;

m_sTrackingObjectTable[m_cActiveObject].Y=optY;

m_sTrackingObjectTable[m_cActiveObject].H=h;

m_sTrackingObjectTable[m_cActiveObject].W=w;

}

};

TotalDist+=optdist; //the latest distance

// printf("\n");

}

void CObjectTracker::FindNextFixScale(IplImage *frame)

{

UBYTE8 iteration = 0;

SINT16 optX, optY;

FLOAT32 *currentHistogram = new FLOAT32[HISTOGRAM_LENGTH];

FLOAT32 dist, optdist=1.0;

for (iteration=0; iteration

{

FindHistogram(frame,currentHistogram); //current frame histogram, use the last frame location as starting point

FindWightsAndCOM(frame,currentHistogram);//derive weights and new location

//FindHistogram(frame,currentHistogram); //uptade histogram

//UpdateInitialHistogram(currentHistogram);//uptade initial histogram

if( ((dist=FindDistance(currentHistogram)) < optdist) || iteration==0 )

{

optdist=dist;

optX=m_sTrackingObjectTable[m_cActiveObject].X;

optY=m_sTrackingObjectTable[m_cActiveObject].Y;

// printf("%f->", dist);

}

else //bad iteration, then find a better start point for next iteration

{

m_sTrackingObjectTable[m_cActiveObject].X=(m_sTrackingObjectTable[m_cActiveObject].X+ optX)/2;

m_sTrackingObjectTable[m_cActiveObject].Y=(m_sTrackingObjectTable[m_cActiveObject].Y+ optY)/2;

}

}//end for

m_sTrackingObjectTable[m_cActiveObject].X=optX; m_sTrackingObjectTable[m_cActiveObject].Y=optY; LastDist=optdist; //the latest distance

// printf("\n");

delete[] currentHistogram, currentHistogram = 0;

}

float CObjectTracker::GetTotalDist(void)

{

return(TotalDist);

}

数字图像处理算法汇总

形态学运算:基本思想是具用一定结构形状的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。 腐蚀运算:将结构元素中心遍历整个图像,当图像完全包含结构元素时的中心点的轨迹即为腐蚀后的图像,图像变细。腐蚀运算可用于滤波,选择适当大小和形状的结构元素,可以滤除掉所有不能完全包含结构元素的噪声点。当然利用腐蚀滤除噪声有一个缺点,即在去除噪声的同时,对图像中前景物体形状也会有影响,但当我们只关心物体的位置或者个数时,则影响不大。 膨胀运算:将结构元素中心遍历整个图像边缘,中心点的轨迹即为腐蚀后的图像,图像整体变粗。通常用于将图像原本断裂开来的同一物体桥接起来,对图像进行二值化之后,很容易是一个连通的物体断裂为两个部分,而这会给后续的图像分析造成干扰,此时就可借助膨胀桥接断裂的缝隙。 开运算:先腐蚀后膨胀,可以使图像的轮廓变得光滑,还能使狭窄的连接断开和消除细毛刺;但与腐蚀运算不同的是,图像大的轮廓并没有发生整体的收缩,物体位置也没有发生任何变化。可以去除比结构元素更小的明亮细节,同时保持所有灰度级和较大亮区特性相对不变,可用于补偿不均匀的背景亮度。与腐蚀运算相比,开运算在过滤噪声的同时,并没有对物体的形状轮廓造成明显的影响,但是如果我们只关心物体的位置或者个数时,物体形状的改变不会给我们带来困扰,此时腐蚀滤波具有处理速度上的优势。 闭运算:先膨胀后腐蚀,可以去除比结构元素更小的暗色细节。开闭运算经常组合起来平滑图像并去除噪声。可使轮廓变的平滑,它通常能弥合狭窄的间断,填补小的孔洞。腐蚀运算刚好和开运算相反,膨胀运算刚好和闭运算相反,开闭运算也是对偶的,然而与腐蚀、膨胀不同的是,对于某图像多次应用开或闭运算的效果相同。 击中击不中运算:先由结构元素腐蚀原图像,再将结构元素取反去腐蚀原图像的取反图,最后将两幅处理后的图像取交。主要用于图像中某些特定形状的精确定位。 顶帽变换:原图像减去开运算以后的图像。当图像的背景颜色不均匀时,使用阈值二值化会造成目标轮廓的边缘缺失,此时可用开运算(结构元素小于目标轮廓)对整个图像背景进行合理估计,再用原图像减去开运算以后的图像就会是整个图像的灰度均匀,二值化后的图像不会有缺失。 Sobel算子: Prewitt算子: LOG算子: Canny算子:力图在抗噪声干扰和精确定位之间尊求折中方案,主要步骤如下所示: 1、用高斯滤波器平滑图像; 2、用一阶偏导的有限差分来计算梯度的幅值和方向; 3、对梯度幅值进行非极大值抑制; 4、用双阈值算法检测和连接边缘。 Hough变换: 边缘检测:

数字图像处理计算题复习精华版

30452 计算题复习
一、 直方图均衡化(P68)
对已知图像进行直方图均衡化修正。
例:表 1 为已知一幅总像素为 n=64×64 的 8bit 数字图像(即灰度级数为 8),各灰度级(出现的频率)分布
列于表中。要求将此幅图像进行均衡化修正(变换),并画出修正(变换)前后的直方图。
表1
原图像灰
度级 rk
r0=0 r1=1 r2=2 r3=3 r4=4 r5=5 r6=6 r7=7
原各灰度级 原分布概率
像素个数 nk pr(rk)
790
0.19
1023
0.25
850
0.21
656
0.16
329
0.08
245
0.06
122
0.03
81
0.02
解:对已知图像均衡化过程见下表:
原图像灰
度级 rk
原各灰度级 原分布概率 累积分布函
像素个数 nk
pr(rk)
数 sk 计
取整扩展
sk 并
r0=0
790
0.19
0.19
1
r1=1
1023
0.25
0.44
3
r2=2
850
0.21
0.65
5
r3=3
656
0.16
0.81
6
r4=4
329
0.08
0.89
6
r5=5
245
0.06
0.95
7
r6=6
122
0.03
0.98
7
r7=7
81
0.02
1.00
7
画出直方图如下:
确定映射 对应关系
rk→sk
0→1 1→3 2→5 3→6 4→6 5→7 6→7 7→7
新图像灰
度级 sk
1 3 5
新图像各灰 度级像素个
数 nsk
790 1023 850
新图像分 布概率
ps(sk)
0.19 0.25 0.21
6
985
0.24
7
448
0.11
1

图像处理之三种常见双立方插值算法

图像处理之三种常见双立方插值算法 图像处理之三种常见双立方插值算法双立方插值计算 涉及到16个像素点,其中(i’, j’)表示待计算像素点在源图像 中的包含小数部分的像素坐标,dx表示X方向的小数坐标,dy表示Y方向的小数坐标。具体可以看下图: 根据上述图示与双立方插值的数学表达式可以看出,双立方插值本质上图像16个像素点权重卷积之和作为新的像素值。其中R(x)表示插值表达式,可以根据需要选择的表达式不同。常见有基于三角取值、Bell分布表达、B样条曲线表达式。1. 基于三角形采样数学公式为 最简单的线性分布,代码实现如下:[java] view plain copy private double triangleInterpolation( double f ) { f = f / 2.0; if( f < 0.0 ) { return ( f + 1.0 ); } else { return ( 1.0 - f ); } } 2.基于Bell分布采样的数学公式如下: Bell分布采样数学公式基于三次卷积计算实现。代码实现如下:[java] view plain copy private double bellInterpolation( double x ) { double f = ( x / 2.0 ) * 1.5; if( f > -1.5 && f < -0.5 ) { return( 0.5 * Math.pow(f + 1.5, 2.0)); } else if( f > -0.5 && f < 0.5 )

基本图像处理算法的优化分析

基本图像处理算法的优化分析 摘要数字视频图像处理技术已经被广泛地应用到各个领域内,并取得了良好效果。但是就现状来看,以往所应用的基于通用CPU的图像处理系统已经无法完全满足现在所需,还需要在原有基础上来对基本图像处理算法进行优化,以求更好地提高数字图像处理速度。 关键词图像处理;算法优化;GPU 基于处理图像幅度的不断加大,以及像元密集度的逐渐增加,图像处理算法所需要面对的情况更为复杂,传统基于CPU的数字图像处理算法已经无法满足实时性要求。将GPU作为基础,基于其可编程性特点,加强对其的研究,通过其来实现对图像处理算法的优化设计,提高图像处理综合效果。 1 图像处理技术分析 图像为传递信息的重要媒介,同时也是获取信息的重要方式,因此图像处理技术在持续研究以及不断更新,实现对模拟图像处理以及数字图像处理。模拟图像处理即图像明暗程度与空间坐标处于连续状态时,无法通过计算机来对其进行处理,必须要通过光学或者电子手段处理。数字图像处理则是对图像进行简单的采样与量化处理后,通过计算机以及其他实时硬件来处理图像信息。相比来看,模拟图像处理技术具有更强灵活性,但是处理精度较低。相反数字图像处理精度高且具有较强变通能力,逐渐发展成现在主要图像处理技术。基于计算机技术、数字成像技术以及人工智能技术等,现在数字图像处理技术在不断完善,应用也越来与广泛。对于图像处理技术进行分析,可确定其包括图像分割、图像增强、图像压缩、图像复原、运动图像检测以及图像理解等[1]。传统基于CPU的图像处理技术已经无法满足实际应用需求,想要进一步提高图像处理速度以及质量,还需要在原有技术上来进行优化,争取通过高效的图像处理算法来达到最佳效果。 2 基于GPU图像处理算法优化设计 2.1 GPU结构特点 GPU即图形处理器,主要用于图形渲染的设备。相比于CPU倾向程序执行效率,GPU更倾向于大量并行数据计算,将数字图像算法特点与GPU通用计算特点进行有效结合,基于GPU来处理数字图像,可以实现图像处理算法的优化,提高图像处理速度。近年来GPU发展迅速,除了速度与质量方面的优化外,也为更多图像处理技术的发展提供了基础。现今GPU已经兼具流处理、高密集型并行运算等特点,且为GPU处理性能的拓展提高打好了基础。 2.2 GPU数字图像处理算法

(完整word版)人工智能算法在图像处理中的应用

人工智能算法在图像处理中的应用 人工智能算法在图像处理中的应用人工智能算法包括遗传算法、蚁群算法、模拟退火算法和粒子群算法等,在图像边缘检测、图像分割、图像识别、图像匹配、图像分类等领域有广泛应用。本文首先介绍常用人工智能算法的的原理和特点,然后将其在图像处理方面的应用进行综述,最后对应用前景做出展望。【关键词】人工智能算法图像处理人工智能算法是人类受自然界各种事物规律(如人脑神经元、蚂蚁觅食等)的启发,模仿其工作原理求解某些问题的算法。随着计算机技术的发展,人工智能算法在图像处理方面得到广泛应用。当前流行的人工智能算法包括人工神经网络、遗传算法、蚁群算法、模拟退火算法、粒子群算法等。 1 人工神经网络人工神经网络是一种模拟动物神经网络行为特征,进行分布式并行信息处理的算法数学模型,通过调整内部大量节点之间相互连接的关系,达到处理信息的目的,具有自组织、自学习、自推理和自适应等优点。神经网络可用于图像压缩,将图像输入层和输出层设置较多节点,中间传输层设置较少节点,学习后的网络可以较少的节点表示图像,用于存储和传输环节,节约了存储空间,提高的传输效率,最后在输出层将图像还原。学者Blanz和Gish 提出一个三层的前馈神经网络图像分割模型,Babaguchi提

出多层BP网络获取图像的分割阈值,Ghosh使用神经网络对大噪声的图像进行分割。J.Cao使用PCA神经网络提取图像特征来对图像进行分类,B.Lerner用神经网络对人类染色体图像进行分类。神经网络还可与小波变换相结合(MCNN)对手写体数字进行多分辨率识别。 2 遗传算法遗传算法(Genetic Algorithm,GA)是模拟生物进化论的自然选择和遗传学进化过程的计算模型,是一种通过模拟自然进化过程随机搜索最优解的方法,体现了适者生存、优胜劣汰的进化原则,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定,具有并行性和较强的全局寻优能力。遗传算法把问题的解表示成染色体,求解步骤如下: (1)编码:定义问题的解空间到染色体编码空间的映射,一个候选解(个体)用一串符号表示。(2)初始化种群:在一定的限制条件下初始化种群,该种群是解空间的一个子空间。(3)设计适应度函数:将种群中的每个染色体解码成适于适应度函数的形式,计算其数值。(4)选择:根据适应度大小选择优秀个体繁殖下一代,适应度越高,选择概率越大。(5)交叉:随机选择两个用于繁殖下一代的个体的相同位置,在选中的位置实行交换。(6)变异:对某个串中的基因按突变概率进行翻转。(7)从步骤4开始重复进行,直到满足某一性能指标或规定的遗传代数。GA在图像分割领域应用最为成熟,只要有两种应用,一是在多种分割结果中搜索最佳分

基本数字(精选)图像处理算法的matlab实现

基本数字图像处理算法的matlab实现 1.数字图像处理的简单介绍 所谓数字图像就是把传统图像的画面分割成为像素的小的离散点,各像素的灰度值也是用离散值来表示的。 数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。 2.图像的显示与运算 2.1图像的显示 Matlab显示语句 imshow(I,[lowhigh])%图像正常显示 I为要显示的图像矩阵。,[lowhigh]为指定显示灰度图像的灰度范围。高于high的像素被显示成白色;低于low的像素被显示成黑色;介于high和low之间的像素被按比例拉伸后显示为各种等级的灰色。 subplot(m,n,p) 打开一个有m行n列图像位置的窗口,并将焦点位于第p个位置上。 2.2图像的运算 灰度化将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。图像的灰度化处理可用两种方法来实现。

第一种方法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。 第二种方法是根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。 灰度是灰度级的函数,它表示图象中具有每种灰度级的象素的个数,反映图象中每种灰度出现的频率。 图像增强的目标是改进图片的质量,例如增加对比度,去掉模糊和噪声,修正几何畸变等;图像复原是在假定已知模糊或噪声的模型时,试图估计原图像的一种技术。 Matlab图像格式转换语句 rgb2gray(I) %从RGB图创建灰度图 imhist(I) %画灰度直方图 图像的线性变换 D B=f(D A)=f A*D A+f B Matlab源代码: I1=imread('F:\图片2.jpg'); subplot(2,2,1);imshow(I1);title('原图'); I2=rgb2gray(I1); %灰度化图像 subplot(2,2,2);imshow(I2);title('灰度化后图'); [M,N]=size(I2); subplot(2,2,3) [counts,x]=imhist(I2,60); %画灰度直方图 counts=counts/M/N; stem(x,counts);title('灰度直方图'); g=zeros(M,N);%图像增强

常用算法简介

机器视觉中常用图像处理算法 机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是指通过机器视觉产品(即图像摄取装置,分CMOS 和CCD 两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。机器视觉是使用计算机(也许是可移动式的)来模拟人的视觉,因此模拟才是计算机视觉领域的最终目标,而真正意义上的图像处理侧重在“处理”图像:如增强,还原,去噪,分割,等等,如常见的Photoshop就是功能强大的图像处理软件。大部分的机器视觉,都包含了图像处理的过程,只有图像处理过后,才能找到图像中需要的特征,从而更进一步的执行其它的指令动作。在我们实际工程应用中研究的一些图像算法,实际上是属于机器视觉,而不是纯粹的图像处理。总的来说,图像处理技术包括图像压缩,增强和复原,匹配、描述和识别3个部分,在实际工程中,这几块不是独立的,往往是环环相扣、相互辅助来达到实际效果。接下来简单介绍一下机器视觉中常用的图像处理算法。 一、滤波 滤波一般在图像预处理阶段中使用,改善图像信息,便于后续处理,当然,这不是绝对的,在图像算法过程中如果有需要,随时可以进行滤波操作。比较常用的滤波方法有以下三种: 1、均值滤波 均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(,) x y,选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(,) g x y,即 x y,作为处理后图像在该点上的灰度值(,) 波方法可以平滑图像,速度快,算法简单。但是无法去掉噪声,只能减弱噪声。 2、中值滤波

常用图像处理算法

8种常用图像处理算法(函数)------以下所有函数均放在https://www.360docs.net/doc/a412557882.html,p下 1.图像镜像 void CCimageProcessingView::OnGeomTrpo() { //获取指向文档的指针 CCimageProcessingDoc* pDoc = GetDocument(); //指向DIB的指针 LPSTR lpDIB; //锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); //设置光标状态为等待状态 BeginWaitCursor(); //调用VertMirror函数镜像图象 if (VertMirror(lpDIB)) { //设置文档修改标记 pDoc->SetModifiedFlag(TRUE); //更新所有视图 pDoc->UpdateAllViews(NULL); } else { //提示信息 MessageBox("实现图象镜像失败!"); } //解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); //结束光标等待状态 EndWaitCursor(); } * 函数名称: * * VertMirror() * * 参数: * * LPSTR lpDIB //指向源DIB图像指针 * * 返回值: * * BOOL //镜像成功返回TRUE,否则返回FALSE。 *

* 说明: * * 该函数用来实现DIB图像的垂直镜像。 * BOOL WINAPI VertMirror(LPSTR lpDIB) { //原图象宽度 LONG lWidth; //原图象高度 LONG lHeight; //原图象的颜色数 WORD wNumColors; //原图象的信息头结构指针 LPBITMAPINFOHEADER lpbmi; //指向原图象和目的图象的像素的指针 LPBYTE lpSrc,lpDst; //平移后剩余图像在源图像中的位置(矩形区域) CRect rectSrc; //指向原图像像素的指针 LPBYTE lpDIBBits; //指向复制图像像素的指针 LPBYTE lpNewDIBBits; //内存句柄 HLOCAL h; //循环变量 LONG i; //图像每行的字节数 LONG lLineBytes; //获取图象的信息头结构的指针 lpbmi=(LPBITMAPINFOHEADER)lpDIB; //找到图象的像素位置 lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB); //获取图象的宽度 lWidth=::DIBWidth(lpDIB); //获取图象的高度 lHeight=::DIBHeight(lpDIB); //获取图象的颜色数 wNumColors=::DIBNumColors(lpDIB); //计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth *(lpbmi->biBitCount)); // 暂时分配内存,以保存新图像 h= LocalAlloc(LHND, lLineBytes); // 分配内存失败,直接返回 if (!h)

MATLAB中GUI在图像处理应用中的设计(包括各种算法)

用MATLAB 进行图像处理算法的界面设计

目录 1.设计目的 (3) 2.题目分析 (3) 3.总体设计 (3) 4.具体设计 (5) 5.结果分析 (34) 6.心得体会 (34) 7.附录代码 (36)

1、设计目的:综合运用MATLAB工具箱实现图像处理的GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop 。 2、题目分析 利用matlab的GUI程序设计一个简单实用的图像处理程序。该程序应具备图像处理的常用功能,以满足用户的使用。现设计程序有以下基本功能: 1)图像的读取和保存。 2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。 3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。 4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。 5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。 6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。 7)额外功能。 3、总体设计

图一 软件的总体设计界面布局如上图所示,主要分为2个部分:显示区域与操作区域。显示区域:显示载入原图,以及通过处理后的图像。 操作区域:通过功能键实现对图像的各种处理。 在截图中可见,左部为一系列功能按键如“还原”、“撤销”、“截图”等等;界面正中部分为图片显示部分,界面中下方为系列功能切换选择组。 设计完成后运行的软件界面如下: 图二 与图一先比,运行后的界面更为简洁。 利用“编辑”菜单可调出相应的功能键。例如:

数字图像处理的基本方法

一、图像的预处理技术 图像处理按输入结果可以分为两类,即输入输出都是一副图像和输入一张图像输出不再是图像的数据。图像处理是个很广泛的概念,有时候我们仅仅需要对一幅图像做一些简单的处理,即按照我们的需求将它加工称我们想要得效果的图像,比如图像的降噪和增强、灰度变换等等。更多时候我们想要从一幅图像中获取更高级的结果,比如图像中的目标检测与识别。如果我们将输出图像中更高级的结果视为目的的话,那么我们可以把输入输出都是一幅图像看作是整个处理流程中的预处理。下面我们将谈到一些重要的预处理技术。 (一)图像增强与去噪 图像的增强是一个主观的结果,原来的图像按照我们的需求被处理成我们想要的效果,比如说模糊、锐化、灰度变换等等。图像的去噪则是尽可能让图像恢复到被噪声污染前的样子。衡量标准是可以度量的。不管是图像的增强与去噪,都是基于滤波操作的。 1.滤波器的设计方法 滤波操作是图像处理的一个基本操作,滤波又可分为空间滤波和频域滤波。空间滤波是用一个空间模板在图像每个像素点处进行卷积,卷积的结果就是滤波后的图像。频域滤波则是在频率域看待一幅图像,使用快速傅里叶变换将图像变换到频域,得到图像的频谱。我们可以在频域用函数来保留或减弱/去除相应频率分量,再变换回空间域,得到频域滤波的结果。而空间滤波和频域滤波有着一定的联系。频域滤波也可以指导空间模板的设计,卷积定理是二者连接的桥梁。 (1)频域滤波 使用二维离散傅里叶变换(DFT )变换到频域: ∑∑-=+--==10)//(210),(),(N y N vy M ux i M x e y x f v u F π 使用二维离散傅里叶反变换(IDFT )变换到空间域: ∑∑-=-=+=1010)//(2),(1),(M u N v N vy M ux i e v u F MN y x f π 在实际应用中,由于该过程时间复杂度过高,会使用快速傅里叶变换(FFT )来加速这个过程。现在我们可以在频域的角度看待这些图像了。必须了解的是,图像中的细节即灰度变化剧烈的地方对应着高频分量,图像中平坦变化较少的地方对应着低频分量。图像中的周期性图案/噪声对应着某一个频率区域,那么在频域使用合适的滤波器就能去除相应的频率分量,再使用傅里叶反变换就能看到实际想要的结果。 不同的是,在频域的滤波器不再是做卷积,而是做乘积,因为做乘法的目的在于控制频率分量。比较有代表性的有如下几个滤波器: 高斯低通滤波器 222/),(),(σv u D e v u H -= D 是距离频率矩形中心的距离。该滤波器能保留低频分量,逐渐减小高频分量,对原图像具有模糊作用。

智能图像处理算法结合分析

图像增强技术研究 1 图像增强概述 1.1 图像增强的定义 图像增强是指按特定的需要突出一幅图像中的某些信息,同时削弱或去除某些不需要的信息的处理方法,也是提高图像质量的过程。图像增强的目的是使图像的某些特性方面更加鲜明、突出,使处理后的图像更适合人眼视觉特性或机器分析,以便于实现对图像的更高级的处理和分析。图像增强的过程往往也是一个矛盾的过程:图像增强希望既去除噪声又增强边缘。但是,增强边缘的同时会同时增强噪声,而滤去噪声又会使边缘在一定程度上模糊,因此,在图像增强的时候,往往是将这两部分进行折中,找到一个好的代价函数达到需要的增强目的。传统的图像增强算法在确定转换函数时常是基于整个图像的统计量,如:ST转换,直方图均衡,中值滤波,微分锐化,高通滤波等等。这样对应于某些局部区域的细节在计算整幅图的变换时其影响因为其值较小而常常被忽略掉,从而局部区域的增强效果常常不够理想,噪声滤波和边缘增强这两者的矛盾较难得到解决。 1.2 常用的图像增强方法 (1)直方图均衡化 有些图像在低值灰度区间上频率较大,使得图像中较暗区域中的细节看不清楚。这时可以通过直方图均衡化将图像的灰度围分开,并且让灰度频率较小的灰度级变大,通过调整图像灰度值的动态围,自动地增加整个图像的对比度,使图像具有较大的反差,细节清晰。 (2)对比度增强法 有些图像的对比度比较低,从而使整个图像模糊不清。这时可以按一定的规则修改原来图像的每一个象素的灰度,从而改变图像灰度的动态围。

(3)平滑噪声 有些图像是通过扫描仪扫描输入、或传输通道传输过来的。图像中往往包含有各种各样的噪声。这些噪声一般是随机产生的,因此具有分布和大小不规则性的特点。这些噪声的存在直接影响着后续的处理过程,使图像失真。图像平滑就是针对图像噪声的操作,其主要作用是为了消除噪声,图像平滑的常用方法是采用均值滤波或中值滤波,均值滤波是一种线性空间滤波,它用一个有奇数点的掩模在图像上滑动,将掩模中心对应像素点的灰度值用掩模所有像素点灰度的平均值代替,如果规定了在取均值过程中掩模各像素点所占的权重,即各像素点所乘系数,这时就称为加权均值滤波;中值滤波是一种非线性空间滤波,其与均值滤波的区别是掩模中心对应像素点的灰度值用掩模所有像素点灰度值的中间值代替。 (4)锐化 平滑噪声时经常会使图像的边缘变的模糊,针对平均和积分运算使图像模糊,可对其进行反运算采取微分算子使用模板和统计差值的方法,使图像增强锐化。图像边缘与高频分量相对应,高通滤波器可以让高频分量畅通无阻,而对低频分量则充分限制,通过高通滤波器去除低频分量,也可以达到图像锐化的目的。 1.3图像增强的现状与应用 计算机图像处理的发展历史不长,但已经引起了人们的重视。图像处理技术始20世纪60年代,由于当时图像存储成本高,处理设备造价高,因而其应用面很窄。1964年美国加州理工学院的喷气推进实验室,首次对徘徊者7号太空飞船发回的月球照片进行了处理,得到了前所未有的清晰图像,这标志着图像处理技术开始得到实际应用。70年代进入发展期,出现cr和卫星遥感图像,对图像处理的发展起到了很好的促进作用。80年代进入普及期,此时微机己经能够承担起图形图像处理的任务。VLSI的出现更使得处理速度大大提高,其造价也进一步降低,极大的促进了图像处理系统的普及和应用。90年代是图像处理技术实用化时期,图像处理的信息量巨大,对处理的速度要求极高。21世纪的图像处理技术要向高质量化方面发展,实现图像的实时处理,采用数字全息技术使图像包含最为完整和丰富的信息,实现图像的智能生成、处理、理解和识别[7]。

数字图像处理计算题复习精华版要点

30452计算题复习 一、直方图均衡化(P68) 对已知图像进行直方图均衡化修正。 例:表1为已知一幅总像素为n=64×64的8bit数字图像(即灰度级数为8),各灰度级(出现的频率)分布列于表中。要求将此幅图像进行均衡化修正(变换),并画出修正(变换)前后的直方图。 表1 解:对已知图像均衡化过程见下表: 画出直方图如下:

(a )原始图像直方图 (b )均衡化后直方图 **以下部分不用写在答题中。 其中: ① r k 、n k 中k = 0,1,…,7 ② p r (r k ) = n k /n ,即计算各灰度级像素个数占所有像素个数的百分比,其中∑==k j j n n 0 ,在此题中n =64×64。 ③ ∑== k j j r k r p s 0 )(计,即计算在本灰度级之前(包含本灰度级)所有百分比之和。 ④ ]5.0)1int[(+-=计并k k s L s ,其中L 为图像的灰度级数(本题中L = 8),int[ ]表示对方括号中的数字取整。 ⑤ 并k k s s = ⑥ n sk 为映射对应关系r k →s k 中r k 所对应的n k 之和。 ⑦ n n s p sk k s /)(=,或为映射对应关系r k →s k 中r k 所对应的p r (r k )之和。

二、 模板运算 使用空间低通滤波法对图像进行平滑操作(P80) 空间低通滤波法是应用模板卷积方法对图像每一个像素进行局部处理。模板(或称掩模)就是一个滤波器,它的响应为H (r ,s ),于是滤波输出的数字图像g(x ,y )用离散卷积表示为 )6.2.4() ,(),(),(∑∑-=-=--= l l s k k r s r H s y r x f y x g 式中:x ,y = 0,1,2,…,N -1;k 、l 根据所选邻域大小来决定。 具体过程如下: (1)将模板在图像中按从左到右、从上到下的顺序移动,将模板中心与每个像素依次重合(边缘像素除外); (2)将模板中的各个系数与其对应的像素一一相乘,并将所有的结果相加; (3)将(2)中的结果赋给图像中对应模板中心位置的像素。 对于空间低通滤波器而言,采用的是低通滤波器。由于模板尺寸小,因此具有计算量小、使用灵活、适于并行计算等优点。常用的3*3低通滤波器(模板)有: 模板不同,邻域内各像素重要程度也就不同。但无论怎样的模板,必须保证全部权系数之和为1,这样可保 证输出图像灰度值在许可范围内,不会产生灰度“溢出”现象。 1 7 1 8 1 7 1 1 1 1 1 5 1 1 1 1 1 1 5 5 5 1 1 7 1 1 5 5 5 1 8 1 8 1 1 5 1 1 1 1 8 1 1 5 1 1 8 1 1 1 1 5 1 1 1 1 1 7 1 8 1 7 1 1 解:低通滤波的步骤为: (1)将模板在图像中按从左到右、从上到下的顺序移动,将模板中心与每个像素依次重合(边缘像素除外); (2)将模板中的各个系数与其对应的像素一一相乘,并将所有的结果相加; (3)将(2)中的结果赋给图像中对应模板中心位置的像素。 如图中第2行第2列处的值 = (1*1+1*7+1*1+1*1+2*1+1*1+1*1+1*1+1*5)/10 = 2

图 像 处 理 算 法

神奇的图像处理算法(Amazing algorithms to enhance or transform images) 1 神奇的图像处理算法? 这是利用数学算法,进行高难度图像处理的一个例子。事实上,图像处理的数学算法,已经发展到令人叹为观止的地步。 Scriptol列出了几种神奇的图像处理算法,让我们一起来看一下。 1.1 像素图生成向量图的算法 数字时代早期的图片,分辨率很低。尤其是一些电子游戏的图片,放大后就是一个个像素方块。Depixelizing算法可以让低分辨率的像素图转化为高质量的向量图。1.2 黑白图片的着色算法让老照片自动变成彩色的算法。1.3 消除阴影的算法 不留痕迹地去掉照片上某件东西的阴影的算法。1.4 HDR照片的算法 所谓"HDR照片",就是扩大亮部与暗部的对比效果,亮的地方变得非常亮,暗的地方变得非常暗,亮暗部的细节都很明显。 实现HDR的软件有很多,这里推荐G'MIC。它是GIMP图像编辑软件的一个插件,代码全部开源。1.5 消除杂物的算法 所谓"消除杂物",就是在照片上划出一块区域,然后用背景自动填补。Resynthesizer可以做到这一点,它也是GIMP的一个插件。 1.6 自动合成照片的算法 根据一张草图,选择原始照片,然后把它们合成在一起,生成新

照片。这是清华大学的科研成果。1.7 美容算法 ? 自动对容貌进行"美化"的算法。2 Amazing algorithms to enhance or transform images List of algorithms for image processing whose level of intelligence avoids infinitely complex tasks. From the simplest to more complex ones.2.1 Depixelizing images Starting from a raster image that is made of large squares, we arrive at a clearer picture,? as if one could a posteriori change the definition of the screen on which it was drawn . This can be very useful if one wants to convert an old game on a modern platform such as? Canvas or a smartphone. See article depixelizing. Implemented by Scale2x (on Sourceforge).? HQX is a similar super resolution command line tool to enlarge images. 2.2 Color a black and white image This technique is so well controlled that we can now see in color old black and white films.

图像处理基本算法

图像处理,是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。此外,基于光学理论的处理方法依然占有重要的地位。 图像处理是信号处理的子类,另外与计算机科学、人工智能等领域也有密切的关系。 传统的一维信号处理的方法和概念很多仍然可以直接应用在图像处理上,比如降噪、量化等。然而,图像属于二维信号,和一维信号相比,它有自己特殊的一面,处理的方式和角度也有所不同。 目录 [隐藏] * 1 解决方案 * 2 常用的信号处理技术 o 2.1 从一维信号处理扩展来的技术和概念 o 2.2 专用于二维(或更高维)的技术和概念 * 3 典型问题 * 4 应用 * 5 相关相近领域 * 6 参见 [编辑] 解决方案 几十年前,图像处理大多数由光学设备在模拟模式下进行。由于这些光学方法本身所具有的并行特性,至今他们仍然在很多应用领域占有核心地位,例如全息摄影。但是由于计算机速度的大幅度提高,这些技术正在迅速的被数字图像处理方法所替代。 从通常意义上讲,数字图像处理技术更加普适、可靠和准确。比起模拟方法,它们也更容易实现。专用的硬件被用于数字图像处理,例如,基于流水线的计算机体系结构在这方面取得了巨大的商业成功。今天,硬件解决方案被广泛的用于视频处理系统,但商业化的图像处理任务基本上仍以软件形式实现,运行在通用个人电脑上。 [编辑] 常用的信号处理技术 大多数用于一维信号处理的概念都有其在二维图像信号领域的延伸,它们中的一部分在二维情形下变得十分复杂。同时图像处理也具有自身一些新的概念,例如,连通性、旋转不变性,等等。这些概念仅对二维或更高维的情况下才有非平凡的意义。 图像处理中常用到快速傅立叶变换,因为它可以减小数据处理量和处理时间。 [编辑] 从一维信号处理扩展来的技术和概念 * 分辨率(Image resolution|Resolution) * 动态范围(Dynamic range)

图像处理基本概念计算公式

1亮度处理—图像整体变亮或变暗 实现方法:加大或减小每个像素的三基色值 计算式:V=V'*(1+d) V —调整后颜色值 V'—原颜色值 d —亮度调整系数,-1<=d<=1 2. 对比度处理—图像亮处更亮暗处更暗 实现方法:以亮度的中间值为基准,加大较大的颜色值,减小较小的颜色值 中间值的取法:ⅰ固定取127;ⅱ取所有像素点各基色的平均值 计算公式:V=127+(V'-127)*(1+d) V —调整后颜色值 V'—原颜色值 d —对比度调整系数,-1<=d<=1 3. 色阶处理 将给定的输入范围映射到给定的输出范围,输出范围一般默认为[0,255] 公式:121'255)(d d d V V -?-= d 1——输入范围的下界值 d 2——输入范围的上界值 4. 图像平滑 目的:消除图像中的噪声 噪声即叠加在图像上的正负随机亮度值 均值平滑:取本身及周围9个像素点的颜色平均值 中值平滑:取本身及周围9个像素点的颜色中间值 5. 水平一阶微分法 求各像素点与左侧像素点颜色值的绝对值得到边缘强度值,以各点的边缘强度值为灰度形成一幅边缘检测结果灰度图像。 6. 垂直一阶微分法 像素点与上边像素点颜色差值的绝对值 7. 双向一阶微分法 水平、垂直分别求边缘值,取最大者 8. 锐化-即加大边缘处的颜色差异 9. 双向一阶微分锐化 对每个像素点的每种基色值,分别求与左侧和上侧点的差值,将两者均值叠加到当前值上。

10. 镜像(垂直翻转、水平翻转) 围绕图像中心点,像素进行左右置换或上下置换。 垂直翻转可逐行进行,水平翻转函数要逐行逐点进行处理。 11. 缩小 缩小:图像画面面积减小,像素减少,图像等比例缩小 裁剪:图像画面面积减小,像素减少,但图像不变,只是局部处于画面中,多出部分丢弃 宽度与高度方向的缩小比例可以不同 实现方法:抽点发—采样法 12. 放大 图像放大:图像画面增大,像素增多,图像等比例放大 画布放大:图像画面增大,图像不变,图像周围为空白画面 实现方法:插值法—线性插值、二次插值、三次插值 采样法 放大采样法的处理程序与缩小采样法程序完全相同 双向线性插值方法例子: 设dw=biWidth/dWidth=0.7,dh=0.7 则新图像中的点(6,8)对应于原图像中的位置为(4.2,5.6) 当采用采样法时,将取离该位置最近的点(4,6)填入新图像的(6,8)点。 当采用双向线性插值时,则取该位置周围的四个点,插值计算该点的值。如下图: V 1 V 3 34 则有:V12=V1*(1-0.6)+V2*0.6 V34=V3*(1-0.6)+V4*0.6 V =V12*(1-0.2)+V34*0.2 =V1*(1-0.6)*( 1-0.2)+V2*0.6*( 1-0.2) +V3*(1-0.6)*0.2+V4*0.6*0.2

图 像 处 理 算 法

图像处理算法——卷积 一、什么是卷积??在图像处理中,卷积操作指的是使用一个卷积核对图像中的每个像素进行一系列操作。?卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是与原图像做运算的参数。卷积核通常是一个四方形的网格结构(例如3*3的矩阵或像素区域),该区域上每个方格都有一个权重值。?使用卷积进行计算时,需要将卷积核的中心放置在要计算的像素上,一次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到的结构就是该位置的新像素值。?以下两个算子中演示了具体的卷积计算过程。 二、相关算子定义:?即,其中h称为相关核(Kernel).? ?步骤: 1)滑动核,使其中心位于输入图像g的(i,j)像素上2)利用上式求和,得到输出图像的(i,j)像素值3)充分上面操纵,直到求出输出图像的所有像素值【例】? 原始像素矩阵为:? ?17234101124561218171319258142021215162239?[1724181523571416 4613202210121921311182529] 卷积模板h为:? ?834159672?[816357492] 计算输出图像的(2,4)元素=1*8+8*1+15*6+7*3+14*5+16*7+13*4+20*9+22*2=585?如图所示:? 三、卷积算子定义:?即 步骤:?- 1)将核围绕中心旋转180度?- 2)滑动核,使其中心位于

输入图像g的(i,j)像素上?- 3)利用上式求和,得到输出图像的(i,j)像素值?- 4)充分上面操纵,直到求出输出图像的所有像素值?例:计算输出图像的(2,4)元素=1*2+8*9+15*4+7*7+14*5+16*3+13*6+20*1+22*8=575?如图所示:? 四、边缘效应?当对图像边缘的进行滤波时,核的一部分会位于图像边缘外面。?常用的策略包括:?- 1)使用常数填充:imfilter默认用0填充,这会造成处理后的图像边缘是黑色的。?- 2)复制边缘像素:I3 = imfilter(I,h,’replicate’);? 五、常用的卷积核及其用途1)低通滤波器(常用于计算模糊后的效果) ?1-91-91-91-91-91-91-91-91-9?[1-91-91-91-91-91-91-91-91-9] ?1-101-101-101-102-101-101-101-101-10?[1-101-101-101-102-101 -101-101-101-10] ?1-162-161-162-164-162-161-162-161-16?[1-162-161-162-164-162 -161-162-161-16] 2)高斯滤波器(常用于计算高斯模糊后的效果)?高斯模糊的卷积核也是一个正方形的滤波核,其中每个元素通过以下公式计算得出:?G(x,y)=12πσ2?ex2+y22σ2G(x,y)=12πσ2·ex2+y22σ2?该公式中σ是标准方差(一般取值为1),x和y分别对应了当前位置到卷积核中心的整数距离。通过这个公式,就可以计算出高斯核中每个位置对应的值。为了保证滤波后的图像不会变暗,需要对高斯核中的权重进行归一化。 3)边缘检测(常用于计算图像边缘或者说梯度值)?

基于Matlab的图像去噪算法仿真

基于Matlab的图像去噪算法仿真 在信息化的社会里,图像在信息传播中所起的作用越来越大。所以,消除在图像采集和传输过程中而产生的噪声,保证图像受污染度最小,成了数字图像处理领域里的重要部分。 本文主要研究分析邻域平均法、中值滤波法、维纳滤波法及模糊小波变换法的图像去噪算法。首先介绍图像处理应用时的常用函数及其用法;其次详细阐述了四种去噪算法原理及特点;最后运用Matlab软件对一张含噪图片(含高斯噪声或椒盐噪声)进行仿真去噪,通过分析仿真结果得出: 一.均值滤波是典型的线性滤波,对高斯噪声抑制是比较好的; 二.中值滤波是常用的非线性滤波方法,对椒盐噪声特别有效; 三.维纳滤波对高斯噪声有明显的抑制作用; 四.对小波系数进行阈值处理可以在小波变换域中去除低幅值的噪声和不期望的信号。 本论文主要是从两方面展开,首先是图像去噪算法:简要说明了图像噪声的概念及分类,详细阐述了邻域平均法、中值滤波法、维纳滤波法及模糊小波变换法的去噪原理及特点。 其次是基于Matlab的图像去噪算法仿真:根据邻域平均法、中值滤波法、维纳滤波法及模糊小波变换法原理分析,运用Matlab仿真软件编写代码,对一张含噪图片(含高斯噪声或椒盐噪声)进行仿真去噪,并对结果分析讨论,比较几种方法的优缺点。 本论文仿真时选取一张彩色图片“2010-03-09-2.bmp”,并在图片中加入两种噪声:高斯噪声和椒盐噪声。所谓高斯噪声是指它的概率密度函数服从高斯分布的一类噪声。椒盐噪声是由图像传感器、传输信道、解码处理等产生的黑白相间的亮暗点噪声,属于非平稳噪声。本章利用Matlab软件对含噪图像的去噪算法进行仿真,将应用邻域平均法、中值滤波法、维纳滤波法和模糊小波变换法对含有高斯噪声和椒盐噪声图像的去噪效果进行比较,从而得到相应结论。 1.1邻域平均法的仿真 本节选用邻域平均法对含有高斯噪声和椒盐噪声的图片进行去噪,并用Matlab软件仿真。 (1)给图像加入均值为0,方差为0.02的高斯噪声,选择3×3模板去噪Matlab部分代码: j=imnoise(x,'gaussian',0,0.02);

相关文档
最新文档