数字图像处理课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河南理工大学测绘与国土信息工程学院《数字图像处理》
课程设计报告
( 2018 - 2019 学年第 2 学期)
班级:
学号:
姓名:
指导教师:
评语:
成绩:
批阅签字:
批阅日期:年月日
课程设计项目:灰度图像对比度增强
一、课程设计项目说明
在图像处理中,点运算是一种简单而又很重要的技术。对于一幅输入图像,经过点运算将产生一幅输出图像,输出图像上每个像素的灰度值仅由相应输入原像素的值决定。对比度增强,对比度拉伸或灰度变换都属于点运算。点运算是图像数字化软件和图像显示软件的重要组成部分。
熟悉图像增强点运算方法,编程实现图像对比度增强算法,掌握灰度图像基本处理
技术。
我们在此选取属于点运算的灰度变换来对图像进行对比度增强处理:灰度变换可使
图像动态范围增大,图像对比度扩展,图像变清晰,特征明显,是图像增强的重要手段
之一。
1.线性变换
若原图像f(i,j)的灰度范围为[a,b],线性变换后图像g(i,j)的范围为[a′,b′],则g(i,j)与f(i,j)之间的关系式可以用下式来表示:
(f(i,j)−a)①
g(i,j)=a′+b′−a′
b−a
当b−a
当b−a>b′−a′时,图像亮度范围缩小,图像被压缩;
2.对数变换
对数变换的一般表达式为:
g(i,j)=a+ln[f(i,j)+1]
②
b∙lnc
这里a,b,c是为了调整曲线的位置和形状而引入的参数。当希望对图像的低灰度区进
行较大的拉伸而对高灰度区压缩时,可以采用这种变换,它能够使图像灰度分布与人的
视觉特性相匹配。并且当c越大时,压缩程度越大。
二、算法实现的主要内容
//线性灰度变换
void CLiView::OnBinary1()
{ //获取文档指针
CLiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//确保有BMP图像打开,否则弹出"Error!"对话框
if(pDoc->m_pDib == NULL)
{AfxMessageBox("Error!");
return;}
//开始进行图像的灰度变换处理
lxk:Cxxbh dlginputxxbh;//定义线性变换对话框类对象
dlginputxxbh.DoModal();//弹出对话框
UpdateData(TRUE);//将编辑框内的值赋给对应成员函数
if (dlginputxxbh.m_u {AfxMessageBox("Error!\n请勿颠倒上下限!"); goto lxk;}/*当操作者所给上限小于下限时弹出错误提示对话框,关闭该对话框后,系统自动 将编辑框内数据清零,此时可重新输入数据*/ int mcols = pDoc->m_pDib->m_nCols,jcols; int mrows = pDoc->m_pDib->m_nRows,irows; unsigned char* m_pData=NULL; m_pData = pDoc->m_pDib->pImgData; unsigned char* m_pDataOldPos = m_pData; for(irows = 0; irows < mrows; irows++) { for(jcols = 0; jcols < mcols; jcols++) { m_pData += irows * mcols + jcols;//计算当前位图数据位置 *m_pData = dlginputxxbh.m_d+(dlginputxxbh.m_u- dlginputxxbh.m_d)**m_pData/255;/*根据式①计算灰度变换后灰度值并替换当前灰度值*/ m_pData = m_pDataOldPos;//重置m_pData}} pDoc->UpdateAllViews(NULL);//刷新视图 } //对数变换 void CLiView::OnBinary()2 {//获取文档指针 CLiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); //确保有BMP图像打开,否则弹出"Error!"对话框 if(pDoc->m_pDib == NULL) {AfxMessageBox("Error!"); return;} //开始进行图像的对数变换处理 Cdsbh dlginputds;//定义对数变换对话框类对象 dlginputds.DoModal();//弹出对话框 UpdateData(TRUE); //将编辑框内的值赋给对应成员函数 int mcols = pDoc->m_pDib->m_nCols,jcols; int mrows = pDoc->m_pDib->m_nRows,irows; unsigned char* m_pData=NULL; m_pData = pDoc->m_pDib->pImgData; unsigned char* m_pDataOldPos = m_pData; for(irows = 0; irows < mrows; irows++) { for(jcols = 0; jcols < mcols; jcols++) { m_pData += irows * mcols + jcols; *m_pData = (log10(*m_pData+1))/( dlginputds.b*log10(dlginputds.c))+ dlginputds.a; /*根据式②计算灰度变换后灰度值并替换当前灰度值*/ //在此取a=2,b=1,c=0.233作为实验结果 m_pData = m_pDataOldPos; //重置m_pData}} pDoc->UpdateAllViews(NULL); //刷新视图 }