图像的灰度变换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学(数字图像处理)实验报告
实验名称:图像的灰度变换
专业:电子信息科学与技术姓名:
学号:成绩:
[实验目的]
1、理解并掌握灰度变换的基本原理和方法。
2、编程实现图像灰度变换。
3、分析不同的灰度变换方法对最终图像效果的影响。
[实验内容]
1、灰度的线性变换;
2、灰度的非线性变换;
3、图像的二值化;
4、图像的反色处理;
[实验原理]
图像的灰度变换 ( gray scale transformation, GST ) 处理是图像增强处理技术中一种非常基础、直接的空间域图像处理方法,也是图像数字化软件和图像显示软件的一个重要组成部分。
灰度变换是指根据某种目标条件按一定变换关系逐点改变原图像中每一个像素灰度值的方法。
目的是为了改善画质,使图像的显示效果更加清晰。
灰度变换有时又被称为图像的对比度增强或对比度拉伸。
从图像输入装置得到的图像数据, 以浓淡表示, 各个像素与某一灰度值相对应。
设原图像像素的灰度值 D=f(x,y),处理后图像像素的灰度值D′= g (x,y),则灰度增强可表示为:
g(x,y)=T[f(x,y)]
或 D ′= T (D)
要求 D 和 D′都在图像的灰度范围之内。
函数 T(D) 称为灰度变换函数,它描述了输入灰度值和输出灰度值之间的转换关系。
灰度变换主要针对独立的像素点进行处理,通过改变原始图像数据所占据的灰度范围而使图像在视觉上得到良好的改观,没有利用像素点之间的相互空间关系。
因此,灰度变换处理方法也叫做点运算法。
点运算可以按照预定的方式改变一幅图像的灰度直方图。
除了灰度级的改变是根据某种特定的灰度变换函数进行之外,点运算可以看做是“从像素到像素”的复制操作。
根据g(x,y)=T[f(x,y)] , 可以将灰度变换分为线性变换和非线性变换。
1、灰度的线性变换
若g(x,y)=T[f(x,y)]是一个线性或分段线性的单值函数,例如
g(x,y)=T[f(x,y)]=af(x,y)+b
则由它确定的灰度变换称为灰度线性变换,简称线性变换。
某图像的灰度范围相当窄,灰度值 D 仅在较小区间内,灰度直方图集中于一部分,所看到的图像模糊,好像没有灰度级似的,造成目标图像灰度值与背景灰度值相接近,人眼无法分辨检出。
若利用灰度变换函数进行线性变换,使图像的直方图分布于整个灰度部分,图像的对比度扩展了。
2 、灰度的非线性变换
某图像的像素集中于中间灰度部分,而其他部分的像素数很少。
可以压缩像素数少的部分,扩展像素数集中的部分。
如果只想很仔细地解析图像的某一部分,例如图像的高灰度部分时,只要进行增加高灰度部分的灰度级数的变换,压缩其他部分,就能得到增强高灰度部分的图像。
这种变化又称为图像的局部增强。
3 、二值化和反色处理
一幅图像包括目标物体、背景还有噪声,怎样从多值的数字图像中只取出目标物体,最常用的方法就是设定某一阈值T,用 T 将图像的数据分成两大部分:大于 T的像素群和小于 T 的像素群。
这是研究灰度变换最特殊的方法,称为图像的二值化 (binarization ) 。
二值化处理就是把图像 f(x,y)分成目标物体和背景两个领域。
二值化是数字图像处理中一项最基本的变换方法,通过非零取一、固定阈值、双固定阈值等不同的阈值化变换方法, 使一幅灰度图变成了黑白二值图像。
[实验步骤及主要代码]
1、线性变换
打开菜单编辑器,在主菜单中添加一菜单项,选中弹出式选项,修改菜单名称为“点运算”。
然后建立一下级菜单,给菜单一个ID号,修改caption为“灰度线性变换”,打开类向导,建立消息响应函数,实现图像灰度线性变换。
添加一个线性变换对话框用于输入斜率和截距。
调出资源视图窗口,添加ID为IDD_DIALOG1的对话框资源,设计如图:
创建对话框类CDialogdl并按下表关联对应变量:
void CDLView::OnXianxing()
{
// TODO: Add your command handler code here float k,b;
CDialogdl mydlg;
if(mydlg.DoModal()==IDOK)
{
k=mydlg.m_k;
b=mydlg.m_b;
}
long w,h;
long i,j;
if(m_DibHead==NULL)
{
MessageBox("please open one image!");
return;
}
w=m_DibHead->biWidth;
h=m_DibHead->biHeight;
unsigned char *f=new unsigned char[w*h];
memset(f,0,w*h);
float temp(0);
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
temp=k*m_Image[i*w+j]+b;
if(temp<0)
temp=0;
if(temp>255)
temp=255;
f[i*w+j]=(unsigned char)(temp);
}
memcpy(m_Image,f,w*h);
Invalidate();
delete []f;
}
2、分段线性变换
同线性变换一样建立相应的菜单并建立类向导。
添加一个线性变换对话框用于输入分段点(x1,y1)、(x2,y2)。
调出资源视图窗口,添加ID为IDD_DIALOG3的对话框资源,设计如图:
创建对话框类CDialogdl并按下表关联对应变量:
void CDLView::OnFenduan()
{
int x1, y1,x2, y2;
CDialog_fdxx mydlg;
if(mydlg.DoModal()==IDOK)
{
x1=mydlg.m_x1;
y1=mydlg.m_y1;
x2=mydlg.m_x2;
y2=mydlg.m_y2;
}
long w,h;
long i,j;
if(m_DibHead==NULL)
{
MessageBox("please open one image!");
return;
}
w=m_DibHead->biWidth;
h=m_DibHead->biHeight;
unsigned char *f=new unsigned char[w*h];
memset(f,0,w*h);
float temp(0);
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
if(m_Image[i*w+j]<x1)
{
temp=y1/x1*m_Image[i*w+j];
}
else if(m_Image[i*w+j]<=x2&&m_Image[i*w+j]>=x1)
{
temp=(y2-y1)/(x2-x1)*(m_Image[i*w+j]-x1)+y1;
}
else
{
temp=(255-y2)/(255-x2)*(m_Image[i*w+j]-x2)+y2;
}
f[i*w+j]=(unsigned char)(temp);
}
memcpy(m_Image,f,w*h);
Invalidate();
delete []f;
}
3、幂次变换
同上步骤处理,添加如下代码:
void CDLView::OnMici()
{
// TODO: Add your command handler code here
long w,h;
long i,j;
if(m_DibHead==NULL)
{
MessageBox("please open one image!");
return;
}
w=m_DibHead->biWidth;
h=m_DibHead->biHeight;
unsigned char *f=new unsigned char[w*h];
memset(f,0,w*h);
float c=2;
int r=3;
double temp(0);
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
temp=c*pow(m_Image[i*w+j],r);
if(temp<0)
temp=0;
if(temp>255)
temp=255;
f[i*w+j]=(unsigned char)(temp);
}
memcpy(m_Image,f,w*h);
Invalidate();
delete []f;
}
4、对数变换
void CDLView::OnDuishu()
{
long w,h;
long i,j;
if(m_DibHead==NULL)
{
MessageBox("please open one image!");
return;
}
w=m_DibHead->biWidth;
h=m_DibHead->biHeight;
unsigned char *f=new unsigned char[w*h]; memset(f,0,w*h);
double c=100;
double temp(0);
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
temp=c*log10(m_Image[i*w+j]+1);
if(temp<0)
temp=0;
if(temp>255)
temp=255;
f[i*w+j]=(unsigned char)(temp);
}
memcpy(m_Image,f,w*h);
Invalidate();
delete []f;
}
5、二值化
void CDLView::OnYuzhi()
{
// TODO: Add your command handler code here int T;
CDialog_YUZHI mydlg;
if(mydlg.DoModal()==IDOK)
{
T=mydlg.m_T;
}
long w,h;
long i,j;
if(m_DibHead==NULL)
{
MessageBox("please open one image!");
return;
}
w=m_DibHead->biWidth;
h=m_DibHead->biHeight;
unsigned char *f=new unsigned char[w*h];
memset(f,0,w*h);
float temp(0);
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
if(m_Image[i*w+j]>=T)
{
temp=255;
}
else
temp=0;
f[i*w+j]=(unsigned char)(temp);
}
memcpy(m_Image,f,w*h);
Invalidate();
delete []f;
}
6、反色
void CDLView::OnFanse()
{
// TODO: Add your command handler code here
long w,h;
long i,j;
w=m_DibHead->biWidth;
h=m_DibHead->biHeight;
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
m_Image[i*w+j]=255-m_Image[i*w+j];
}
Invalidate();
}
[实验结果]
1、灰度的线性变换;
变换前变换后2、灰度的非线性变换;(对数变换)
变换前变换后
3、图像的二值化;阈值50;
变换前变换后
4、图像的反色处理;
变换前变换后
[实验总结]
图像的灰度变换处理是图像增强处理技术中一种非常基础、直接的空间域图像处理方法,也是图像数字化软件和图像显示软件的一个重要组成部分。
灰度变换是指根据某种目标条件按一定变换关系逐点
改变原图像中每一个像素灰度值的方法。
目的是为了改善画质,使图像的显示效果更加清晰。
灰度变换有时又被称为图像的对比度增强或对比度拉伸。