数字图像处理领域的二十四个典型算法及vc实现(1)_第1页
数字图像处理领域的二十四个典型算法及vc实现(1)_第2页
数字图像处理领域的二十四个典型算法及vc实现(1)_第3页
数字图像处理领域的二十四个典型算法及vc实现(1)_第4页
数字图像处理领域的二十四个典型算法及vc实现(1)_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字图像处理领域的二十四个典型算法及 vc 实现、第一章一、256 色转灰度图二、Walsh 变换三、二值化变换四、阈值变换五、傅立叶变换六、离散余弦变换数字图像处理领域的二十四个典型算法及 vc 实现、第二章七、高斯平滑八、图像平移九、图像缩放十、图像旋转数字图像处理领域的二十四个典型算法及 vc 实现、第三章图像处理,是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。本文接下来,简单粗略介绍下数字图像处理领域中的 24 个经典算法,然后全部算法用 vc 实现。由于篇幅所限,只给出某一算法的主体代码。ok,请细看。一、256 色转灰度图算法介绍(百度百科):什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G ,B),那么,我们可以通过下面几种方法,将其转换为灰度: 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11 2.整数方法:Gray=(R*30+G*59+B*11)/100 3.移位方法:Gray =(R*28+G*151+B*77)8; 4.平均值法:Gray=(R+G+B)/3; 5.仅取绿色:Gray=G; 通过上述任一种方法求得 Gray 后,将原来的 RGB(R,G,B)中的 R,G,B 统一用 Gray替换,形成新的颜色 RGB(Gray,Gray,Gray),用它替换原来的 RGB(R,G,B)就是灰度图了。灰度分为 256 阶。所以,用灰度表示的图像称作灰度图。程序实现:ok,知道了什么叫灰度图,下面,咱们就来实现此 256 色灰度图。这个 Convert256toGray(),即是将 256 色位图转化为灰度图:void Convert256toGray(HDIB hDIB)LPSTR lpDIB; / 由 DIB 句柄得到 DIB 指针并锁定 DIBlpDIB = (LPSTR) :GlobalLock(HGLOBAL)hDIB); / 指向 DIB 象素数据区的指针LPSTR lpDIBBits; / 指向 DIB 象素的指针BYTE * lpSrc; / 图像宽度LONG lWidth; / 图像高度LONG lHeight; / 图像每行的字节数LONG lLineBytes; / 指向 BITMAPINFO 结构的指针( Win3.0)LPBITMAPINFO lpbmi; / 指向 BITMAPCOREINFO 结构的指针LPBITMAPCOREINFO lpbmc;/ 获取指向 BITMAPINFO 结构的指针(Win3.0)lpbmi = (LPBITMAPINFO)lpDIB; / 获取指向 BITMAPCOREINFO 结构的指针lpbmc = (LPBITMAPCOREINFO)lpDIB; / 灰度映射表BYTE bMap256;/ 计算灰度映射表(保存各个颜色的灰度值),并更新 DIB 调色板int i,j;for (i = 0; i bmiColorsi.rgbRed +0.587 * lpbmi-bmiColorsi.rgbGreen +0.114 * lpbmi-bmiColorsi.rgbBlue + 0.5); / 更新 DIB 调色板红色分量lpbmi-bmiColorsi.rgbRed = i; / 更新 DIB 调色板绿色分量lpbmi-bmiColorsi.rgbGreen = i; / 更新 DIB 调色板蓝色分量lpbmi-bmiColorsi.rgbBlue = i;/ 更新 DIB 调色板保留位lpbmi-bmiColorsi.rgbReserved = 0;/ 找到 DIB 图像象素起始位置lpDIBBits = :FindDIBBits(lpDIB);/ 获取图像宽度lWidth = :DIBWidth(lpDIB); / 获取图像高度lHeight = :DIBHeight(lpDIB); / 计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth * 8); / 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)/逐行扫描for(i = 0; i 255)/ 对于超过的,直接设置为 255dTemp = 255;/ 指向 DIB 第 j 行,第 i 个象素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;/ 更新源图像* (lpSrc) = (BYTE)(dTemp);/释放内存delete f;delete F;/ 返回return TRUE;变换效果:三、二值化变换算法描述:二值化是图像分割的一种方法。在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度極大值,把小于这个值的像素灰度设为灰度極小值,从而实现二值化。根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。 比较常用的二值化方法则有:双峰法、P 参数法、迭代法和 OTSU 法等。程序实现:void CMyDIPView:OnDraw(CDC* pDC) CMyDIPDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(pDoc-m_hDIB = NULL)return ;/ TODO: add draw code for native data hereint i,j;unsigned char *lpSrc;LPSTR lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-m_hDIB);int cxDIB = (int) :DIBWidth(lpDIB); / Size of DIB - xint cyDIB = (int) :DIBHeight(lpDIB); / Size of DIB - yLPSTR lpDIBBits=:FindDIBBits (lpDIB);/ 计算图像每行的字节数long lLineBytes = WIDTHBYTES(cxDIB * 8);/ 每行for(i = 0; i m_hDIB);CRect rect(0,0,cxDIB,cyDIB), rcDIB(0,0,cxDIB,cyDIB);:PaintDIB(pDC-m_hDC, void CMyDIPView:OnMenuitem32778() / TODO: Add your command handler code hereint i,j;unsigned char *lpSrc;CMyDIPDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(pDoc-m_hDIB = NULL)return ;LPSTR lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-m_hDIB);LPSTR lpDIBBits=:FindDIBBits (lpDIB);int cxDIB = (int) :DIBWidth(lpDIB); / Size of DIB - xint cyDIB = (int) :DIBHeight(lpDIB); / Size of DIB - ylong lLineBytes = WIDTHBYTES(cxDIB * 8); / 计算图像每行的字节数const float c1=150,c2=2.5;/ 每行for(i = 0; i m_hDIB);Invalidate(TRUE);变换效果:四、阈值变换算法描述:输入图像像元密度值(灰度、亮度值)按对数函数关系变换为输出图像。 程序实现:/参数说明:/LPSTR lpDIBBits:指向源 DIB 图像指针/LONG lWidth:源图像宽度(象素数)/LONG lHeight:源图像高度(象素数)/BYTE bThre:阈值/程序说明:/该函数用来对图像进行阈值变换。对于灰度值小于阈值的象素直接设置灰度值为 0;灰度值大于阈值的象素直接设置为 255。BOOL WINAPI ThresholdTrans(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BYTE bThre)/ 指向源图像的指针unsigned char* lpSrc;/ 循环变量LONG i;LONG j;/ 图像每行的字节数LONG lLineBytes;/ 计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth * 8);/ 每行for(i = 0; i * TD - 指向时域数组的指针complex * FD - 指向频域数组的指针r 2 的幂数,即迭代次数返回值:无。说明:该函数用来实现快速付立叶变换。VOID WINAPI FFT(complex * TD, complex * FD, int r)/ 付立叶变换点数LONG count;/ 循环变量int i,j,k;/ 中间变量int bfsize,p;/ 角度double angle;complex *W,*X1,*X2,*X;/ 计算付立叶变换点数count = 1 count / 2;X1 = new complexcount;X2 = new complexcount;/ 计算加权系数for(i = 0; i (cos(angle), sin(angle);/ 将时域点写入 X1memcpy(X1, TD, sizeof(complex) * count);/ 采用蝶形算法进行快速付立叶变换for(k = 0; k *TD = new complexw * h;complex *FD = new complexw * h;/ 行for(i = 0; i (*(lpSrc), 0);for(i = 0; i 255)/ 对于超过的,直接设置为 255dTemp = 255;/ 指向 DIB 第(i * TD - 指向时域数组的指针complex * FD - 指向频域数组的指针r 2 的幂数,即迭代次数返回值:无。说明:该函数用来实现快速付立叶变换。VOID WINAPI FFT(complex * TD, complex * FD, int r)/ 付立叶变换点数LONG count;/ 循环变量int i,j,k;/ 中间变量int bfsize,p;/ 角度double angle;complex *W,*X1,*X2,*X;/ 计算付立叶变换点数count = 1 count / 2;X1 = new complexcount;X2 = new complexcount;/ 计算加权系数for(i = 0; i (cos(angle), sin(angle);/ 将时域点写入 X1memcpy(X1, TD, sizeof(complex) * count);/ 采用蝶形算法进行快速付立叶变换for(k = 0; k *X;/ 计算离散余弦变换点数count = 1count*2;/ 赋初值为 0memset(X, 0, sizeof(complex) * count * 2);/ 将时域点写入数组 Xfor(i=0;i (fi, 0);/ 调用快速付立叶变换FFT(X,X,r+1);/ 调整系数dTemp = 1/sqrt(count);/ 求 F0F0 = X0.real() * dTemp;dTemp *= sqrt(2);/ 求 Fu for(i = 1; i 255)/ 对于超过的,直接设置为 255dTemp = 255;/ 指向 DIB 第 y 行,第 x 个象素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;/ 更新源图像* (lpSrc) = (BYTE)(dTemp);/ 释放内存delete f;delete F;/ 返回return TRUE;变化效果:更多见下一章: 数字图像处理领域的二十四个典型算法及 vc 实现、第二章。本文完。数字图像处理领域的二十四个典型算法及 vc 实现、第二章作者:July 二零一一年二月二十六日。参考:百度百科、维基百科、vc 数字图像处理。-数字图像处理领域的二十四个典型算法及 vc 实现、第一章一、256 色转灰度图二、Walsh 变换三、二值化变换四、阈值变换五、傅立叶变换六、离散余弦变换数字图像处理领域的二十四个典型算法及 vc 实现、第二章七、高斯平滑八、图像平移九、图像缩放十、图像旋转数字图像处理领域的二十四个典型算法及 vc 实现、第三章数字图像处理领域的二十四个典型算法及 vc 实现、第四章前期回顾:在上一章,数字图像处理领域的二十四个典型算法及 vc 实现、第一章中,我们介绍和实现了 256 色转灰度图、Walsh 变换、二值化变换、阈值变换、傅立叶变换、离散余弦变换等数字图像处理领域中的 6 个典型算法。这一篇接上一篇,继续阐述数字图像处理领域的典型算法。注,有兴趣具体深入研究的朋友可参考国内外有关此类图像处理算法的优秀论文。七、高斯平滑算法描述:在图像预处理中,对图像进行平滑,去除噪声,恢复原始图像是一个重要内容。本文设计了一个平滑尺度和模板大小均可以改变的高斯滤波器,用它对多幅加入各种噪声后的图像进行平滑,经过对各个结果图像的对比可知高斯滤波对服从正态分布的噪声去除效果比较好,并且相比各个不同参数,在平滑尺度为 2,模板大小为 7 时效果最佳。程序实现:函数名称:Template:参数:HDIB hDIB 图像的句柄double *tem 指向模板的指针int tem_w 模板的宽度int tem_h 模板的高度double xishu 模板的系数功能:对图像进行模板操作说明:为处理方便起见,模板的宽度和高度都应为奇数HDIB Template(HDIB hDIB,double * tem ,int tem_w,int tem_h,double xishu)/统计中间值double sum;/指向图像起始位置的指针BYTE *lpDIB=(BYTE*):GlobalLock(HGLOBAL) hDIB);/指向象素起始位置的指针BYTE *pScrBuff =(BYTE*):FindDIBBits(char*)lpDIB);/获取图像的颜色信息int numColors=(int) :DIBNumColors(char *)lpDIB);/如果图像不是 256 色返回if (numColors!=256) /解除锁定:GlobalUnlock(HGLOBAL) hDIB);/返回return(hDIB);/将指向图像象素起始位置的指针,赋值给指针变量BYTE* oldbuf = pScrBuff;/循环变量int i,j,m,n;int w, h, dw;/获取图像的宽度w = (int) :DIBWidth(char *)lpDIB);/获取图像的高度h = (int) :DIBHeight(char *)lpDIB);/计算图像每行的字节数dw = (w+3)/4*4; /建立一个和原图像大小相同的 25 色灰度位图HDIB newhDIB=NewDIB(w,h,8); /指向新的位图的指针BYTE *newlpDIB=(BYTE*):GlobalLock(HGLOBAL) newhDIB);/指向新的位图的象素起始位置的指针 BYTE *destBuf = (BYTE*)FindDIBBits(char *)newlpDIB); /将指向新图像象素起始位置的指针,赋值给指针变量BYTE *newbuf=destBuf; /对图像进行扫描/行 for(i=0;i(w-(tem_w+1)/2) | i(h-(tem_h+1)/2) )*(newbuf+i*dw+j)=*(oldbuf+i*dw+j); /对于其他的象素进行模板操作else /将点(i,j)点作为模板的中心for(m=i-(tem_h-1)/2);m255)sum=255;/将计算的结果放到新的位图的相应位置*(newbuf+i*dw+j)=sum; /解除锁定:GlobalUnlock(HGLOBAL)hDIB); /返回新的位图的句柄return(newhDIB);变换效果(图像右边部分即为某一算法的变换效果,下同):八、图像平移算法描述:我想,图像平移,就不必过多介绍了。无非就是通过坐标的增或减的变化,来达到图像在屏幕上的左移、右移、上移、下移的效果。程序实现:TranslationDIB-该函数用来水平移动 DIB 图像。函数不会改变图像的大小,移出的部分图像将截去,空白部分用白色填充。下面的左移,右移,上移,下移,各自都调用了此 TranslationDIB 函数。/图像平移函数。BOOL WINAPI TranslationDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, LONGlXOffset, LONG lYOffset)/ 指向源图像的指针LPSTR lpSrc;/ 指向要复制区域的指针LPSTR lpDst;/ 指向复制图像的指针LPSTR lpNewDIBBits;HLOCAL hNewDIBBits;/ 象素在新 DIB 中的坐标LONG i;LONG j;/ 象素在源 DIB 中的坐标LONG i0;LONG j0;/ 图像每行的字节数LONG lLineBytes;/ 计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth * 8);/ 暂时分配内存,以保存新图像hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);if (hNewDIBBits = NULL)/ 分配内存失败return FALSE;/ 锁定内存lpNewDIBBits = (char * )LocalLock(hNewDIBBits);/ 每行for(i = 0; i = 0) / 判断是否是 8-bpp 位图(这里为了方便,只处理 8-bpp 位图的平移,其它的可以类推)if (:DIBNumColors(lpDIB) != 256)/ 提

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论