数字图像处理实验3_v2

  • 格式:doc
  • 大小:584.00 KB
  • 文档页数:8

任课教师:马文娟《数字图像分析与艺术化处理》(2012-2013学年第2学期)实验报告学号:2011329700132姓名:班级:数字媒体与技术11(1)实验三 图像分割实验实验项目名称:图像分割实验 实验项目性质:设计性实验所属课程名称:数字图像分析与艺术化处理 实验计划学时:2 一. 实验目的(1) 进一步理解图像的阈值分割方法和边缘检测方法的原理。

(2) 掌握图像基本全局阈值方法的原理并编程实现。

(3) 掌握梯度法检测边缘的原理并编程实现。

二. 实验内容和要求在实验一的工程中实现图像二值化和梯度法检测边缘。

三. 实验主要仪器设备和材料计算机,VS2012四. 实验原理1、图像的二值化的基本原理图像的二值化处理图像分割中的一个主要内容,就是将图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。

用I 表示原图,R 表示二值化后的图,则二值化的过程可以用以下公式表示:{thrj i I if elsej i R >=),((2550),( thr 表示选取的阈值。

二值化的过程就是当原图的像素灰度值大于阈值就将其变白,否则就将其变黑。

即将256个亮度等级的灰度图像通过适当的阀值选取而将图像变为二个级别灰度级,这样只有二个灰度级的图像在图像处理分析过程中占有非常重要的地位,特别是在实用的图像处理中。

如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阈值法就可以得到比较好的分割效果。

如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阈值选取技术来分割该图像。

动态调节阈值实现图像的二值化可动态观察其分割图像的具体结果。

根据对全图使用统一阈值还是对不同区域使用不同阈值,可以分为全局阈值方法(global thresholding)和局部阈值方法(local thresholding ,也叫做自适应阈值方法adaptive thresholding);这种与坐标相关的阈值也叫动态阈值,具体的方法,可以参考相关的图像处理书籍。

本实验采用基本全局阈值方法,即在整个图像中所有的象素点,其阈值thr 相同,具体步骤为:(1)选取一个初始估计值T ;(2)用T 分割图像。

这样便会生成两组像素集合:G1由所有灰度值大于T 的像素组成,而G2由所有灰度值小于或等于T 的像素组成。

(3)对G1和G2中所有像素计算平均灰度值u1和u2。

(4)计算新的阈值:T=(u1 + u2)/2。

(5)重复步骤(2)到(4),直到得到的T 值之差小于一个事先定义的参数T 0。

2、梯度法边缘检测物体的边缘以局部特征不连续性出现,也就是图像局部亮度变化最显著的部分,如,灰度,颜色,纹理结构的突变。

物体边缘是区分不同区域的分界处。

与边缘锐化类似,常常采用一阶或二阶微分算子实现边缘检测。

一阶微分是通过梯度法来实现的。

对于图像f(i,j),它在点(i,j)处的梯度是一个矢量,定义为:1222[(,)][()()]f f G f i j i j∂∂=+∂∂利用差分法近似上述公式,得到:[][]1222[(,)](,)(1,)(,)(,1)G f i j f i j f i j f i j f i j =--+--为了便于编程和提高运算,可进一步简化为:[(,)](,)(1,)(,)(,1)G f i j f i j f i j f i j f i j =--+--利用差分运算时,图像的第一行和第一列的像素的梯度无法求得,一般用后一行或后一列的梯度值近似代替。

微分运算可以增强图像高频分量(边缘等细节),为了检测到清晰的边缘,需设定阈值对运算结果进行处理。

公式为:255,[(,)](,)0,G f i j TG i j ≥⎧=⎨⎩其他五. 实验设计步骤2、图像的阈值分割步骤一、打开实验一建立的工程空间。

步骤二、按照实验一介绍的方法建立在“图像操作”菜单栏中新建菜单项“二值化(阈值分割)”。

步骤三、按照实验一介绍的方法建立菜单项“二值化”的响应函数OnBinary ()。

步骤四、打开响应函数OnBinary (),添加代码。

步骤五、点击(!),编译运行,打开一幅24位或8位bmp 图,然后再单击“二值化”,观察效果。

2、梯度法检测边缘步骤一、按照实验一中的方法在“图像操作”菜单栏中新建“边缘检测(梯度法)”菜单项。

步骤二、添加“边缘检测”的响应函数。

步骤三、在响应函数中添加实现图像检测的功能代码。

(1) 获得原图像的首地址及图像的高和宽; (2) 开辟一块内存缓冲区,并初始化为255;(3) 计算图像的像素的梯度,将结果保存在内存缓冲区;(4) 比较像素的梯度是否大于30(阈值可以调整),是则将像素值置为255,否则,将像素值置为0; (5) 将内存中的数据复制到图像数据区。

步骤四、调试运行。

六. 实验代码void CDIB::ErZhiHua() { int nw = this->GetDIBWidth(); int nh = this->GetDIBHeight(); int i,j;// 定义阈值并赋值为100;int thr=100;if(this->GetNumberOfColors() == 8){for(j = 0; j < nh; j++)for(i = 0; i < nw; i++){if(this->m_pDIBData[j * nw + i] > thr)this->m_pDIBData[j * nw + i] = 255;elsethis->m_pDIBData[j * nw + i] = 0;}}else{for(j = 0; j < nh; j++)for(i = 0; i < nw; i++){if(this->m_pdata[j * nw + i] > thr)this->m_pdata[j * nw + i] = 255;elsethis->m_pdata[j * nw + i] = 0;}this->UpdateData();}}void CDIB::BianYuan(){BYTE *p_data; //原图数据区指针int wide,height; //原图长、宽if(this->GetNumberOfColors() == 8)p_data = this->m_pDIBData;//取得原图的数据区指针else p_data = this->m_pdata;wide = this->GetDIBWidth();height = this->GetDIBHeight();LPBYTE p_temp = new BYTE [wide*height]; //开辟图像一缓冲区memset(p_temp, 255, wide*height); //初始化为255int temp;for(int j = 1; j < height - 1; j++)for(int i = 1; i < wide - 1; i++){ //根据双向一次微分公式计算当前像素的灰度值temp = sqrt((float)(p_data[wide*j+i]-p_data[wide*j+(i-1)])*(p_data[wide*j+i]-p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i])*(p_data[wide*j+i]-p_data[wide*(j-1)+i]));if (temp>=30){p_temp[wide*j+i]=255;}if (temp<30){p_temp[wide*j+i]=0;}}if(this->GetNumberOfColors() == 8){memcpy(this->m_pDIBData,p_temp,wide*height);}else if(this->GetNumberOfColors() == 24){int lenght = 3 * wide;while(lenght % 4 != 0) lenght++;lenght = lenght - 3 * wide;for(int j = 0; j < height; j++)for(int i = 0; i < wide; i++){m_pDIBData[j * (3 * wide + lenght) + i * 3 + 0] = p_temp[wide*j+i];m_pDIBData[j * (3 * wide + lenght) + i * 3 + 1] = p_temp[wide*j+i];m_pDIBData[j * (3 * wide + lenght) + i * 3 + 2] = p_temp[wide*j+i];m_pdata[j * wide + i] = p_temp[wide*j+i];}}delete p_temp;}七.实验结果八.实验心得:。