数字图像处理课程设计.docx
- 文档编号:13322060
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:42
- 大小:854.55KB
数字图像处理课程设计.docx
《数字图像处理课程设计.docx》由会员分享,可在线阅读,更多相关《数字图像处理课程设计.docx(42页珍藏版)》请在冰点文库上搜索。
数字图像处理课程设计
《数字图像处理》课程设计
班级________计科11203班________
姓名_____张琳琳________
学号___1104685003_________
任课老师______李敏__________
课程设计任务书
一、任务要求
(1)实现图像处理的基本操作
学习使用matlab图像处理工具箱,利用imread()语句读入图像,例如image=imread(flower.jpg),对图像进行显示(如imshow(image))和保存。
学习使用Cimg类,调用类成员函数AttachFromFile加载位图,SaveToFile保存位图到文件。
(2)图像处理算法的实现与显示
1、图像点运算算法设计
a)灰度对数变换
b)分段线性变换
c)灰度域值变换
d)直方图均衡化
2、图像平滑算法的设计
a)高斯平滑
b)自适应平滑滤波
c)中值滤波
(3)设计图像处理软件界面
设计菜单式界面或设计按键式界面
二、进度安排
周次
日期
设计具体内容
18
7月5日
下载课程设计的安排和要求和图片
7月5日
完成实现图像处理的基本操作
7月6日
完成图像处理算法的实现与显示
7月6日
完成设计图像处理软件界面
7月7日
完成课程设计文档排版和打印
一、设计目的
运用MATLAB和C++实现图像的读取、显示和保存,综合运用MATLAB工具箱实现图像处理的GUI程序设计,利用MATLAB图像处理工具箱,设计和实现简易的图片处理界面。
二、设计方案
利用C++实现图像的读取、显示和保存,利用matlab的GUI程序设计一个简单实用的图像处理程序。
该程序应具备图像处理的常用功能,以满足用户的使用。
现设计程序有以下基本功能:
1)图像的读取和保存。
2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。
3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。
4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。
5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。
6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。
三、具体设计内容
3.1MATLAB实现读入、显示和保存图像
1.打开MATLAB软件
2.设定工作路径为:
D:
\作业
3.在命令栏输入:
A=imread('girl.bmp'),回车后看到命令窗口出现一系列数字矩阵。
4.在命令栏输入:
imshow(A),回车出现图像figure1如图3.1
5.建立一个M文件,编辑代码实现读取一幅灰度图像,并将256灰度级图像修改成n灰度级的图像,图像保存为包含颜色映射表的bmp图像。
代码:
%框架文件
%图像的读取
close all
clear all
clc
X=imread('f:
/picture/girl.bmp');
%图像的显示
imshow(X)
%图像的保存
imwrite(X,'f:
/picture/girl.png');
6.保存结果,关机。
图3.1
3.2C++实现读入、显示和保存图像
3.2.1构造CImg头文件
在C++中设计的类,需要把它塞进.h和.cpp文件里去,当然要考虑类的成员分布问题。
头文件(.h):
包括类的定义类的成员数据、类的成员函数的声明、内联函数的实现
源文件(.cpp):
类中成员函数的实现
#ifndef_IMG_H_
#define_IMG_H_
//在计算图像大小时,采用公式:
biSizeImage=biWidth'×biHeight。
//是biWidth',而不是biWidth,这里的biWidth'必须是4的整倍数,表示
//大于或等于biWidth的,离4最近的整倍数。
WIDTHBYTES就是用来计算biWidth'
#defineWIDTHBYTES(bits)(((bits)+31)/32*4)
classCImg
{
//构造、析构函数
public:
//构造函数
CImg();
//析构函数
virtual~CImg();
//成员变量
public:
//图像信息结构体指针
BITMAPINFOHEADER*m_pBMIH;
//图像数据指针
BYTE**m_lpData;
protected:
intm_nColorTableEntries;
LPVOIDm_lpvColorTable;
//成员函数
public:
//判断位图是否有效
BOOLIsValidate();
//从文件加载位图
BOOLAttachFromFile(char*filePath);
//将位图保存到文件
BOOLSaveToFile(char*filePath);
//在DC上绘制位图
BOOLDraw(CDC*pDC);
//设置像素的值
voidSetPixel(intx,inty,COLORREFcolor);
//获取像素的值
COLORREFGetPixel(intx,inty);
//获取灰度值
BYTEGetGray(intx,inty);
//获取行的像素数
intGetWidthPixel();
//获取列的像素数
intGetHeightPixel();
//获取一行的字节数
intGetWidthByte();
private:
//释放图像所占用的空间
voidCleanUp();
};
/**************************************************
inlineintCImg:
:
GetWidthPixel()
功能:
返回CImg实例中的图像每行的像素数
参数:
无
返回值:
int类型,返回图像每行的像素数
***************************************************/
inlineintCImg:
:
GetWidthPixel()
{
returnm_pBMIH->biWidth;
}
/**************************************************
inlineintCImg:
:
GetHeightPixel()
功能:
返回CImg实例中的图像每列的像素数
参数:
无
返回值:
int类型,返回图像每列的像素数目
***************************************************/
inlineintCImg:
:
GetHeightPixel()
{
returnm_pBMIH->biHeight;
}
/**************************************************
inlineintCImg:
:
GetWidthByte()
功能:
返回CImg实例中的图像每行占用的字节数
限制:
无
参数:
无
返回值:
int类型,返回图像每行占用的字节数
***************************************************/
inlineintCImg:
:
GetWidthByte()
{
returnWIDTHBYTES((m_pBMIH->biWidth)*m_pBMIH->biBitCount);
}
/**************************************************
inlineSetPixel(intx,inty,COLORREFcolor)
功能:
设置指定像素的颜色
参数:
intx
指定像素的横坐标
inty
指定像素的纵坐标
COLORREF
RGB颜色值
返回值:
无
***************************************************/
inlinevoidCImg:
:
SetPixel(intx,inty,COLORREFcolor)
{
if(m_pBMIH->biBitCount==24)//真彩色位图
{
m_lpData[m_pBMIH->biHeight-y-1][x*3]=GetBValue(color);
m_lpData[m_pBMIH->biHeight-y-1][x*3+1]=GetGValue(color);
m_lpData[m_pBMIH->biHeight-y-1][x*3+2]=GetRValue(color);
}
}
/**************************************************
inlineCOLORREFCImg:
:
GetPixel(intx,inty)
功能:
返回指定坐标位置像素的颜色值
参数:
intx
指定像素的横坐标
inty
制定像素的纵坐标
返回值:
COLERREF类型,返回用RGB形式表示的指定位置的颜色值
***************************************************/
inlineCOLORREFCImg:
:
GetPixel(intx,inty)
{
if(m_pBMIH->biBitCount==24)//真彩色位图
{
COLORREFcolor=RGB(m_lpData[m_pBMIH->biHeight-y-1][x*3+2],
m_lpData[m_pBMIH->biHeight-y-1][x*3+1],
m_lpData[m_pBMIH->biHeight-y-1][x*3]);
returncolor;
}
else
{
throw"notsupport!
";
return0;
}
}
/**************************************************
inlineBYTECImg:
:
GetGray(intx,inty)
功能:
返回指定坐标位置像素的灰度值
限制:
无
参数:
intx
指定像素的横坐标
inty
制定像素的纵坐标
返回值:
BYTE类型,返回给定像素的灰度值
***************************************************/
inlineBYTECImg:
:
GetGray(intx,inty)
{
COLORREFcolor=GetPixel(x,y);
BYTEr,g,b,byte;
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
doubledGray=(0.299*r+0.578*g+0.114*b);
byte=(int)dGray;
returnbyte;
}
#endif//_IMG_H_
(1)构造和析构函数
一个类,当然要有构造和析构函数了:
(2)数据成员
//构造函数
CImg();
//析构函数
virtual~CImg();
第一个数据成员自然是图像数据了,这里具体则是指向二维数组首地址的指针:
//图像数据指针
BYTE**m_lpData;
然后我们需要一些数据成员来保存图像的一些信息,比如宽度、高度、图像类型等等。
这里我们使用了MFC提供的结构体BITMAPINFOHEADER(对于它的全部成员,可以查看MSDN 详细介绍)。
在类中,我们也没有直接定义结构体,而是定义的指向此类结构体的指针:
//图像信息结构体指针
BITMAPINFOHEADER*m_pBMIH;
至于其他两个私有类型变量,m_nColorTableEntries表示颜色索引表中的颜色个数,而m_lpvColorTable指向了颜色索引表的地址。
但24位真彩色并不需要颜色索引表,这里保留它们是为了方便以后对非24位真彩色图像处理时的扩充。
(3)有效性判断
在对图像数据进行操作之前,首先要判断此图像是否有效:
//判断位图是否有效
BOOLIsValidate();
(4)读取/保存图像
我们在进行图像处理时,一般是针对保存在本地的图片进行的,所以必须要有读取/保存图像的功能:
//从文件加载位图
BOOLAttachFromFile(char*filePath);
//将位图保存到文件
BOOLSaveToFile(char*filePath);
3.2.2构造CImg源文件
将类放在.h和.cpp两个文件的好处之一,是可以提供不同层次的服务。
下面给出CImg.cpp的全部源代码:
#include"stdafx.h"
#include"Img.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/**************************************************
CImg:
:
CImg()
功能:
CImg类的构造函数
参数:
无
返回值:
无
***************************************************/
CImg:
:
CImg()
{
m_pBMIH=NULL;
m_lpData=NULL;
}
/**************************************************
CImg:
:
~CImg()
功能:
CImg类的析构函数
参数:
返回值:
***************************************************/
CImg:
:
~CImg()
{
CleanUp();
}
/**************************************************
voidCleanUp()
功能:
释放图像信息结构体的空间、释放图像数据占用的空间
相当于擦除图像数据
参数:
无
返回值:
无
***************************************************/
voidCImg:
:
CleanUp()
{
if(m_lpData!
=NULL)
{
for(inti;i
{
delete[]m_lpData[i];
}
delete[]m_lpData;
}
if(m_pBMIH!
=NULL)
{
delete[]m_pBMIH;
}
}
/**************************************************
BOOLCImg:
:
IsValidate()
功能:
判断位图是否有限
参数:
无
返回值:
BOOL类型,TRUE表示有效,FALSE表示无效
***************************************************/
BOOLCImg:
:
IsValidate()
{
returnm_pBMIH!
=NULL;
}
/**************************************************
BOOLAttachFromFile(char*filePath)
功能:
从文件中读取位图数据
参数:
char*filePath
文件路径
返回值:
BOOL类型,返回是否读取成功
***************************************************/
BOOLCImg:
:
AttachFromFile(char*filePath)
{
//使用CFile对象简化操作
CFilefile;
if(!
file.Open(filePath,CFile:
:
modeRead|CFile:
:
shareDenyWrite))
returnFALSE;
//文件数据
LPBYTE*lpData;
//位图信息头
BITMAPINFOHEADER*pBMIH;
//颜色表指针
LPVOIDlpvColorTable=NULL;
//颜色表颜色数目
intnColorTableEntries;
BITMAPFILEHEADERbmfHeader;
//读取文件头
if(!
file.Read(&bmfHeader,sizeof(bmfHeader)))
returnFALSE;
//检查开头两字节是否为BM
if(bmfHeader.bfType!
=MAKEWORD('B','M'))
{
returnFALSE;
}
//读取信息头
pBMIH=(BITMAPINFOHEADER*)newBYTE[bmfHeader.bfOffBits-sizeof(bmfHeader)];
if(!
file.Read(pBMIH,bmfHeader.bfOffBits-sizeof(bmfHeader)))
{
deletepBMIH;
returnFALSE;
}
//定位到颜色表
nColorTableEntries=
(bmfHeader.bfOffBits-sizeof(bmfHeader)-sizeof(BITMAPINFOHEADER))/sizeof(RGBQUAD);
if(nColorTableEntries>0)
{
lpvColorTable=pBMIH+1;
}
pBMIH->biHeight=abs(pBMIH->biHeight);
//读取图像数据,WIDTHBYTES宏用于生成每行字节数
intnWidthBytes=WIDTHBYTES((pBMIH->biWidth)*pBMIH->biBitCount);
//申请biHeight个长度为biWidthBytes的数组,用他们来保存位图数据
lpData=newLPBYTE[(pBMIH->biHeight)];
for(inti=0;i<(pBMIH->biHeight);i++)
{
lpData[i]=newBYTE[nWidthBytes];
file.Read(lpData[i],nWidthBytes);
}
//更新数据
CleanUp();
m_lpData=lpData;
m_pBMIH=pBMIH;
m_lpvColorTable=lpvColorTable;
m_nColorTableEntries=nColorTableEntries;
file.Close();
returnTRUE;
}
/**************************************************
BOOLSaveToFile(char*filePath)
功能:
将位图数据保存到文件中
参数:
char*filePath
文件路径
返回值:
BOOL类型,返回是否保存成功
***************************************************/
BOOLCImg:
:
SaveToFile(char*filePath)
{
if(!
IsValidate())
returnFALSE;
CFilefile;
if(!
file.Open(filePath,CFile:
:
modeRead|CFile:
:
modeWrite|CFile:
:
modeCreate))
{
returnFALSE;
}
//构建BITMAPFILEHEADER结构
BITMAPFILEHEADERbmfHeader={0};
intnWidthBytes=WIDTHBYTES((m_pBMIH->biWidth)*m_pBMIH->biBitCount);
bmfHeader.bfType=MAKEWORD('B','M');
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)+m_nColorTableEntries*4;
bmfHeader.bfSize=bmfHeader.bfOffBits+m_pBMIH->biHeight*nWidthBytes;
//向文件中写入数据
file.Write(&bmfHeader,sizeof(bmfHeader));
file.Write(m_pBMIH,sizeof(BITMAPINFOHEADER)+m_nColorTableEntries*4);
for(inti=0;i
{
file.Write(m_lpData[i],nWidthBytes);
}
file.Close();
returnTRUE;
}
/**************************************************
BOOLDraw(CDC*pDC)
功能:
在给定的设备上下文环境中绘制图像
参数:
CDC*pDC
指定的设备上下文环境指针
返回值:
BOOL类型,TRUE为成功,FALSE为失败
********************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 课程设计