370 likes | 594 Views
数字图像处理课程 综合实习. 2011 年 5 月. 一、数字图像基本概念. 1 、数字图像 连续物理图像采样和量化为离散数值矩阵,矩阵中每个元素表示相应位置像素亮度,称之为数字图像。 描述数字图像,就要用到像素行数 (Height) 、像素列数 (Width) ,每行存储字节数 (LineBytes) ,每个像素 (i,j) 亮度值 (pData[(Height-i-1)*LineBYtes+j]) 。 数字图像处理,就是对 Height 行、 Width 列像素亮度进行运算,有空间域的点运算、邻域运算以及频率域运算等。.
E N D
数字图像处理课程综合实习 2011年5月
一、数字图像基本概念 • 1、数字图像 • 连续物理图像采样和量化为离散数值矩阵,矩阵中每个元素表示相应位置像素亮度,称之为数字图像。 • 描述数字图像,就要用到像素行数(Height)、像素列数(Width),每行存储字节数(LineBytes),每个像素(i,j)亮度值(pData[(Height-i-1)*LineBYtes+j])。 • 数字图像处理,就是对Height行、 Width列像素亮度进行运算,有空间域的点运算、邻域运算以及频率域运算等。
一、数字图像基本概念 • 2、像素颜色 自然界中所有颜色都可由红、绿、蓝(RGB)三原色组合。在数字图像中,R、G、B量化为0到255共256级,像素取不同的RGB值,表示不同的颜色。 1)单色图像 单色图像只有黑白两色,像素值1位,取0或1。 2)256色图像 256色图像有256种颜色,像素值8位,取0-255。
一、数字图像基本概念 • 2、像素颜色 • 3)真彩色图像 • 真彩色图像有256 X 256 X256种颜色,像素值24位,3个字节分别表示B、G、R分量值。 • 4)灰度图像 • 灰度图像有256种灰度级,像素值8位,取 0-255,每一灰度级B、G、R分量相等。 • 8位位图是比较广泛的图像表示方法,当需要实时快速处理图像时,利用8位位图近似处理。
一、数字图像基本概念 • 3、图像格式 • 数字图像中,像素值矩阵用二维数组表示,像素值按不同方式存储,图像格式就不同。图像数据存成文件就得到图像文件,图像格式不同,图像文件扩展名就不同。 • 如:位图格式,文件扩展名为bmp; • RAW格式,文件扩展名为raw。 • 3.1 RAW格式 • 像素值根据行、列号,按从上到下、从左到右顺序,依次存储到.raw文件。.raw文件只含像素值,不含图像信息,不能直接获得图像高度和宽度,需根据.raw文件大小(Length)计算Height和Width或给定。
一、数字图像基本概念 • 3、图像格式 • 3.1 RAW格式 • 从*.raw文件中,读取像素数据到hRaw • CFile FileRaw; • FileRaw.Open(“*.raw”,CFile::modeRead); • LONG Length=FileRaw.GetLength(); • HLOCAL hRaw=LocalAlloc(LHND,Length); • LPBYTE pRaw=(LPBYTE)LocalLock(hRaw); • FileRaw.ReadHuge(pRaw,Length);
一、数字图像基本概念 • 3、 图像格式 • 3.2 位图格式 • 3.2.1 DDB—与设备相关位图 • Windows.h中结构体BITMAP定义了DDB高度、宽度、像素值,但没有颜色表,显示时以系统调色板进行颜色映射,是一种内部位图格式,不存储成文件。 • 3.2.2 DIB—与设备无关位图 • DIB定义了颜色表,显示时以颜色表创建调色板进行颜色映射,是一种外部位图格式,存储成.bmp文件,显示位图固有颜色。
一、数字图像基本概念 • 4、BMP文件 • BMP文件包含: • 文件头BITMAPFILEHEADER • 信息头BITMAPINFOHEADER • 颜色表bmiColors[i] • 图像数据pData[(Height-i-1)*LineBytes+j]
一、数字图像基本概念 • 4.1 位图文件头 typedef struct tagBITMAPFILEHEADER { WORD bfType; //必须是0x424D,即字符串“BM” DWORD bfSize; //文件大小 WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; //数据区相对文件头偏移字节数 }BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER; • 文件头共14字节
一、数字图像基本概念 • 4.2 位图信息头 typedef struct tagBITMAPINFOHEADER { DWORD bfSize; //本结构字节数,为40 LONG biWidth; //图像宽度,以像素为单位 LONG biHeight; //图像高度,以像素为单位 WORD biPlanes; //必须是1 WORD biBitCount; //像素值位数 DWORD biCompression; //位图是否压缩,BI_RGB 、BI_RLE4、BI_RLE8 DWORD biSizeImage; // 数据区字节数:LineBytes*Height LONG biXPelsPerMeter;//目标设备水平分辨率 LONG biYPersPerMeter;//目标设备垂直分辨率 DWORD biClrUsed; //实际所用颜色数,若为0,颜色数为2biBitCount次 DWORD biClrImportant; //重要颜色数 }BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER;
一、数字图像基本概念 • 4.3 颜色表 • 颜色表:含有biClrUsed个RGBQUAD结构体,定义biClrUsed种颜色。 • 当biBitCount=8时, biClrUsed=256; • 当biBitCount=24时,没有颜色表 • RGBQUAD结构体定义颜色 • typedef struct tagRGBQUAD • { • BYTE rgbBlue; //蓝色亮度,取值0-255 • BYTE rgbGreen; //绿色亮度,取值0-255 • BYTE rgbRed; //红色亮度,取值0-255 • BYTE rgbReserved;//必须为0 • }RGBQUAD;
一、数字图像基本概念 • 4.4 数据区 • 像素值按行、列号,从下到上,从左到右存储在数据区,每行字节数是4字节的倍数,不足位补0。 • LineBytes=(Width*biBitCount+31)/32*4 • biBitCount=1,1个像素1位,8个像素1字节,颜色数为2,颜色表表项数为2,像素值为颜色表索引值。 • biBitCount=4,1个像素4位,2个像素1字节,颜色数为16,颜色表表项数为16,像素值为颜色表索引值。 • biBitCount=8,1个像素8位,1个像素1字节,颜色数为256,颜色表表项数为256,像素值为颜色表索引值。 • biBitCount=24,1个像素3字节,存储蓝、绿、红颜色值,无颜色表,像素值为真实颜色值。
一、数字图像基本概念 • 5、调色板 • 显示硬件根据系统调色板,进行颜色映射,显示像素颜色。系统调色板只前20种颜色固定不变,不能正确显示位图所有颜色。 • 1)根据位图颜色表,创建位图逻辑调色板结构 LPLOGPALETTE pLogPal; pLogPal=(LPLOGPALETTE)GlobalAlloc(GHND,2*sizeof(WORD)+ m_numberOfColors*sizeof(PALETTEENTRY)); • pLogPal->palVersion=0x300; • pLogPal->palNumEntries=m_numberOfColors; • BITMAPINFO * PBitmapInfo=(BITMAPINFO *)m_pBitmapInfoHeader; • for(int i=0;i<m_numberOfColors;i++) • { • pLogPal->palPalEntry[i].peRed=PBitmapInfo->bmiColors[i].rgbRed; • pLogPal->palPalEntry[i].peGreen=PBitmapInfo->bmiColors[i].rgbGreen; • pLogPal->palPalEntry[i].peBlue=PBitmapInfo->bmiColors[i].rgbBlue; • pLogPal->palPalEntry[i].peFlags=0; • }
一、数字图像基本概念 • 5、调色板 • 2)创建逻辑调色板,返回逻辑调色板句柄 • HPALETTE hPalette=::CreatePalette(pLogPal); • 3)选择逻辑调色板到设备上下文 • CDC *pDC=GetDC(); • HDC hDC=pDC->GetSafeHdc(); • ::SelectPalette(hDC,hPalette,true); • 4)设备上下文的逻辑调色板实现为系统调色板 • ::RealizePalette(hDC);
一、数字图像基本概念 6、显示函数 1)int WINAPIStretchDIBits(HDChdc,int XDest,int YDest, int nDestWidth,int nDestHeight,int XSrc,int YSrc,int nSrcWidth, int nSrcHeight, CONST VOID *lpvBits,CONST BITMAPINFO *lpbmi,UINT iUsage,DWORD dwRop) HDC hdc:设备上下文句柄 int Xdest:指定绘图区域的左上角x坐标(逻辑单位) int Ydest:指定绘图区域的左上角y坐标(逻辑单位) int nDestWidth:指定DIB的宽度(逻辑单位) int nDestHeight:指定DIB的高度(逻辑单位) int XSrc:指定原位图要绘制区域的左上角x坐标(逻辑单位) int Ysrc:指定原位图要绘制区域的左上角y坐标(逻辑单位)
一、数字图像基本概念 • 6、显示函数 • int nSrcWidth:指定要复制原图像矩形区域的宽度(逻辑单位) int nSrcHeight:指定要复制原图像矩形区域的高度(逻辑单位) lpBits:指向DIB图像数据区的指针 lpBitsInfo:指向BITMAPINFO结构的指针 iUsage:指定BITMAPINFO结构中的bmiColors参数代表 真实的RGB值还是调色板中的索引值,它有两种可能的取值: DIB_PAL_COLORS:代表索引值 DIB_RGB_COLORS:代表真实的RGB值 dwRo:指定绘制方式;常用的值为SRCCOPY,表示将原位图复制到 目标位图该函数如果调用成功,返回绘制的行数;如果调用 失败,则返回GDI_ERROR。
一、数字图像基本概念 • 6、显示函数 1)int SetDIBitsToDevice(HDC hdc,int XDest,int YDest,DWORD dwWidth,DWORD dwHeight,int XSrc,int YSrc,UINT uStartScan UINT cScanLines,CONST VOID *lpBits,CONST BITMAPINFO *lpbmi,UINT fuColorUse) 该函数可以直接在显示器或打印机上显示DIB: HDC hdc:设备上下文句柄。它可以是CDC对象的公共成员 变量m_hDC。 int Xdest:指定绘图区域的左上角x坐标(逻辑单位) int Ydest:指定绘图区域的左上角y坐标(逻辑单位) DWORD dwWidth:指定DIB的宽度(逻辑单位) DWORD dwHeight:指定DIB的高度(逻辑单位)
一、数字图像基本概念 6、显示函数 int Xsrc:指定原绘图要绘制区域的左上角x坐标(逻辑单位) int Ysrc:指定原绘图要绘制区域的左上角y坐标(逻辑单位) UINT uStartScan:指定DIB扫描的起始行 UINT cScanLines:指定DIB扫描的行数(即DIB的高度) CONST VOID* lpBits:指向DIB图像数据的指针 lpbmi:指向BITMAPINFO结构的指针 fuColorUse:指定BITMAPINFO结构中的bmiColors参数代表 真实的RGB值还是调色板中的索引值,它有两种可能的取值: DIB_PAL_COLORS:代表索引值 DIB_RGB_COLORS:代表真实的RGB值
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 是对位图常用功能的一个封装类其定义如下: class CBmpFile { public: CBmpFile(); virtual ~CBmpFile(); BOOL CreateBmp(int cols,int rows,int pixelPytes); BOOL Load4File( LPCSTR lpstrPathName ); BOOL Save2File( LPCSTR lpstrPathName ); void Draw2DC( HDC hDC,int x,int y ); public: BYTE* m_pImgDat; int m_Cols,m_Rows,m_PxlBytes; BYTE* m_pBmpInfo; };
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 将位图的描述信息(包括:位数据矩阵、行数、列数、颜色数等)保存的属性变量中,详细定义: • BYTE* m_pImgDat:位图的位数据矩阵,按行存放。 • int m_Cols,m_Rows,m_PxlBytes:位图的 列数(宽)、行数(宽)、颜色深度(灰度或者是RGB彩色)。 • BYTE* m_pBmpInfo:显示用的内部临时变量,给 WindwosAPI StretchDIBits 用。
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 可实现从文件读入位图数据、保存位图到文件、在Windows窗口中显示位图、新建位图等功能。 各功能的调用函数分别如下: 1、新建位图 CreateBmp(int cols,int rows,int pixelPytes); 参数解释: int cols: 位图的列数,也即位图的宽。 int rows: 位图的行数,也即位图的高。 int pixelBytes:位图每位所用字节数,也是位图的颜色深度,值1为256色(灰度),值3为RGB彩色。
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 可实现从文件读入位图数据、保存位图到文件、在Windows窗口中显示位图、新建位图等功能。 各功能的调用函数分别如下: 2、读入位图 Load4File( LPCSTR lpstrPathName ); 参数解释: LPCSTR lpstrPathName: 位图文件的路径
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 可实现从文件读入位图数据、保存位图到文件、在Windows窗口中显示位图、新建位图等功能。 各功能的调用函数分别如下: 3、保存位图 Save2File( LPCSTR lpstrPathName ); 参数解释: LPCSTR lpstrPathName: 位图文件的路径
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 可实现从文件读入位图数据、保存位图到文件、在Windows窗口中显示位图、新建位图等功能。 各功能的调用函数分别如下: 4、显示位图 Draw2DC( HDC hDC,int x,int y ); 参数解释: HDC hDC:显示位图窗口的DC,即 OnDraw( CDC *pDC) 中 pDC的Handle值( pDC->m_hDC ) Int x:位图在DC中的起点X(设备坐标值)左为0 Int y:位图在DC中的起点Y(设备坐标值)上为0
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 可实现从文件读入位图数据、保存位图到文件、在Windows窗口中显示位图、新建位图等功能。 各功能的调用函数分别如下: 5、 修改位图的位颜色 设对象定义位:CBmpFile bmpFile; a)灰度影像 bmpFile[行号][列号]= 新灰度 b)彩色影像 bmpFile.m_pImgDat[(行号×m_Cols+列号)×3+0]=新R bmpFile.m_pImgDat[(行号×m_Cols+列号)×3+0]=新G bmpFile.m_pImgDat[(行号×m_Cols+列号)×3+0]=新B
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 应用方法: 1、在 CXXDocument 定义中加入
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 应用方法: 2、在 CXXDocument.cpp 中加入
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 应用方法: 3、在 CXXView.cpp 中加入
一、数字图像基本概念 7、位图的使用 - CBmpFile类 CBmpFile 应用方法: 4、在 CXXView.cpp 中加入
一、数字图像基本概念 7、位图的使用 - CBmpFile类 特别注意: CBmpFile 定义的位图不能直接通过修改属性 m_Cols,m_Rows,m_pixelBytes来修改位图的大小。 如果要修改位图大小,需要重新定义的一个 CBmpFile ,使用 CreateBmp 来创建新位图信息 最后可以使用 “=”的方式将新位图赋值到原位图。 或者直接使用 CreateBmp 来修改,注意使用 CreateBmp 的时候,原始的数据就清空了。
二、实习内容 • 1、必做部分 • 1)将RAW格式图像转换成BMP格式图像 • 2)图像点运算:灰度线性变换 • 3)图像局部处理:高通滤波和低通滤波 • 2、选做部分(必选一) • 1)图像几何变换:缩放、平移、旋转、转置 • 2)图像边缘提取:中值滤波、边缘检测 • 3)影像融合 • 4)基于灰度模板匹配 • 5)基于轮廓特征匹配
三、VC 数字图像处理编程 • 1、VC编程基本知识 • 1)用MFC AppWizard创建以“学号姓名”命名 • 的项目: • 选择Multiple Docunment; • 选择视图类基类CScrollView; • 2)仔细阅读DIBLOOK文件夹中DIBAPI.CPP, • DIBVIEW.CPP,DIBDOC.CPP,将DIBAPI.CPP、 • DIBAPI.H文件加到新建项目中,并改写视 • 图类、文档类,以能显示位图。 • 3)添加菜单命令并建立菜单命令处理函数 • 4)编写功能函数
三、 VC 数字图像处理编程 • 2、 RAW格式转换成BMP格式 • 1)新建位图; • CDib * pDb=new CDib(); • 2)建立位图文件头结构体,为各成员赋值; • pDb->bitmapFileHeader.bfType=0x4d42; • 3)建立位图信息头结构体,为各成员赋值; pDb->m_pBitmapInfoHeader->biHeight=Height; 4)建立颜色表,并赋值 pDb->m_pBitmapInfo->bmiColors[i].rgbBlue=i; 5)将RAW数据区像素值存储到位图数据区
三、 VC 数字图像处理编程 • 2、 RAW格式转换成BMP格式 • for(i=0;i<Height;i++) • { • pRawEnd=pRawEnd-Width; • pPixel=pRawEnd; • for(j=0;j<Width;j++) • { • (*pData)=(*pPixel); • pPixel++; pData++; } • for(k=Width;k<LineBytes;k++) • { • (*pData)=0; • pData++; }幻灯片 31 • }
三、 VC 数字图像处理编程 • 3、图像点运算:灰度线性变换 • 对数据区每个像素值进行线性运算 pData[Height*i+j]=(A*pData[Height*i+j] +B);
三、 VC 数字图像处理编程 • 4、图像局部处理:高通滤波和低通滤波 • 图像局部处理是灰度卷积运算 • for(i=TempCenY;i<(Height-TempHeight+TempCenY+1);i++) • { • for(j=TempCenX;j<(Width-TempWidth+TempCenX+1);j++) • { • pDst=pData+(Height-i-1)*LineBytes+j; • for(k=0;k<TempHeight;k++) • { • for(l=0;l<TempWidth;l++) • { • pSrc=(pDb->m_pData)+(Height-i+(TempCenY-k)- • 1)*LineBytes+(j-(TempCenX-l)); • Result=Result+(*pSrc)*TempSuzu[k*TempWidth+l]; • } } } }
四、成果形式与评分标准 • 1、程序设计(50%); • 2、实习报告(30%); • 3、平时考勤(20%)。