数字图像处理技术课程设计指导书修改Word文档下载推荐.docx
- 文档编号:19277485
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:21
- 大小:602.01KB
数字图像处理技术课程设计指导书修改Word文档下载推荐.docx
《数字图像处理技术课程设计指导书修改Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字图像处理技术课程设计指导书修改Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
LONG
biWidth;
LONG
biHeight;
biPlanes;
biBitCount
biCompression;
biSizeImage;
biXPelsPerMeter;
biYPelsPerMeter;
biClrUsed;
biClrImportant;
}BITMAPINFOHEADER;
下表是对结构体当中各个成员的说明:
表1-2文件信息头结构说明
说明:
*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量。
(1)对于每个像素的字节数,分别有以下意义:
0,用在JPEG格式中。
1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片。
4,16色图。
8,256色图,通常说的灰度图。
16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量。
24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量。
32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式。
(2)这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色树木小于制定的颜色深度的颜色数目的最大值。
(3)这个值通常为0,表示所有的颜色都是必需的。
2.颜色表
颜色表一般是针对16位以下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。
而对于16位一下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。
颜色表的作用就是创建调色板。
下图是带调色板和不带调色板的位图的简单示意图
图1-1带调色板的位图和不带调色板的位图之间的区别
颜色表是由颜色表项组成的,颜色表项结构的定义如下:
typedefstructtagRGBQUAD{//rgbq
BYTE
rgbBlue;
rgbGreen;
rgbRed;
rgbReserved;
}RGBQUAD;
其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。
1.1.3位图数据
最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:
位图数据。
根据不同的位图,位图数据所占据的字节数也是不同的,比如,对于8位位图,每个字节代表了一个像素,对于16位位图,每两个字节代表了一个像素,对于24位位图,每三个字节代表了一个像素,对于32位位图,每四个字节代表了一个像素。
1.2位图文件读写
认识了位图文件的结构以后,对特定位图文件进行读写操作就显得简单了。
下面介绍一个能够方便进行位图读写操作的C++类。
给出该类的使用参考,对于实现代码中的关键部分做出讲解。
1.2.1类的声明
classCFG_DIB:
publicCObject
{
public:
//默认构造函数
CFG_DIB();
//构造函数,根据图象宽和高,以及记录每个象素所需字节数来初始化
CFG_DIB(intwidth,intheight,intnBitCounts);
virtual~CFG_DIB();
HBITMAPm_hBitmap;
LPBYTEm_lpDIBits;
//DIB位的起始位置
LPBITMAPINFOHEADERm_lpBMPHdr;
//BITMAPINFOHEADER信息
LPVOIDm_lpvColorTable;
//颜色表信息
HPALETTEm_hPalette;
//条调色板
private:
DWORDm_dwImageSize;
//非BITMAPINFOHEADER或BITMAPFILEHEADER的位
intm_nColorEntries;
//颜色表项的个数
//显示参数
CPointm_Dest;
//目的矩形域的左上角坐标
CSizem_DestSize;
//显示矩形的宽度和高度
CPointm_Src;
//原矩形左下角坐标
CSizem_SrcSize;
//原矩形宽度和高度
voidInitDestroy();
//初始化变量
voidComputePaletteSize(intnBitCounts);
//计算调色板大小
voidComputeImage();
//计算图象大小
//从BMP文件中读入DIB信息
BOOLReadFile(CFile*pFile);
//从BMP文件中读入DIB信息,与ReadFile不同的是使用CreateSection创建位图位
BOOLReadSection(CFile*pFile,CDC*pDC=NULL);
//将DIB写入文件,保存成BMP图片格式
BOOLWriteFile(CFile*pFile);
//创建新的位图文件,根据参数width,height,nBitCounts分配内存空间
BOOLNewFile(intwidth,intheight,intnBitCounts);
//关闭位图文件
BOOLCloseFile();
//显示位图
BOOLDisplay(CDC*pDC);
HBITMAPCreateBitmap(CDC*pDC);
//用DIB创建DDB
HBITMAPCreateSection(CDC*pDC=NULL);
//创建位图位数据,即象素数据
//如果DIB没有颜色表,可以用逻辑调色板
BOOLSetLogPalette(CDC*pDC);
//如果DIB有颜色表,可以创建系统调色板
BOOLSetWinPalette();
//把DIB对象的逻辑调色板选进设备环境里,然后实现调色板
UINTUseLogPalette(CDC*pDC);
//得到BitmapInfoHeader的大小,包含颜色表数据
intGetHeaderSize()
{
returnsizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*m_nColorEntries;
}
//得到图像的高度
intGetHeight()
if(m_lpBMPHdr==NULL)return0;
returnm_lpBMPHdr->
biHeight;
//得到图像的宽度
intGetWidth()
//得到图像的大小
intGetImageSize()
returnm_dwImageSize;
longGetLineBit();
//得到一行的象素数
};
1.2.2位图的读取
CFG_DIB提供了两个从位图文件读取位图数据的方法:
ReadFile和ReadSection,二者不同之处,前者使用动态分配内存的方法初始化存储位位图数据的指针,后者则使用API函数,根据位图信息初始化存储位图数据的指针。
方法1
m_lpDIBits=(LPBYTE)newchar[m_dwImageSize];
方法2
m_hBitmap=:
:
CreateDIBSection(pDC->
GetSafeHdc(),
(LPBITMAPINFO)m_lpBMPHdr,DIB_RGB_COLORS,
(LPVOID*)&
m_lpDIBits,NULL,0);
1.2.3位图读取过程中的调色板的创建和调用
对读取位图的过程中需要调用的对调色板进行操作的相关函数进行说明。
读取文件的过程中,计算出调色板大小,然后调用创建调色板函数:
ComputePaletteSize(m_lpBMPHdr->
biBitCount);
SetWinPalette();
在显示位图之前,设置调色板:
if(m_hPalette!
=NULL){
:
SelectPalette(pDC->
GetSafeHdc(),m_hPalette,TRUE);
}
1.2.4位图的显示。
位图的显示还是调用Windows的API函数来进行,需要传递的参数包括当前位图信息头,位图数据等:
StretchDIBits(pDC->
GetSafeHdc(),m_Dest.x,m_Dest.y,
m_DestSize.cx,m_DestSize.cy,
m_Src.x,m_Src.y,
m_SrcSize.cx,m_SrcSize.cy,
m_lpDIBits,(LPBITMAPINFO)m_lpBMPHdr,
DIB_RGB_COLORS,SRCCOPY);
其中的m_Dest,m_DestSize,m_Src,m_SrcSize分别代表了图像在当前设备上显示的左上角坐标和范围以及需要显示的源图像的左下角坐标和范围。
此处需要说明的是,位图数据的字节数组是从图像的最下面一行开始逐行想上存储的,所以在选取源位图的现实范围的时候需要特别注意!
m_Dest,m_DestSize,m_Src,m_SrcSize需要在现实之前设置好。
1.2.5其它问题
1.位图的存储。
位图的存储用WriteFile实现。
2.新位图的创建。
新位图的创建由NewFile实现。
需要的参数是位图的宽度、高度、以及位图像素占用的位数。
3.其它问题。
存取位图数据的字节数组有个问题需要引起开发人员的注意:
字节数组中每个扫描行的字节数必需是4的倍数,如果不足要用0补齐。
以下是处理的办法:
DWORDdwBytes=((DWORD)m_lpBMPHdr->
biWidth*m_lpBMPHdr->
biBitCount)/32;
if(((DWORD)m_lpBMPHdr->
biBitCount)%32){
dwBytes++;
dwBytes*=4;
m_dwImageSize=dwBytes*m_lpBMPHdr->
这段代码按照要求算出了用于记录图像数据的字节数组的大小。
1.3CFG_DIB的使用
以下是CFG_DIB的使用示例代码。
#include"
fg_dib.h"
CFG_DIBm_fgdib;
//newfile
m_fgdib.NewFile(width,height,nbitnum);
//openfile
CFile*pf;
pf=newCFile;
pf->
Open(sFileName,CFile:
modeRead);
m_fgdib.ReadFile(pf);
Close();
deletepf;
//drawBMP
m_fgdib.m_Dest.x=0;
m_fgdib.m_Dest.y=0;
m_fgdib.m_DestSize.cx=m_fgdib.GetWidth();
m_fgdib.m_DestSize.cy=m_fgdib.GetHeight();
m_fgdib.m_Src.x=0;
m_fgdib.m_Src.y=0;
m_fgdib.m_SrcSize.cx=m_fgdib.GetWidth();
m_fgdib.m_SrcSize.cy=m_fgdib.GetHeight();
CDC*pDC=GetDC();
m_fgdib.Display(pDC);
//closeBMP
m_fgdib.CloseFile();
二选题一图像的点运算
实现图像的几种常用点运算,包括:
灰度的线性变换、灰度的域值变换、灰度的窗口变换、灰度拉伸和灰度均衡。
2.1灰度的线性变换
灰度的线性变换用到的线性灰度变换函数f(x)是一个一维线性函数:
灰度变换方程为:
式中参数
为线性函数的斜率,
为线性函数的在y轴的截距,DA表示输入图像的灰度,
表示输出图像的灰度。
当
>
1时,输出图像的对比度将增大;
<
1时,输出图像的对比度将减少;
=1且
0时,操作仅使所有像素的灰度值上移或下移,其效果是使整个图像更暗或更亮;
如果
0,暗区域将变亮,亮区域将变暗,点运算完成了图像求补运算。
算法参考界面。
图2-1灰度的线性变换参考界面
2.2灰度的域值变换
灰度的域值变换的操作过程是先由用户指定一个域值,如果图像中某个像素的灰度值小于该域值,则将该像素的灰度值设置为0,否则灰度值设置为255。
灰度的域值变换可以将一幅灰度图像转换成黑白二值图像。
算法参考界面:
图2-2灰度的域值变换参考界面
2.3灰度的窗口变换
灰度的窗口变换限定一个窗口范围,该窗口中的灰度值保持不变;
小于该窗口下限的灰度值直接设置为0;
大于该窗口上限的灰度值直接设置为255。
灰度的窗口变换函数表达式如下:
式中L表示窗口的下限,U表示窗口的上限。
图2-3灰度的窗口变换参考界面
2.4灰度拉伸
灰度拉伸和灰度的线性变换有点类似,都用到了灰度的线性变换。
但不同之处在于灰度拉伸不是完全的线性变换,而是分段线性变换。
灰度拉伸可以有选择的拉伸某段灰度区间以改善输出图像。
如果一幅图像灰度几种在较暗的区域而导致图像偏暗,可以用灰度拉伸功能来拉伸(斜率>
1)物体灰度区间以改善图像:
同样如果图像灰度几种在较量的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率<
1)物体灰度区间以改善图像质量。
图2-4灰度拉伸参考界面
2.3灰度均衡
灰度均衡有时也称为直方图均衡,目的是通过点运算使输入图像转换为在每一灰度级上都有相同的像素点数的输出图像(即输出的直方图是平的)。
这对于在进行图像比较或分割之前将图像转换位一致的格式是十分有益的。
直方图均衡化处理的计算步骤
1统计原始图象的直方图rk是归一化的输入图象灰度级;
2计算直方图累积分布曲线;
3用累积分布函数作变换函数进行图像灰度变换。
根据计算得到的累积分布函数,建立输入图象与输出图象灰度级之间的对应关系,并将变换后灰度级恢复成原先数范围。
例:
表2-164×
64大小的图像灰度分布表
图2-5直方图均衡化处理
处理过程如下:
由变换函数
依此类推:
s4=0.89,s5=0.95,s6=0.98,s7=1.0。
变换函数如图2-5所示。
这里只对图像取8个等间隔的灰度级,变换后的值也只能选择最靠近的一个灰度级的值。
因此,对上述计算值加以修正:
因为r0->
s0,r1->
s1,r2->
s2,r3->
s3,r4->
s4,r5->
s5,r6->
s6,r7->
s7所以灰度级对应为r0->
1/7,r1->
3/7,r2->
5/7,r3->
6/7,r4->
6/7,r5->
1,r6->
1,r7->
1可得到新的直方图。
三选题二图像的几何变换
实现图像的几种常用几何变换算法,包括:
图像的平移、图像的镜像变换、图像的转置、图像的缩放和图像的旋转。
3.1图像的平移
图像平移是图像操作中的一项基本功能,它是将图像沿x轴或者y轴方向移动一定距离的操作。
平移算法很简单,只要找到新图像的点在图像中的对应位置,然后把信息保存就可以了。
平移变换可以用矩阵形式表示如下:
式中(x*,y*)为平移后的坐标,(x,y)为平移前的坐标。
Tx和Ty分别为X方向和Y方向的平移量。
平移后有可能某些点不在原图中,可以直接将它的像素值统一设置为0或者255(对于灰度图就是黑色或者白色)。
同样,若有点不再原图中,也就说明原图中有点被移出显示区域。
算法的参考界面和效果如下所示:
图3-1图像平移的参考界面和效果图
3.2图像的镜像变换
图像的镜像变换分为两种:
水平镜像,另外一种是垂直镜像(或称为图像颠倒)。
图像垂直镜像是指把定义好的图像区域上下翻转地显示在屏幕上。
分析图像垂直镜像的过程,可发现每行的图像信息都保持不变,而只是改变了行的顺序,将第一行与最后的第n行相互交换,第二行与第n
-
1行交换……,依此类推,从而实现了图像的垂直镜像。
只需采用按行交换的方式,即可方便地修改缓冲区内容,实现图像的垂直镜像。
基本步骤如下:
(1)将原图像读入缓冲区,并擦除原图像;
(2)计算图像的高度,即行数height;
计算图像宽度width;
根据宽度、高度生成新缓冲区;
(3)把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。
既原图中的(x、y)点,在新生成的图象中对应为x1=x,y1=height-1-y。
把原图中的象素值读入新缓冲区的(x1,y1)点处。
(4)把交换后的图像缓冲区内容重新显示在屏幕上。
图3-2图像垂直镜像效果图
水平镜像变换是指将指定区域的图像左右翻转地显示在屏幕。
分析水平镜像变换过程可以发现:
每行图像信息的处理方式是相同的,而且行顺序不发生变化,只是每一行的像素信息按从左到右的顺序进行了左右颠倒,从而实现了水平镜像变换。
因此,采用按行逐点变换的方式实现图像的镜像。
首先,对于左上角为(left,top),右下角为(right,bottom)矩形区域图像,给出其中任意点(x0,y0)镜像变换后的新坐标(x′,y′)的坐标变换公式:
x=right-x0+left
y′=y0
根据以上公式,对各个像素点计算新坐标后,直接把它显示在屏幕的相应位置上。
如果完全逐点地进行交换,处理一个像素点就要读取一次像素值,从而降低了变换速度。
由于像素点是顺序存放在各个bit位上,每读取一个字节就包含了8个像素点的信息,只需设置不同的位屏值bitmask,就可以获得不同像素点的信息。
因此采用按行逐字节变换的方式,每读一次就进行8个像素点的变换,以提高变换速度。
将一矩形区域的图像进行水平镜像变换的基本步骤如下:
(1)用getimage()把图像保存到内存缓冲区,并擦除原图像。
(2)计算图像高度,即行数高度height和宽度width;
计算保存一行图像信息占用的字节数linebytes。
计算公式如下:
height=bottom-top+1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 技术 课程设计 指导书 修改