常用图像处理算法

常用图像处理算法
常用图像处理算法

8种常用图像处理算法(函数)------以下所有函数均放在https://www.360docs.net/doc/4012548826.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)

return FALSE;

// 锁定内存

lpNewDIBBits = (LPBYTE)LocalLock(h);

//如果是256色位图或真彩色位图

if(wNumColors==256||wNumColors==0)

{

//平移图像,每次移动一行

for(i = 0; i

{

//指向原图象倒数第i行像素起点的指针

lpSrc =(LPBYTE)lpDIBBits + lLineBytes * i;

//目标区域同样要注意上下倒置的问题

lpDst =(LPBYTE)lpDIBBits+lLineBytes * (lHeight-i-1) ;

//备份一行

memcpy(lpNewDIBBits, lpDst, lLineBytes);

//将倒数第i行像素复制到第i行

memcpy(lpDst, lpSrc, lLineBytes);

//将第i行像素复制到第i行

memcpy(lpSrc, lpNewDIBBits, lLineBytes);

}

}

else

{

AfxMessageBox("只支持256色和真彩色位图");

// 释放内存

LocalUnlock(h);

LocalFree(h);

return false;

}

// 释放内存

LocalUnlock(h);

LocalFree(h);

// 返回

return TRUE;

}

2.旋转图像(含对话框这里对话框需要自己建立)

void CCimageProcessingView::OnGeomRota()

{

//获取指向文档的指针

CCimageProcessingDoc* pDoc = GetDocument();

//指向DIB的指针

LPSTR lpDIB;

//锁定DIB

lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

// 缩放比率

int iRotaAngle;

// 创建对话框

CDlgGeoRota dlgPara;

// 初始化变量值

dlgPara.m_iRotaAngle = 90;

// 显示对话框,提示用户设定旋转角度

if (dlgPara.DoModal() != IDOK)

{

// 返回

return;

}

// 获取用户设定的平移量

iRotaAngle = dlgPara.m_iRotaAngle;

// 删除对话框

delete dlgPara;

//创建新DIB

HDIB hNewDIB=NULL;

//设置光标状态为等待状态

BeginWaitCursor();

//调用RotateDIB函数旋转DIB图象

hNewDIB=(HDIB)::RotateDIB(lpDIB,iRotaAngle); //旋转成功

if (hNewDIB)

{

//替换原来的DIB图象为新的DIB

pDoc->ReplaceHDIB(hNewDIB);

//更新DIB图象的大小和调色板

pDoc->InitDIBData();

//设置文档修改标记

pDoc->SetModifiedFlag(TRUE);

//调节滚动视图大小

SetScrollSizes(MM_TEXT,pDoc->GetDocSize()); //更新所有视图

pDoc->UpdateAllViews(NULL);

}

else

{

//提示信息

MessageBox("实现图象旋转失败!");

}

//解除锁定

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); //结束光标等待状态

EndWaitCursor();

}

*

* 函数名称:

*

* RotateDIB ()

*

* 参数:

*

* LPSTR lpDIB //指向源DIB图像指针

*

* int iAngle

* 说明:

*

* 该函数用来实现DIB图像的旋转。

*

************************************************************************/ HGLOBAL WINAPI RotateDIB(LPSTR lpDIB,int iAngle)

{

//原图象宽度

LONG lWidth;

//原图象高度

LONG lHeight;

//旋转后图象宽度

LONG lNewWidth;

//旋转后图象高度

LONG lNewHeight;

//原图象的颜色数

WORD wNumColors;

//原图象的信息头结构指针

LPBITMAPINFOHEADER lpbmi,lpbmi0;

//指向原图象和目的图象的像素的指针

LPBYTE lpSrc,lpDst;

//指向原图像像素的指针

LPBYTE lpDIBBits;

//指向旋转后图像(像素)的指针

LPBYTE lpNewDIBBits;

LPSTR lpNewDIB;

//旋转后新的DIB句柄

HDIB hDIB;

//循环变量

LONG i,j,i0,j0;

//原图像每行的字节数

LONG lLineBytes;

//旋转后图像每行的字节数

LONG lNewLineBytes;

//旋转角度的弧度

double fArcAngle;

//旋转角度的正弦和余弦

float fSin,fCos;

//旋转前图象四个角的坐标(以图象中心为坐标系原点)

float fSrcX1,fSrcY1,fSrcX2,fSrcY2;

float fSrcX3,fSrcY3,fSrcX4,fSrcY4;

//旋转后图象四个角的坐标(以图象中心为坐标系原点)

float fDstX1,fDstY1,fDstX2,fDstY2;

float fDstX3,fDstY3,fDstX4,fDstY4;

//两个中间量

float f1,f2;

//找到图象的像素位置

lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);

//获取图象的宽度

lWidth=::DIBWidth(lpDIB);

//获取图象的高度

lHeight=::DIBHeight(lpDIB);

//获取图象的颜色数

wNumColors=::DIBNumColors(lpDIB);

//获取指向原位图信息头结构的指针

lpbmi0=(LPBITMAPINFOHEADER)lpDIB;

//计算原图像每行的字节数

lLineBytes = WIDTHBYTES(lWidth *(lpbmi0->biBitCount)); //将旋转角度从度转换到弧度

fArcAngle =(iAngle*PI)/180.0;

//计算旋转角度的正弦

fSin = (float) sin(fArcAngle);

//计算旋转角度的余弦

fCos = (float) cos(fArcAngle);

//计算原图的四个角的坐标(以图像中心为坐标系原点)fSrcX1 = (float) (- (lWidth - 1) / 2);

fSrcY1 = (float) ( (lHeight - 1) / 2);

fSrcX2 = (float) ( (lWidth - 1) / 2);

fSrcY2 = (float) ( (lHeight - 1) / 2);

fSrcX3 = (float) (- (lWidth - 1) / 2);

fSrcY3 = (float) (- (lHeight - 1) / 2);

fSrcX4 = (float) ( (lWidth - 1) / 2);

fSrcY4 = (float) (- (lHeight - 1) / 2);

//计算新图四个角的坐标(以图像中心为坐标系原点)

fDstX1 = fCos * fSrcX1 + fSin * fSrcY1;

fDstY1 = -fSin * fSrcX1 + fCos * fSrcY1;

fDstX2 = fCos * fSrcX2 + fSin * fSrcY2;

fDstY2 = -fSin * fSrcX2 + fCos * fSrcY2;

fDstX3 = fCos * fSrcX3 + fSin * fSrcY3;

fDstY3 = -fSin * fSrcX3 + fCos * fSrcY3;

fDstX4 = fCos * fSrcX4 + fSin * fSrcY4;

fDstY4 = -fSin * fSrcX4 + fCos * fSrcY4;

//计算旋转后的图像实际宽度

lNewWidth = (LONG) ( max( fabs(fDstX4 - fDstX1),

fabs(fDstX3 - fDstX2) ) + 0.5);

//计算旋转后的图像高度

lNewHeight = (LONG) ( max( fabs(fDstY4 - fDstY1),

fabs(fDstY3 - fDstY2) ) + 0.5);

//计算旋转后图像每行的字节数

lNewLineBytes = WIDTHBYTES(lNewWidth * lpbmi0->biBitCount);

//计算两个常数

f1 = (float) (-0.5 * (lNewWidth - 1) * fCos - 0.5 * (lNewHeight - 1) * fSin + 0.5 * (lWidth - 1));

f2 = (float) ( 0.5 * (lNewWidth - 1) * fSin - 0.5 * (lNewHeight - 1) * fCos + 0.5 * (lHeight - 1));

//暂时分配内存,以保存新图像

hDIB=(HDIB)::GlobalAlloc(GHND, lNewHeight*lNewLineBytes+

*(LPDWORD)lpDIB+::PaletteSize(lpDIB));

//分配内存失败,直接返回

if (!hDIB)

return NULL;

//锁定内存

lpNewDIB = (LPSTR)::GlobalLock((HGLOBAL)hDIB);

//复制DIB信息头和调色板

memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+::PaletteSize(lpDIB));

//获取图象的信息头结构的指针

lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;

//更新DIB图象的高度和宽度

lpbmi->biWidth=lNewWidth;

lpbmi->biHeight=lNewHeight;

//找到新DIB像素的起始位置

lpNewDIBBits=(LPBYTE)::FindDIBBits(lpNewDIB);

//如果是256色位图

if(wNumColors==256)

{

//旋转后图像每行

for(i = 0; i

{

//旋转后图象每列

for(j=0;j

{

//指向图象第i行第j个像素的指针

lpDst =(LPBYTE)lpNewDIBBits + lNewLineBytes * (lNewHeight-1-i)+j; //计算每个像素点在原图象中的坐标

i0 = (LONG) (-((float) j) * fSin + ((float) i) * fCos + f2 + 0.5); j0 = (LONG) ( ((float) j) * fCos + ((float) i) * fSin + f1 + 0.5); // 判断是否在源图象范围之内

if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))

{

// 指向源DIB图象第i0行,第j0个象素的指针

lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; // 复制象素

*lpDst = *lpSrc;

}

else

{

// 对于源图中没有的象素,直接赋值为255

* ((LPBYTE)lpDst) = 255;

}

}

}

}

//如果是24位真彩色位图

else if(wNumColors==0)

{

//旋转后图像每行

for(i = 0; i

{

//旋转后图象每列

for(j=0;j

{

//指向图象第i行第j个像素的指针

lpDst =(LPBYTE)lpNewDIBBits + lNewLineBytes * (lNewHeight-1-i)+3*j; //计算每个像素点在原图象中的坐标

i0 = (LONG) (-((float) j) * fSin + ((float) i) * fCos + f2 + 0.5); j0 = (LONG) ( ((float) j) * fCos + ((float) i) * fSin + f1 + 0.5); // 判断是否在源图象范围之内

if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))

{

// 指向源DIB图象第i0行,第j0个象素的指针

lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + 3*j0; // 复制象素

memcpy(lpDst,lpSrc,3);

}

else

{

// 对于源图中没有的象素,直接赋值为255

memset(lpDst,255,3);

}

}

}

}

else

{

AfxMessageBox("只支持256色和真彩色位图");

// 释放内存

GlobalUnlock(hDIB);

GlobalFree(hDIB);

return NULL;

}

// 返回

return hDIB;

}

3.图像缩放(对话框自己建立)

void CCimageProcessingView::OnGeomZoom()

{

// TODO: Add your command handler code here

// 图像缩放

// 获取文档

CCimageProcessingDoc* pDoc = GetDocument();

// 指向DIB的指针

LPSTR lpDIB;

// 锁定DIB

lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 缩放比率

float fXZoomRatio;

float fYZoomRatio;

// 创建对话框

CDlgGeoZoom dlgPara;

// 初始化变量值

dlgPara.m_XZoom = 0.5;

dlgPara.m_YZoom = 0.5;

// 显示对话框,提示用户设定平移量

if (dlgPara.DoModal() != IDOK)

{

// 返回

return;

}

// 获取用户设定的平移量

fXZoomRatio = dlgPara.m_XZoom;

fYZoomRatio = dlgPara.m_YZoom;

// 删除对话框

delete dlgPara;

// 创建新DIB

HDIB hNewDIB = NULL;

// 更改光标形状

BeginWaitCursor();

// 调用ZoomDIB()函数转置DIB

hNewDIB = (HDIB) ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio);

// 判断缩放是否成功

if (hNewDIB != NULL)

{

// 替换DIB,同时释放旧DIB对象

pDoc->ReplaceHDIB(hNewDIB);

// 更新DIB大小和调色板

pDoc->InitDIBData();

// 设置脏标记

pDoc->SetModifiedFlag(TRUE);

// 重新设置滚动视图大小

SetScrollSizes(MM_TEXT, pDoc->GetDocSize());

// 更新视图

pDoc->UpdateAllViews(NULL);

}

else

{

// 提示用户

MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);

}

// 解除锁定

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

// 恢复光标

EndWaitCursor();

}

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

* 函数名称:

* ZoomDIB()

*

* 参数:

* LPSTR lpDIB - 指向源DIB的指针

* float fXZoomRatio - X轴方向缩放比率

* float fYZoomRatio - Y轴方向缩放比率

*

* 返回值:

* HGLOBAL - 缩放成功返回新DIB句柄,否则返回NULL。

*

* 说明:

* 该函数用来缩放DIB图像,返回新生成DIB的句柄。

*

************************************************************************/ HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio) {

// 源图像的宽度和高度

LONG lWidth;

LONG lHeight;

// 缩放后图像的宽度和高度

LONG lNewWidth;

LONG lNewHeight;

WORD wNumColors;

// 缩放后图像的宽度(lNewWidth',必须是4的倍数)

LONG lNewLineBytes;

// 指向源图像的指针

LPBYTE lpDIBBits;

// 指向源象素的指针

LPBYTE lpSrc;

// 缩放后新DIB句柄

HDIB hDIB;

// 指向缩放图像对应象素的指针

LPBYTE lpDst;

// 指向缩放图像的指针

LPSTR lpNewDIB;

LPBYTE lpNewDIBBits;

// 指向BITMAPINFO结构的指针(Win3.0)

LPBITMAPINFOHEADER lpbmi,lpbmi0;

// 指向BITMAPCOREINFO结构的指针

LPBITMAPCOREHEADER lpbmc;

// 循环变量(象素在新DIB中的坐标)

LONG i;

LONG j;

// 象素在源DIB中的坐标

LONG i0;

LONG j0;

// 图像每行的字节数

LONG lLineBytes;

// 找到源DIB图像象素起始位置

lpDIBBits = (LPBYTE)::FindDIBBits(lpDIB);

// 获取图像的宽度

lWidth = ::DIBWidth(lpDIB);

// 获取图像的高度

lHeight = ::DIBHeight(lpDIB);

wNumColors= ::DIBNumColors(lpDIB);

lpbmi0=(LPBITMAPINFOHEADER)lpDIB;

// 计算图像每行的字节数

lLineBytes = WIDTHBYTES(lWidth * (lpbmi0->biBitCount));

// 计算缩放后的图像实际宽度

// 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分

lNewWidth = (LONG) (lWidth* fXZoomRatio + 0.5);

// 计算新图像每行的字节数

lNewLineBytes = WIDTHBYTES(lNewWidth * (lpbmi0->biBitCount));

// 计算缩放后的图像高度

lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5);

// 分配内存,以保存新DIB

hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));

// 判断是否内存分配失败

if (hDIB == NULL)

{

// 分配内存失败

return NULL;

}

// 锁定内存

lpNewDIB = (LPSTR)::GlobalLock((HGLOBAL) hDIB);

// 复制DIB信息头和调色板

memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));

// 找到新DIB象素起始位置

lpNewDIBBits = (LPBYTE)::FindDIBBits(lpNewDIB);

// 获取指针

lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;

lpbmc = (LPBITMAPCOREHEADER)lpNewDIB;

// 更新DIB中图像的高度和宽度

if (IS_WIN30_DIB(lpNewDIB))

{

// 对于Windows 3.0 DIB

lpbmi->biWidth = lNewWidth;

lpbmi->biHeight = lNewHeight;

}

else

{

// 对于其它格式的DIB

lpbmc->bcWidth = (unsigned short) lNewWidth;

lpbmc->bcHeight = (unsigned short) lNewHeight;

}

if(wNumColors==256)

{

// 针对图像每行进行操作

for(i = 0; i < lNewHeight; i++)

{

// 针对图像每列进行操作

for(j = 0; j < lNewWidth; j++)

{

// 指向新DIB第i行,第j个象素的指针

// 注意此处宽度和高度是新DIB的宽度和高度

lpDst = (LPBYTE)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j; // 计算该象素在源DIB中的坐标

i0 = (LONG) (i / fYZoomRatio + 0.5);

j0 = (LONG) (j / fXZoomRatio + 0.5);

// 判断是否在源图范围内

if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))

{

// 指向源DIB第i0行,第j0个象素的指针

lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;

// 复制象素

*lpDst = *lpSrc;

}

else

{

// 对于源图中没有的象素,直接赋值为255

* ((LPBYTE)lpDst) = 255;

}

}

}

}

else if(wNumColors==0)

{for(i = 0; i < lNewHeight; i++)

{

// 针对图像每列进行操作

for(j = 0; j < lNewWidth; j++)

{

// 指向新DIB第i行,第j个象素的指针

// 注意此处宽度和高度是新DIB的宽度和高度

lpDst = (LPBYTE)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + 3*j; // 计算该象素在源DIB中的坐标

i0 = (LONG) (i / fYZoomRatio + 0.5);

j0 = (LONG) (j / fXZoomRatio + 0.5);

// 判断是否在源图范围内

if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))

{

// 指向源DIB第i0行,第j0个象素的指针

lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + 3*j0;

// 复制象素

memcpy(lpDst,lpSrc,3);

}

else

{

// 对于源图中没有的象素,直接赋值为255

memset(lpDst,255,3);

}

}

}

}

// 返回

return hDIB;

}

4. 256位图=》灰度图

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

* 函数名称:

* On256tograyscale ()

*

* 说明:

* 该算法函数用来把256图像转化成灰度图像。

*

************************************************************************/ void CCimageProcessingView::On256tograyscale()

{

// TODO: Add your command handler code here

// 获取文档指针

CCimageProcessingDoc* pDoc = GetDocument();

// 指向DIB的指针

LPSTR lpDIB;

// 指向DIB象素指针

LPSTR lpDIBBits;

// 指向DIB的一个象素的指针

BYTE * lpSrc;

// 颜色表中的颜色数目

WORD wNumColors;

// 灰度映射表

BYTE bGrayMap[256];

//调色板索应循环变量

LONG i;

// 图象高度循环变量

LONG ih;

//图象宽度循环变量

LONG iw;

// 图像宽度

LONG lWidth;

// 图像高度

LONG lHeight;

// 图像每行的字节数

LONG OneLineBytes;

// 指向BITMAPINFO结构的指针(Win3.0)

LPBITMAPINFO lpbmi;

// 指向BITMAPCOREINFO结构的指针(OS/2) LPBITMAPCOREINFO lpbmc;

// 表明是否是Win3.0 DIB的标记

BOOL bWin30DIB;

lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 获取指向BITMAPINFO结构的指针(Win3.0)

lpbmi = (LPBITMAPINFO)lpDIB;

// 获取指向BITMAPCOREINFO结构的指针(OS/2)

lpbmc = (LPBITMAPCOREINFO)lpDIB;

// 锁定DIB

// 获取DIB中颜色表中的颜色数目

wNumColors = ::DIBNumColors(lpDIB);

// 判断是否是256色位图

if (wNumColors != 256)

{

MessageBox("不是256色位图!");

// 解除锁定

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

// 返回

return;

}

// 更改光标形状

BeginWaitCursor();

// 判断是否是WIN3.0的DIB

bWin30DIB = IS_WIN30_DIB(lpDIB);

//将原图象的调色板转化为灰度调色板

//建立原调色板索引与灰度调色板索引的映射关系

for (i = 0; i < 256; i ++)

{

if (bWin30DIB)

//对原256色调色板的每一表项计算对应的灰度值

bGrayMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed + 0.587 * lpbmi->bmiColors[i].rgbGreen +

0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);

// 建立灰度调色板

//红色分量

lpbmi->bmiColors[i].rgbRed = i;

// 绿色分量

lpbmi->bmiColors[i].rgbGreen = i;

// 蓝色分量

lpbmi->bmiColors[i].rgbBlue = i;

// 保留位

lpbmi->bmiColors[i].rgbReserved = 0;

}

else

{

//对原256色调色板的每一表项计算对应的灰度值

bGrayMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed + 0.587 * lpbmc->bmciColors[i].rgbtGreen +

0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5);

//建立灰度调色板

// 红色分量

lpbmc->bmciColors[i].rgbtRed = i;

// 绿色分量

lpbmc->bmciColors[i].rgbtGreen = i;

// 蓝色分量

lpbmc->bmciColors[i].rgbtBlue = i;

}

}

// 找到DIB图像象素起始位置

lpDIBBits = ::FindDIBBits(lpDIB);

// 获取图像宽度

lWidth = ::DIBWidth(lpDIB);

// 获取图像高度

lHeight = ::DIBHeight(lpDIB);

// 计算图像每行的字节数

OneLineBytes = WIDTHBYTES(lWidth * 8);

// 更换原256色位图的每个象素的颜色索引

// 每行

for(ih = 0; ih < lHeight; ih++)

{

// 每列

for(iw= 0; iw < lWidth; iw++)

// 指向DIB第ih行,第iw列的象素的指针

lpSrc = (BYTE*)lpDIBBits + OneLineBytes * (lHeight - 1 - ih) +iw; //对256色位图,其像素值是调色板索引值

//对灰度图,索引值就等于其灰度值

//映射调色板索引

*lpSrc = bGrayMap[*lpSrc];

}

}

// 替换当前调色板为灰度调色板

pDoc->GetDocPalette()->SetPaletteEntries(0,256, (LPPALETTEENTRY)lpbmi->bmiColors);

// 设置脏标记

pDoc->SetModifiedFlag(TRUE);

// 实现新的调色板

OnDoRealize((WPARAM)m_hWnd,0);

// 更新视图

pDoc->UpdateAllViews(NULL);

// 解除锁定

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

// 恢复光标

EndWaitCursor();

}

5. 随机噪声

void CCimageProcessingView::OnRestoreRandomnoise()

{

// TODO: Add your command handler code here

// 获取文档指针

CCimageProcessingDoc* pDoc = GetDocument();

// 指向DIB的指针

LPSTR lpDIB;

// 获取DIB图像并锁定

lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

// 更改光标形状

BeginWaitCursor();

// 调用RandomNoise函数对DIB进行加噪处理

if (::RandomNoise(lpDIB))

{

// 设置脏标记

pDoc->SetModifiedFlag(TRUE);

// 更新视图

pDoc->UpdateAllViews(NULL);

}

else

// 提示用户

MessageBox("分配内存失败!");

}

// 解除锁定

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

// 恢复光标

EndWaitCursor();

}

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

* 函数名称:

*

* RandomNoise()

*

* 参数:

*

* LPSTR lpDIB // 指向源DIB图像指针

*

* 返回值:

*

* BOOL // 加入随机噪声操作成功返回TRUE,否则返回FALSE。

*

* 说明:

*

* 该函数用来对256色位图和24位真彩色位图进行加入随即噪声操作。

*

************************************************************************/ BOOL WINAPI RandomNoise (LPSTR lpDIB)

{

// 图像宽度和高度

LONG lWidth,lHeight;

// 指向图像像素的指针

LPSTR lpDIBBits;

// 指向源图像的指针

LPSTR lpSrc;

//循环变量

long i;

long j;

// 图像每行的字节数

LONG lLineBytes;

//指向图像信息头结构的指针

LPBITMAPINFOHEADER lpbmi;

//图像的颜色数

WORD wNumColors;

//噪声

BYTE NoiseValue;

// 计算图像每行的字节数

lpbmi=(LPBITMAPINFOHEADER)lpDIB;

//计算图像的高度和宽度

lWidth=::DIBWidth(lpDIB);

lHeight=::DIBHeight(lpDIB);

//找到图像像素的起始位置

lpDIBBits=::FindDIBBits(lpDIB);

//计算图像的颜色数

wNumColors=::DIBNumColors(lpDIB);

//计算图像每行的字节数

lLineBytes = WIDTHBYTES(lWidth * lpbmi->biBitCount);

//生成伪随机种子

srand((unsigned)time(NULL));

//在图像中加噪

//如果是256色位图

if(wNumColors==256)

{

for (j = 0;j < lHeight ;j++)

{

for(i = 0;i < lWidth ;i++)

{

//随机的噪声值

NoiseValue=rand()/1024;

// 指向源图像倒数第j行,第i个象素的指针

lpSrc = (char *)lpDIBBits + lLineBytes * j + i;

//在像素值中加入噪声值

*lpSrc = (BYTE)(((BYTE)*(lpSrc))*224/256 + NoiseValue); }

}

}

//如果是24位真彩色位图

else if(wNumColors==0)

{

for (j = 0;j < lHeight ;j++)

{

for(i = 0;i < lWidth ;i++)

{

NoiseValue=rand()/1024;

// 指向源图像倒数第j行,第i个象素的指针

lpSrc = (char *)lpDIBBits + lLineBytes * j + 3*i;

//在每个像素的RGB分量中加入随机的噪声值

*lpSrc++ = (BYTE)(((BYTE)*(lpSrc++))*224/256 + NoiseValue);

*lpSrc++ = (BYTE)(((BYTE)*(lpSrc++))*224/256 + NoiseValue);

*lpSrc++ = (BYTE)(((BYTE)*(lpSrc++))*224/256 + NoiseValue);

}

}

}

//如果既不是256色位图也不是24 位真彩色位图,直接返回

else

{

AfxMessageBox("只支持256色位图和24位真彩色位图");

return false;

}

// 返回

return true;

}

6.亮度调节

void CCimageProcessingView::OnEXPBright()

{

// TODO: Add your command handler code here

CCimageProcessingDoc* pDoc=GetDocument();

LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB()); AdjustBrightness(lpDIB,-80);

pDoc->SetModifiedFlag(true);

OnDoRealize((WPARAM)m_hWnd,0);

pDoc->UpdateAllViews(NULL);

}

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

* 函数名称:

*

* AdjustBrightness ()

*

* 参数:

*

* LPSTR lpDIB // 指向源DIB图像指针

*

* int db

*

* BOOL //操作成功返回TRUE,否则返回FALSE。

*

* 说明:

*

* 该算法函数用来对256色位图和24位真彩色位图进行亮度调整操作。

*

图像处理的流行的几种方法

一般来说,图像识别就是按照图像地外貌特征,把图像进行分类.图像识别地研究首先要考虑地当然是图像地预处理,随着小波变换地发展,其已经成为图像识别中非常重要地图像预处理方案,小波变换在信号分析识别领域得到了广泛应用. 现流行地算法主要还有有神经网络算法和霍夫变换.神经网络地方法,利用神经网络进行图像地分类,而且可以跟其他地技术相互融合.个人收集整理勿做商业用途 一神经网络算法 人工神经网络(,简写为)也简称为神经网络()或称作连接模型(),它是一种模范动物神经网络行为特征,进行分布式并行信息处理地算法数学模型.这种网络依靠系统地复杂程度,通过调整内部大量节点之间相互连接地关系,从而达到处理信息地目地.个人收集整理勿做商业用途 在神经网络理论地基础上形成了神经网络算法,其基本地原理就是利用神经网络地学习和记忆功能,让神经网络学习各个模式识别中大量地训练样本,用以记住各个模式类别中地样本特征,然后在识别待识样本时,神经网络回忆起之前记住地各个模式类别地特征并将他们逐个于样本特征比较,从而确定样本所属地模式类别.他不需要给出有关模式地经验知识和判别函数,通过自身地学习机制形成决策区域,网络地特性由拓扑结构神经元特性决定,利用状态信息对不同状态地信息逐一训练获得某种映射,但该方法过分依赖特征向量地选取.许多神经网络都可用于数字识别,如多层神经网络用于数字识别:为尽可能全面描述数字图像地特征,从很多不同地角度抽取相应地特征,如结构特征、统计特征,对单一识别网络,其输入向量地维数往往又不能过高.但如果所选取地特征去抽取向量地各分量不具备足够地代表性,将很难取得较好地识别效果.因此神经网络地设计是识别地关键.个人收集整理勿做商业用途 神经网络在图像识别地应用跟图像分割一样,可以分为两大类: 第一类是基于像素数据地神经网络算法,基于像素地神经网络算法是用高维地原始图像数据作为神经网络训练样本.目前有很多神经网络算法是基于像素进行图像分割地,神经网络,前向反馈自适应神经网络,其他还有模糊神经网络、神经网络、神经网络、细胞神经网络等.个人收集整理勿做商业用途 第二类是基于特征数据地神经网络算法.此类算法中,神经网络是作为特征聚类器,有很多神经网络被研究人员运用,如神经网络、模糊神经网络、神经网络、自适应神经网络、细胞神经网络和神经网络.个人收集整理勿做商业用途 例如神经网络地方法在人脸识别上比其他类别地方法有独到地优势,它具有自学习、自适应能力,特别是它地自学能力在模式识别方面表现尤为突出.神经网络方法可以通过学习地过程来获得其他方法难以实现地关于人脸识别规律和规则地隐性表达.但该方法可能存在训练时间长、收敛速度慢地缺点.个人收集整理勿做商业用途 二小波变换 小波理论兴起于上世纪年代中期,并迅速发展成为数学、物理、天文、生物多个学科地重要分析工具之一;其具有良好地时、频局域分析能力,对一维有界变差函数类地“最优”逼近性能,多分辨分析概念地引入以及快速算法地存在,是小波理论迅猛发展地重要原因.小波分析地巨大成功尤其表现在信号处理、图像压缩等应用领域.小波变换是一种非常优秀地、具有较强时、频局部分析功能地非平稳信号分析方法,近年来已在应用数序和信号处理有很大地发展,并取得了较好地应用效果.在频域里提取信号里地相关信息,通过伸缩和平移算法,对信号进行多尺度分类和分析,达到高频处时间细分、低频处频率细分、适应时频信号分解地要求.小波变换在图像识别地应用,包括图形去噪、图像增强、图像融合、图像压缩、图像分解和图像边缘检测等.小波变换在生物特征识别方面(例如掌纹特征提取和识别)同样得到了成功应用,部分研究结果表明在生物特征识别方面效果优于、、傅里叶变换等方

数字图像处理算法汇总

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

图像处理基本方法

图像处理的基本步骤 针对不同的目的,图像处理的方法不经相同。大体包括图像预处理和图像识别两大模块。 一、图像预处理: 结合识别复杂环境下的成熟黄瓜进行阐述,具体步骤如下: · 图像预处理阶段的流程图 对以上的图像流程进行详细的补充说明: 图像预处理的概念: 将每一个文字图像分检出来交给识别模块识别,这一过程称为图像预处理。 图像装换和图像分割以及区域形态学处理都是属于图像处理的基本内容之一。 图像转换:方法:对原图像进行灰度化处理生成灰度矩阵——降低运算速度(有具体的公式和方程),中值滤波去噪声——去除色彩和光照的影响等等。 图像分割:传统方法:基于阈值分割、基于梯度分割、基于边缘检测分割和基于区域图像割等方法。脉冲耦合神经网络 (PCNN)是针对复杂环境下 图像采集 图像采集中注意采集的方法、工具进行介绍。目的是怎样获取有代表性的样本。(包括天气、相机的位置等) 对采集的图像进行特征分析 目标的颜色和周围环境的颜色是否存在干涉的问题、平整度影响相机的拍摄效果、形状 图像转换 图像分割 区域形态学处理

的有效分割方法,分割的时候如果将一个数字图像输入PCNN,则能基于空间邻近性和亮度相似性将图像像素分组,在基于窗口的图像处理应用中具有很好的性能。 区域形态学处理:对PCNN分割结果后还存在噪声的情况下,对剩余的噪声进行分析,归类属于哪一种噪声。是孤立噪声还是黏连噪声。采用区域面积统计法可以消除孤立噪声。对于黏连噪声,可以采用先腐蚀切断黏连部分,再膨胀复原目标对象,在进行面积阙值去噪,通过前景空洞填充目标,最后通过形态学运算,二值图像形成众多独立的区域,进行各连通区域标识,利于区域几何特征的提取。 二、图像识别: 针对预处理图像提取 目标特征 建立LS SVM分类器 得到结果 图像识别流程图 提取目标特征:目标特征就是的研究对象的典型特点,可以包括几何特征和纹理特征。 对于几何特征采用的方法:采用LS-SVM支持向量机对几何特征参数进行处理,通过分析各个参数的分布区间来将目标和周围背景区分开,找出其中具有能区分功能的决定性的几何特征参数。 纹理特征方法:纹理特征中的几个参数可以作为最小二乘支持向量机的辅助特征参数,提高模型的精准度。 最小二乘支持向量机介绍:首先选择非线性映射将样本从原空间映射到特征空间,以解决原空间中线性不可分问题,在此高维空间中把最优决策问题转化为等式约束条件,构造最优决策函数,并引入拉格朗日乘子求解最优化问题,对各个变量求偏微分。 LS SVM分类器:对于p种特征选择q个图像连通区域,作为训练样本。依

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

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 )

图片处理的基本方法

图片处理的基本方法

《图片处理的基本方法》第1课时 —《利用ACDSee处理图片》教学设计1.教学内容分析 上一节内容讲了获取图片的方法,但获取的图片不一定能符合我们的要求,这就需要对图片进行处理。作为《图片的处理》的第1课时,选取了比较简单的图片处理软件ACDSee,ACDSee不仅有浏览图片的功能,还可以对图片进行简单的处理。本节主要让学生了解常见的图片处理软件,掌握利用ACDSee软件对图片进行色彩的调整、裁剪和旋转。 2.学习者分析 图片是学生最喜爱和最容易感知理解的信息之一,学生对图片处理的兴趣比较大,在生活中喜欢处理自己的照片,如QQ空间的个性相册,但对图片的处理都是通过模板的形式。学生对感兴趣的东西的学习积极性比较高且乐于探索,而ACDSee是一款比较简单的软件,比较适合学生自主探究。根据学生的年龄和特点,教学内容不易过深,重点是要让学生在学习中体验学习的乐趣。学生对图片的处理有探究的欲望,同时学生具备了一定的自学能力,能够通过互帮互学和自主探究较好地完成学习任务。 3.教学目标 (1)知识与技能: ①了解常见的图片处理软件及各个软件的主要功能。 ②了解什么是亮度、对比度和饱和度 ③能利用ACDSee调节图片的色彩 ④能利用ACDSee对图片进行裁剪 ⑤能利用ACDSee对图片进行旋转与翻转 (2)过程与方法:在教师的引导下,学生通过自主探究,利用ACDSee软件完成老师布置的处理图片的任务,在完成任务的过程中掌握ACDSee软件处理图片的基本方法。 (3)情感态度与价值观:体验图片处理的快乐和成就感。 4.教学重难点 重点:利用ACDSee对图片的进行曝光、旋转、裁剪等处理。

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

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

数字图像处理简答题及答案..

数字图像处理简答题及答案 简答题 1、数字图像处理的主要研究内容包含很多方面,请列出并简述其中的4种。 2、什么是图像识别与理解? 3、简述数字图像处理的至少3种主要研究内容。 4、简述数字图像处理的至少4种应用。 5、简述图像几何变换与图像变换的区别。 6、图像的数字化包含哪些步骤?简述这些步骤。 7、图像量化时,如果量化级比较小会出现什么现象?为什么? 8、简述二值图像与彩色图像的区别。 9、简述二值图像与灰度图像的区别。 10、简述灰度图像与彩色图像的区别。 11、简述直角坐标系中图像旋转的过程。 12、如何解决直角坐标系中图像旋转过程中产生的图像空穴问题? 13、举例说明使用邻近行插值法进行空穴填充的过程。 14、举例说明使用均值插值法进行空穴填充的过程。 15、均值滤波器对高斯噪声的滤波效果如何?试分析其中的原因。 16、简述均值滤波器对椒盐噪声的滤波原理,并进行效果分析。 17、中值滤波器对椒盐噪声的滤波效果如何?试分析其中的原因。 18、使用中值滤波器对高斯噪声和椒盐噪声的滤波结果相同吗?为什么会出现这种现象?

19、使用均值滤波器对高斯噪声和椒盐噪声的滤波结果相同吗?为什么会出现这种现象? 20、写出腐蚀运算的处理过程。 21、写出膨胀运算的处理过程。 22、为什么YUV表色系适用于彩色电视的颜色表示? 23、简述白平衡方法的主要原理。 24、YUV表色系的优点是什么? 25、请简述快速傅里叶变换的原理。 26、傅里叶变换在图像处理中有着广泛的应用,请简述其在图像的高通滤波中的应用原理。 27、傅里叶变换在图像处理中有着广泛的应用,请简述其在图像的低通滤波中的应用原理。 28、小波变换在图像处理中有着广泛的应用,请简述其在图像的压缩中的应用原理。 29、什么是图像的无损压缩?给出2种无损压缩算法。 2、对于扫描结果:aaaabbbccdeeeeefffffff,若对其进行霍夫曼编码之后的结果是:f=01 e=11 a=10 b=001 c=0001 d=0000。若使用行程编码和霍夫曼编码的混合编码,压缩率是否能够比单纯使用霍夫曼编码有所提高? 31、DCT变换编码的主要思想是什么? 32、简述DCT变换编码的主要过程。 33、什么是一维行程编码?简述其与二维行程编码的主要区别。 34、什么是二维行程编码?简述其与一维行程编码的主要区别。 35、简述一维行程编码和二维行程编码的异同。 36、压缩编码算法很多,为什么还要采用混合压缩编码?请举例说明。 37、对于扫描结果:aaaabbbccdeeeeefffffff,若对其进行霍夫曼编码之后的结果是:f=01 e=11 a=10 b=001 c=0001 d=0000。若使用行程编码和霍夫曼编码的混合编码,压缩率是否能够比单纯使用行程编码有所提高? 38、连续图像和数字图像如何相互转换?

(完整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在图像分割领域应用最为成熟,只要有两种应用,一是在多种分割结果中搜索最佳分

数字图像处理的基本方法

一、图像的预处理技术 图像处理按输入结果可以分为两类,即输入输出都是一副图像和输入一张图像输出不再是图像的数据。图像处理是个很广泛的概念,有时候我们仅仅需要对一幅图像做一些简单的处理,即按照我们的需求将它加工称我们想要得效果的图像,比如图像的降噪和增强、灰度变换等等。更多时候我们想要从一幅图像中获取更高级的结果,比如图像中的目标检测与识别。如果我们将输出图像中更高级的结果视为目的的话,那么我们可以把输入输出都是一幅图像看作是整个处理流程中的预处理。下面我们将谈到一些重要的预处理技术。 (一)图像增强与去噪 图像的增强是一个主观的结果,原来的图像按照我们的需求被处理成我们想要的效果,比如说模糊、锐化、灰度变换等等。图像的去噪则是尽可能让图像恢复到被噪声污染前的样子。衡量标准是可以度量的。不管是图像的增强与去噪,都是基于滤波操作的。 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 是距离频率矩形中心的距离。该滤波器能保留低频分量,逐渐减小高频分量,对原图像具有模糊作用。

基本数字(精选)图像处理算法的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、中值滤波

最新数字图像处理(基础)教案

数字图像处理(基础)教案 一、基础知识 第一节、数字图像获取 一、目的 1掌握使用扫描仪等数字化设备以及计算机获取数字图像的方法; 2修改图像的存储格式。 二、原理 用扫描仪获取图像也是图像的数字化过程的方法之一。 扫描仪按种类可以分为手持扫描仪,台式扫描仪和滚筒式扫描仪(鼓形扫描仪)。 扫描仪的主要性能指标有x、y方向的分辨率、色彩分辨率(色彩位数)、扫描幅面和接口方式等。各类扫描仪都标明了它的光学分辨率和最大分辨率。分辨率的单位是dpi,dpi是英文Dot Per Inch的缩写,意思是每英寸的像素点数。 扫描仪工作时,首先由光源将光线照在欲输入的图稿上,产生表示图像特征的反射光(反射稿)或透射光(透射稿)。光学系统采集这些光线,将其聚焦在CCD上,由CCD将光信号转换为电信号,然后由电路部分对这些信号进行A/D转换及处理,产生对应的数字信号输送给计算机。当机械传动机构在控制电路的控制下,带动装有光学系统和CCD的扫描头与图稿进行相对运动,将图稿全部扫描一遍,一幅完整的图像就输入到计算机中去了。

图1.1扫描仪的工作原理 扫描仪扫描图像的步骤是:首先将欲扫描的原稿正面朝下铺在扫描仪的玻璃板上,原稿可以是文字稿件或者图纸照片;然后启动扫描仪驱动程序后,安装在扫描仪内部的可移动光源开始扫描原稿。为了均匀照亮稿件,扫描仪光源为长条形,并沿y方向扫过整个原稿;照射到原稿上的光线经反射后穿过一个很窄的缝隙,形成沿x方向的光带,又经过一组反光镜,由光学透镜聚焦并进入分光镜,经过棱镜和红绿蓝三色滤色镜得到的RGB三条彩色光带分别照到各自的CCD上,CCD将RGB光带转变为模拟电子信号,此信号又被A/D变换器转变为数字电子信号。至此,反映原稿图像的光信号转变为计算机能够接受的二进制数字电子信号,最后通过串行或者并行等接口送至计算机。扫描仪每扫一行就得到原稿x方向一行的图像信息,随着沿y方向的移动,在计算机内部逐步形成原稿的全图。 在扫描仪的工作过程中,有两个元件起到了关键的作用。一个是CCD,它将光信号转换成为电信号;另一个是A/D变换器,它将模拟电信号变为数字电信号。CCD是Charge Couple Device的缩写,称为电荷耦合器件,它是利用微电子技术制成的表面光电器件,可以实现光电转换功能。CCD 在摄像机、数码相机和扫描仪中应用广泛,只不过摄像机中使用的是点阵CCD,即包括x、y两个方向用于摄取平面图像,而扫描仪中使用的是线性CCD,它只有x一个方向,y方向扫描由扫描仪的机械装置来完成。CCD芯片上有许多光敏单元,它们可以将不同的光线转换成不同的电荷,从而形成对应原稿光图像的电荷图像。如果我们想增加图像的分辨率,就必须增加CCD上的光敏单元数量。实际上,CCD的性能决定了扫描仪的x方向的光学分辨率。A/D变换器是将模拟量(Analog)转变为数字量(Digital)的半导体元件。从CCD获取的电信号是对应于图像明暗的模拟信号,就是说图像由暗到亮的变化可以用从低到高的不同电平来表示,它们是连续变化的,即所谓模拟量。A/D变换器的工作是将模拟量数字化,例如将0至1V的线性电压变化表示为0至9的10个等级的方法是:0至小于0.1V 的所有电压都变换为数字0、0.1至小于0.2V的所有电压都变换为数字1……0.9至小于1.0V的所有电压都变换为数字9。实际上,A/D变换器能够表示的范围远远大于10,通常是2^8=256、2^10=1024或者2^12=4096。如果扫描仪说明书上标明的灰度等级是10bit,则说明这个扫描仪能够将图像分成1024个灰度等级,如果标明色彩深度为30bit,则说明红、绿、蓝各个通道都有1024个等级。显然,该等级数越高,表现的彩色越丰富。 步骤

常用图像处理算法

8种常用图像处理算法(函数)------以下所有函数均放在https://www.360docs.net/doc/4012548826.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.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

相关文档
最新文档