自动阈值迭代法及Otsu法实验报告
常用阈值计算方法

常用阈值计算方法
阈值计算是图像处理中的一项重要任务,它可以将图像中的像素分为两类:背景和前景。
常用的阈值计算方法有以下几种:
1. Otsu算法
Otsu算法是一种自适应阈值计算方法,它可以根据图像的灰度分布自动计算出最佳阈值。
该算法的基本思想是:将图像分为两类,使得类内方差最小,类间方差最大。
具体实现过程是:首先计算出图像的灰度直方图,然后遍历所有可能的阈值,计算出每个阈值对应的类内方差和类间方差,最后选择使类间方差最大的阈值作为最佳阈值。
2. 均值法
均值法是一种简单的阈值计算方法,它将图像中所有像素的灰度值求平均,然后将平均值作为阈值。
该方法的缺点是对噪声比较敏感,容易产生误判。
3. 中值法
中值法是一种基于排序的阈值计算方法,它将图像中所有像素的灰度值排序,然后选择中间值作为阈值。
该方法的优点是对噪声不敏感,但是计算量较大。
4. 迭代法
迭代法是一种基于直方图的阈值计算方法,它通过不断迭代计算出最佳阈值。
具体实现过程是:首先选择一个初始阈值,然后将图像分为两类,计算出每个类的平均灰度值,然后将两个平均值的平均值作为新的阈值,重复以上步骤直到阈值不再变化为止。
阈值计算是图像处理中的一项重要任务,不同的阈值计算方法适用于不同的图像处理场景,需要根据具体情况选择合适的方法。
基于核空间的Otsu阈值法

基 于核 空 间 的 Otu阈值 法 s
吴 成 茂
( 安 邮 电学 院 电 子工 程学 院 , 安 , 1 1 1 西 西 702)
摘 要 : 了改善 传 统 Otu分 割 方 法 的分 割 性 能 , 出 了一 种 基 于核 空 间 函数 变 换 的 崭 新 Otu阈值 化 分 割 方 法 。 为 s 提 s
该 方 法 首 先 利 用 再 生 核 空 间 的 核 函 数 将 低 维 空 间 的样 本 映 射 到 高 维 空 间 , 样 本 之 间的 差 异 性 度 量 采 用基 于 核 其
函数 的距 离测度 ; 次得 到 了 一 种 基 于 核 空 间距 离的 最 小二 乘 法 并 采 用 迭 代 法 来估 计样 本 均 值 ; 后 得 到 了基 其 最
b s d o it n e i h e n l p c b an d a d t e n w o u a i n me h d f rt e s m— a e n d s a c n t e k r e a e i o t i e n h e c mp t to t o o h a s s
于核 函数 距 离和 一 维 直 方 图相 结 合 的 最 小偏 差 图像 阈值 化 分 割 方 法 , 其 简称 为 核 空 间Otu阚值 法 。实验 结 果 将 s
表 明 , 于 核 空 间 的 Otu法 相 对 传 统 0tu法有 更 好 的 分 割 性 能 。 基 s s
关键词 : 像分割; 图 阈值 法 ; tu法 ; Os 高斯 核 ; 多项 式 核 中 图分 类 号 : 3 1 TP 9 文 献标 识码 : A
Ot u h e ho di g m e ho o ho t Ex rme a e u t s w h t t e o cng Hibe t s t r s l n t d f r s r . pe i nt lr s ls ho t a he r pr du i l r s c a e s hr s l n t d i t e ha r d ton lOt u t r s ol n t d on pa e b s d Ot u t e ho di g me ho s be t r t n t a ii a s h e h di g me ho t e s gme a i n p r o ma e h e nt to e f r nc . Ke r s:i ge s g e t to y wo d ma e m n a i n;t e ho di t o hr s l ng me h d;Ot u m e ho s t d;Ga sa e ne ;po y us i n k r l l— n omi lke n 】 a r e
OTSU算法进行图像二值化的实现

实习名称:OTSU算法的实现实习日期:2012年05月25日得分:指导老师:夏志华系:计算机专业:网络工程年级:大二班次: 1 班姓名:学号:实验名称:OTSU算法进行图像二值化的实现(一)实验目的1.熟悉otsu算法的原理2.掌握otsu算法的应用(二)基本原理记t为前景与背景的分割阈值,前景点数占图像比例为W0, 平均值U0;背景点数占图像比例为W1, 平均值为U1.图像的内积平均值为:u=W0*U0 + W1*U1.从最小灰度值到最大灰度值遍历t,当t使得值g=W0*(U0-u)2+W1*(U1-u)2最大时t即为分割的最佳阈值。
(三)实验步骤clear; %清屏clc;G=imread('Tom.jpg'); %打开图像subplot(2,2,1); %显示图像位置布局imshow(G); %显示图像%axis(‘square’);title('原始图像');I=rgb2gray(G); %将真彩色G转化为灰度图像subplot(2,2,2); %显示图像位置布局imshow(I); %显示原始图像%axis(‘square’);title('灰度化后图像');I1=I;[p,q]=size(11);thresh=150;for i=1:p %i取从1到p的值for j=1:q %j取1到q的值if I1(i,j)>threshI1(i,j)=255;elseI1(i,j)=0;endendendsubplot(2,2,3);imshow(I1); %显示灰度化后的图像%axis(‘square’);title('固定阀值150二值化后图像');%%%利用OTSU二值化后图像Hist =zeros(256); %直方图dHist = zeros(256);variance = zeros(256); %方差[m,n]=size(1);PXD=0; %用来遍历阀值%%%%%%%%%%%%%%%%%%%%%求出直方图for i=1:mfor j=1:nHist(I(i,j)+1)=Hist(I(i,j)+1)+1;endendfor i=1:256 %i取从1到256的值dHist(i)=Hist(i)/(m*n);endfor PXD=1:256 %PXD取从1到256的值w0=0; w1=0, u0=0, u1=0, u=0; %大津阈值for i=1:PXDu0=u0+(i-1)*dHist(i);w0=w0+dHist(i);%m1=g0/w0;endfor i=PXD+1:256 %定义函数iu1=u1+(i-1)*dHist(i);w1=w1+dHist(i);%m2=g1/w1;endu=u0*w0+u1*w1; %图像的总平均灰度variance(PXD)=w0*(u0-u)^2+w1*(u1-u)^2; %分割的最佳阈值end%%%%%%%%%%%%%%%%%%%%for i=1:mfor j=1:nif I(i,j)> PXD-1I(i,j)=255;elseI(i,j)=0;endendendimagBW=I;subplot(2,2,4)imshow(imagBW);%axis(‘square’);title('OTSU二值化后图像');(四)实验结果(五)实验总结通过这次实验,使我初步了解了OTSU算法的原理,并在此基础上加以应用,让我对计算机图像处理有了进一步的认识和了解,为今后的生活及工作奠定了良好的基础,也为今后计算机图像处理科目的学习做好了充分的准备。
迭代阈值法实验报告(3篇)

第1篇一、实验背景迭代阈值法(Iterative Thresholding Method)是一种常用的图像处理技术,广泛应用于图像分割、边缘检测等领域。
该方法通过迭代调整阈值,将图像中的像素分为前景和背景,从而实现图像的分割。
本实验旨在验证迭代阈值法在图像分割中的应用效果,并分析不同参数设置对分割结果的影响。
二、实验目的1. 了解迭代阈值法的基本原理和实现方法。
2. 分析不同参数设置对图像分割结果的影响。
3. 比较迭代阈值法与其他图像分割方法的优缺点。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 图像处理库:OpenCV四、实验步骤1. 数据准备:收集多张不同场景的图像,包括自然场景、医疗图像、遥感图像等。
2. 图像预处理:对图像进行灰度化、滤波等预处理操作,提高图像质量。
3. 迭代阈值法实现:1. 读取预处理后的图像,将其转换为灰度图像。
2. 初始化阈值,可取图像的平均灰度或经验值。
3. 迭代计算前景和背景像素的灰度均值,更新阈值。
4. 根据新的阈值,将图像分割为前景和背景。
5. 重复步骤3和4,直至阈值不再变化或达到预设的迭代次数。
4. 结果分析:1. 对分割结果进行可视化,观察前景和背景的分割效果。
2. 分析不同参数设置对分割结果的影响,如迭代次数、初始阈值等。
3. 比较迭代阈值法与其他图像分割方法的优缺点。
五、实验结果与分析1. 实验结果:1. 自然场景图像分割结果:如图1所示,迭代阈值法能够较好地分割前景和背景,但在复杂场景中,分割效果可能受到噪声和边缘模糊等因素的影响。
2. 医疗图像分割结果:如图2所示,迭代阈值法能够有效地分割器官和组织,但在一些细节部位,分割效果可能不理想。
3. 遥感图像分割结果:如图3所示,迭代阈值法能够较好地分割地表和背景,但在一些复杂地形中,分割效果可能受到遮挡和阴影等因素的影响。
2. 结果分析:1. 迭代次数:迭代次数过多可能导致过度分割,影响分割效果;迭代次数过少可能导致分割不完整。
图像分割实验报告汇总

一、实验目的
1.掌握图像分割的基本思想,了解其分割技术及其计算策略;
2.学会从图像处理到分析的关键步骤,掌握图像分割过程;
3.了解图像分割的意义,进一步加深对图像分析和理解;
4.掌握基本分割方法:迭代分割和OTSU图像分割,并编程实现。
二、实验原理
(一)迭代阈值分割选取的基本思路是:首先根据图像中物体的灰度分布情况,选取一个近似阈值作为初始阈值,一个较好的方法就是将图像的灰度均值作为初始阈值,然后通过分割图像和修改阈值的迭代过程获得认可的最佳阈值。迭代式阈值选取过程可描述如下:
由图3可得:对于直方图双峰不明显或图像目标和背景比例差异悬殊迭代法所选取的阈值不如最大类间方差法(OTSU)(差异不是很大,很细微)。
但是对于直方图双峰明显谷底较深的图像迭代分割可以较快地获得满意结果。
五、实验程序段(具体见实验框架)
1.迭代图像分割:
void CImageProcessingDoc::Onimagediedaifenge()
msg.Format("分割阈值T=%d",T);
AfxMessageBox(msg);
for(j=0;j<m_Height;j++)
{
for(i=0;i<m_Width;i++)
{
if (m_pDibInit->m_pDibBits[j*m_SaveWidth + i]>=T)
m_pDibInit->m_pDibBits[j*m_SaveWidth + i]=255;
1.计算初始化阈值 = ;
2.根据 ,将图像分为两部分,分别计算灰度值期望,取其平均值为g1;
自动阈值迭代法及Otsu法实验报告

数字图像处理实验自动阈值迭代法及Otsu法姓名:学好:指导老师:王韬时间:2012年5月自动阈值迭代法及Otsu法实验报告一、实验原理大津法由大津于1979年提出,对图像Image,记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。
图像的总平均灰度为:u=w0*u0+w1*u1。
从最小灰度值到最大灰度值遍历t,当t使得值g=w0*(u0-u)2+w1*(u1-u)2 最大时t即为分割的最佳阈值。
对大津法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为 w0,背景取值u1,概率为w1,总均值为u,根据方差的定义即得该式。
因方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大, 当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。
二、实验步骤自动阈值(迭代法)步骤(1)估计一个阈值T(比如均值)(2)用阈值T将灰度直方图分割成两个区域R1、R2(3)分别计算两个区域R1、R2内的灰度平均值u1和u2(4)选择新阈值T=(u1+u2)/2(5)重复上述工作3~5次,直到前后两次的阈值不变自动阈值(Otsu法)步骤(1).计算直方图(2).设置初值:wi(0)以及ui(0)(3).从1到最大值设置阈值T。
更新wi (t)以及ui (t)。
计算σb(t) * σb(t)。
(4).选取最大σb(t) * σb(t)对应的T三、实验程序#include <afx.h>#include <windows.h>#include <iostream.h>#include <stdlib.h>#include <math.h>int nWidth; //图像宽度int nHeight; //图像高度int nColorBits; //每个像素所占位数int nColor; //图像颜色数int nLen; //图像文件大小,以字节数计int nByteWidth; //图像每行字节数BYTE *lpBitmap; //指向图像首字节的指针BYTE *lpBits; //指向图像实际数据的指针void OpenFile(CString FileName);void SaveFile(CString FileName);void OtusTHreshold(void);/*函数名称OpenFile() 功能:读取一幅BMP图像*/void OpenFile(CString FileName){//创建文件语句HANDLEhFile=::CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN _EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile==0){printf("不能打开文件,请重新选择!\n");return;}//读取图像文件DWORD WriteNum;BITMAPFILEHEADER BFH;//文件头ReadFile(hFile,&BFH,14,&WriteNum,NULL);//读取文件头,共14个字节if((BFH.bfType!='MB')||(WriteNum!=sizeof(BITMAPFILEHEADER))){printf("不是BMP位图文件或数据有误!\n");return;}nLen=GetFileSize(hFile,NULL)-sizeof(BITMAPFILEHEADER);//获取文件的长度lpBitmap=new BYTE[nLen];//存放图像,包括图像的信息头、调色板和像素数据ReadFile(hFile,lpBitmap,nLen,&WriteNum,NULL);//读取图像数据//设置全局变量的值BITMAPINFOHEADER *BIH=((BITMAPINFOHEADER *)lpBitmap);//图像文件的信息头nWidth=BIH->biWidth;//图像的宽度nHeight=BIH->biHeight;//图像的高度nColorBits=BIH->biBitCount;//图像的颜色数nByteWidth=(nWidth*nColorBits+31)/32*4;//图像的扫描宽度nColor=(nColorBits>8)?0:(1<<nColorBits);//调色板中的颜色数lpBits=lpBitmap+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nColor;//指向图像数据的实际位置CloseHandle(hFile);//关闭文件句柄}/*函数名称SaveFile() 功能:保存一幅BMP图像*/void SaveFile(CString FileName){//创建一个文件来保存图像文件HANDLEhFile=::CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CR EATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile==0){printf("不能创建文件,请重新选择!\n");return;}//创建一个文件头,并保存到创建的文件中unsigned long WriteNum;BITMAPFILEHEADER BFH;BFH.bfType='MB';BFH.bfSize=nLen+sizeof(BITMAPFILEHEADER);BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+n Color*sizeof(RGBQUAD);BFH.bfReserved1=BFH.bfReserved2=0;WriteFile(hFile,&BFH,sizeof(BITMAPFILEHEADER),&WriteNum,NULL);//保存改变的位图文件数据WriteFile(hFile,(BITMAPINFOHEADER*)lpBitmap,nLen,&WriteNum,NULL);CloseHandle(hFile);//关闭文件句柄}/*图像分割Otsu法*/void Otus(void){int i,j;//循环变量int nGrayHistogram[256];//灰度直方图数组,并初始化memset(nGrayHistogram,0,sizeof(nGrayHistogram));//统计各个灰度级对应的像素个数,并存放到灰度直方图数组中int nPixel;for(j=0;j<nHeight;j++){for(i=0;i<nWidth;i++){nPixel=lpBits[nByteWidth*j+i];//获取当前像素点的灰度值nGrayHistogram[nPixel]++;//对灰度值统计计数}}float u0,u1;//c0组和c1组的均值float w0,w1;//c0组和c1组的概率int nCount0;//c0组的像素总数int nT,nBestT;//阈值和最佳阈值(对应方差最大时的阈值)float fVaria,fMaxVaria=0;//方差和最大方差//统计直方图中像素点的总数,并存放到nSum中int nSum=0;for(i=0;i<256;i++)nSum+=nGrayHistogram[i];//令阈值nT从0遍历到255for(nT=0;nT<256;nT++){//当阈值为nT时,计算c0组的均值和概率u0=0;nCount0=0;for(i=0;i<=nT;i++){u0+=i*nGrayHistogram[i];nCount0+=nGrayHistogram[i];}u0/=nCount0;w0=(float)nCount0/nSum;//当阈值为nT时,计算c1组的均值和概率u1=0;for(i=nT+1;i<256;i++)u1+=i*nGrayHistogram[i];u1/=(nSum-nCount0);w1=1-w0;fVaria=w0*w1*(u0-u1)*(u0-u1);//计算两组间的方差if(fVaria>fMaxVaria)//记录最大方差和最佳阈值{fMaxVaria=fVaria;nBestT=nT;}}//利用最佳阈值对源图像作分割处理for(j=0;j<nHeight;j++){for(i=0;i<nWidth;i++){if(lpBits[j*nByteWidth+i]<nBestT)lpBits[j*nByteWidth+i]=0;elselpBits[j*nByteWidth+i]=255;}}}void main(){char OpenFileName[200];char SaveFileName[200];cout<<"请输入图像路径"<< endl;gets(OpenFileName);cout<<"请输入保存图像路径"<< endl;gets(SaveFileName);OpenFile(OpenFileName);Otus();cout<<"已完成!"<< endl;SaveFile(SaveFileName);delete []lpBitmap;}四、实验结果原图像:处理后图像:。
基于迭代(自动阈值)算法的医学图像增强方法

基于迭代(自动阈值)算法的医学图像增强方法1 算法原理介绍1.1 基于灰度阈值的图像分割原理采用灰度阈值对图像进行分割是图像分割的基本方法之一。
通过设定灰度阈值,把图像的象素点按灰度等级进行分类,把图像分割成若干子图像。
在实际应用中,最常用的一种分割方法是将图像分割成高灰度区和低灰度区两部分,组成一幅二值图像。
该分割方法按式1对图像进行操作。
(1)其中,T为预先设定的灰度阈值,f为输入图像,g为输出图像。
基于灰度阈值对图像进行分割的基本条件是式(1)中阈值T的选择。
虽然采用人工方法往往可以获得较理想的阈值,但是在很多情况下,需要计算机自动完成阈值的选择,这样就要求有合适的算法对图像的灰度直方图进行分析,选择合适的阈值。
在实际中常采用迭代算法或Ostu法对阈值进行自动计算[1],本文仅介绍迭代算法。
迭代算法的基本思想是:首先设定一个阈值的估计值;采用一定的算法反复对该估计值进行修正,保证每次修正后的结果都优于前一次;当进行一定次数的修正之后,结果趋于收敛,即相邻两次的结果的差异较小,当该差异小到可接受范围时,表明一个理想的阈值已经求出。
最后利用该阈值按式(1)对图像进行操作,即完成了图像的自动阈值分割。
但是,一些图片由于照度不均、阴影、对比度差异等,使得如果采用同一阈值对整幅图片进行处理(即全局阈值)时会出现不兼容图像各处的情况,使得分割效果变差。
这时,可以考虑将图片分割成若干子图片,将每个子图片按自动阈值算法进行处理,然后再将各个子图片的处理结果合并成整体结果输出,该方法称局部阈值或动态阈值法。
1.2基于图像自动阈值分割的边缘检测采用全局阈值或局部阈值获得的二值图像可以方便地应用在图像的边缘检测当中。
由于图像已经转换为二值图像,所以对图像中边缘信息的提取较为方便,仅需判断某像素是区域内部点还是边缘点即可。
实际操作中,对二值图像中黑色(或白色)点的四邻域进行判断,若该点的四邻域均为黑色(或白色),即可判断该点为区域内部点而不是边缘点。
实验报告 (2)

北京理工大学珠海学院实验报告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY班级:计算机(一)班 学号:100201011002 姓名:闫祥达 指导教师:郭素梅 成绩:实验题目:二值化阈值的otsu 算法 实验时间:2012.3.151. 题目概述图像的二值化处理就是将图像上的点的灰度置为0或255,也就是使整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
2. 设计思路和流程图设计思路:该方法的基本思想是:设阈值将图像分割成两组,一组灰度对应目标,另一组灰度对应背景,则这两组灰度值的类内方差最小,两组的类间方差最大。
对图像Image ,记t 为目标与背景的分割阈值,目标像素数占图像比例为0ω,平均灰度为0μ;背景像素数占图像比例为1ω,平均灰度为1μ。
图像的总平均灰度为:)()()()(1100t t t t μωμωμ+=。
从最小灰度值到最大灰度值遍历t ,当t 使得值211200)()(μμωμμω-+-=g 最大时t 即为分割的最佳阈值。
对大津法可作如下理解:该式实际上就是类间方差值,阈值t 分割出的目标和背景两部分构成了整幅图像,而目标取值0μ,概率为 0ω,背景取值1μ,概率为1ω,总均值为μ,根据方差的定义即得该式。
因方差是灰度分布均匀性的一种度量,方差值越大说明构成图像的两部分差别越大,当部分目标点错分为背景或部分背景点错分为目标点都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。
记),(j i f 为M N ⨯图像),(j i 点处的灰度值,灰度级为μ,不妨假设),(j i f 取值]1,0[-m 。
记)(k p 为灰度值为k 的频率,则有:∑==k j i f MN k p ),(11)( (2)假设用灰度值t 为阈值分割出的目标与背景分别为:}),({t j i f ≤和}),({t j i f >,于是目标部分比例:∑≤≤=t i i p t 00)()(ω, (3)目标部分点数:∑≤≤=ti i p MN t N 00)( )( (4)背景部分比例:∑-≤<=11)()(m i t i p t ω (5)背景部分点数: ∑-≤<=11)()(m i t i P MNt N (6)目标均值: ∑≤≤=t i t i ip t 000)(/)()(ωμ (7)背景均值: ∑-≤<=111)(/)()(m i t t i ip t ωμ (8) 总均值: )()()()(1100t t t t μωμωμ+= (9)大津法指出求图像最佳阈值g 的公式为:]))(()())(()([ 2112001-m t 0μμωμμω-+-=≤≤t t t t Max Arg g (10) 该式右边括号内实际上就是类间方差值,阈值g 分割出的目标和背景两部分构成了整幅图像,而目标值)(0t μ,概率为)(1t ω,背景取值)(1t μ,概率为)(0t ω,总均值为μ,根据方差的定义即得该式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理实验自动阈值迭代法及Otsu法姓名:学好:指导老师:王韬时间:2012年5月自动阈值迭代法及Otsu法实验报告一、实验原理大津法由大津于1979年提出,对图像Image,记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。
图像的总平均灰度为:u=w0*u0+w1*u1。
从最小灰度值到最大灰度值遍历t,当t使得值g=w0*(u0-u)2+w1*(u1-u)2 最大时t即为分割的最佳阈值。
对大津法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为 w0,背景取值u1,概率为w1,总均值为u,根据方差的定义即得该式。
因方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大, 当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。
二、实验步骤自动阈值(迭代法)步骤(1)估计一个阈值T(比如均值)(2)用阈值T将灰度直方图分割成两个区域R1、R2(3)分别计算两个区域R1、R2内的灰度平均值u1和u2(4)选择新阈值T=(u1+u2)/2(5)重复上述工作3~5次,直到前后两次的阈值不变自动阈值(Otsu法)步骤(1).计算直方图(2).设置初值:wi(0)以及ui(0)(3).从1到最大值设置阈值T。
更新wi (t)以及ui (t)。
计算σb(t) * σb(t)。
(4).选取最大σb(t) * σb(t)对应的T三、实验程序#include <afx.h>#include <windows.h>#include <iostream.h>#include <stdlib.h>#include <math.h>int nWidth; //图像宽度int nHeight; //图像高度int nColorBits; //每个像素所占位数int nColor; //图像颜色数int nLen; //图像文件大小,以字节数计int nByteWidth; //图像每行字节数BYTE *lpBitmap; //指向图像首字节的指针BYTE *lpBits; //指向图像实际数据的指针void OpenFile(CString FileName);void SaveFile(CString FileName);void OtusTHreshold(void);/*函数名称OpenFile() 功能:读取一幅BMP图像*/void OpenFile(CString FileName){//创建文件语句HANDLEhFile=::CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN _EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile==0){printf("不能打开文件,请重新选择!\n");return;}//读取图像文件DWORD WriteNum;BITMAPFILEHEADER BFH;//文件头ReadFile(hFile,&BFH,14,&WriteNum,NULL);//读取文件头,共14个字节if((BFH.bfType!='MB')||(WriteNum!=sizeof(BITMAPFILEHEADER))){printf("不是BMP位图文件或数据有误!\n");return;}nLen=GetFileSize(hFile,NULL)-sizeof(BITMAPFILEHEADER);//获取文件的长度lpBitmap=new BYTE[nLen];//存放图像,包括图像的信息头、调色板和像素数据ReadFile(hFile,lpBitmap,nLen,&WriteNum,NULL);//读取图像数据//设置全局变量的值BITMAPINFOHEADER *BIH=((BITMAPINFOHEADER *)lpBitmap);//图像文件的信息头nWidth=BIH->biWidth;//图像的宽度nHeight=BIH->biHeight;//图像的高度nColorBits=BIH->biBitCount;//图像的颜色数nByteWidth=(nWidth*nColorBits+31)/32*4;//图像的扫描宽度nColor=(nColorBits>8)?0:(1<<nColorBits);//调色板中的颜色数lpBits=lpBitmap+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nColor;//指向图像数据的实际位置CloseHandle(hFile);//关闭文件句柄}/*函数名称SaveFile() 功能:保存一幅BMP图像*/void SaveFile(CString FileName){//创建一个文件来保存图像文件HANDLEhFile=::CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CR EATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile==0){printf("不能创建文件,请重新选择!\n");return;}//创建一个文件头,并保存到创建的文件中unsigned long WriteNum;BITMAPFILEHEADER BFH;BFH.bfType='MB';BFH.bfSize=nLen+sizeof(BITMAPFILEHEADER);BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+n Color*sizeof(RGBQUAD);BFH.bfReserved1=BFH.bfReserved2=0;WriteFile(hFile,&BFH,sizeof(BITMAPFILEHEADER),&WriteNum,NULL);//保存改变的位图文件数据WriteFile(hFile,(BITMAPINFOHEADER*)lpBitmap,nLen,&WriteNum,NULL);CloseHandle(hFile);//关闭文件句柄}/*图像分割Otsu法*/void Otus(void){int i,j;//循环变量int nGrayHistogram[256];//灰度直方图数组,并初始化memset(nGrayHistogram,0,sizeof(nGrayHistogram));//统计各个灰度级对应的像素个数,并存放到灰度直方图数组中int nPixel;for(j=0;j<nHeight;j++){for(i=0;i<nWidth;i++){nPixel=lpBits[nByteWidth*j+i];//获取当前像素点的灰度值nGrayHistogram[nPixel]++;//对灰度值统计计数}}float u0,u1;//c0组和c1组的均值float w0,w1;//c0组和c1组的概率int nCount0;//c0组的像素总数int nT,nBestT;//阈值和最佳阈值(对应方差最大时的阈值)float fVaria,fMaxVaria=0;//方差和最大方差//统计直方图中像素点的总数,并存放到nSum中int nSum=0;for(i=0;i<256;i++)nSum+=nGrayHistogram[i];//令阈值nT从0遍历到255for(nT=0;nT<256;nT++){//当阈值为nT时,计算c0组的均值和概率u0=0;nCount0=0;for(i=0;i<=nT;i++){u0+=i*nGrayHistogram[i];nCount0+=nGrayHistogram[i];}u0/=nCount0;w0=(float)nCount0/nSum;//当阈值为nT时,计算c1组的均值和概率u1=0;for(i=nT+1;i<256;i++)u1+=i*nGrayHistogram[i];u1/=(nSum-nCount0);w1=1-w0;fVaria=w0*w1*(u0-u1)*(u0-u1);//计算两组间的方差if(fVaria>fMaxVaria)//记录最大方差和最佳阈值{fMaxVaria=fVaria;nBestT=nT;}}//利用最佳阈值对源图像作分割处理for(j=0;j<nHeight;j++){for(i=0;i<nWidth;i++){if(lpBits[j*nByteWidth+i]<nBestT)lpBits[j*nByteWidth+i]=0;elselpBits[j*nByteWidth+i]=255;}}}void main(){char OpenFileName[200];char SaveFileName[200];cout<<"请输入图像路径"<< endl;gets(OpenFileName);cout<<"请输入保存图像路径"<< endl;gets(SaveFileName);OpenFile(OpenFileName);Otus();cout<<"已完成!"<< endl;SaveFile(SaveFileName);delete []lpBitmap;}四、实验结果原图像:处理后图像:。