otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
自动阈值迭代法及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;}四、实验结果原图像:处理后图像:。
阈值分割-最大类间方差法(OTSU)
最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。
它是按图像的灰度特性,将图像分成背景和目标两部分。
背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大, 当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。
因此,使类间方差最大的分割意味着错分概率最小。
function ostu,filequeryStatus = QUERY_IMAGE(file, fileInfo)if queryStatus eq 0 then beginResult = DIALOG_MESSAGE('图像格式不可识别!',/error,title='警告') return,0endifif (fileInfo.CHANNELS ne 1) then beginResult = DIALOG_MESSAGE('图像格式必须为8bit',/error,title='警告') return,0endifimgSize = fileInfo.dimensionsimg=READ_IMAGE(file)p=HISTOGRAM(img)p=p/(imgSize[0]*imgSize[1]*1.0)D=0.0T0=0 ;阈值for T=0,255 do beginp0=0.0 & m0=0for i=0,T do beginp0=p0+p[i]m0=m0+i*p[i]endform0=m0/p0p1=0.0 & m1=0for i=T+1,255 do beginp1=p1+p[i]m1=m1+i*p[i]endform1=m1/p1m=p0*m0+p1*m1D01=p0*(m0-m)^2+p1*(m1-m)^2if (D lt D01) then beginD=D01T0=Tendifendforprint,'ostu法阈值:'+strtrim(T0,2)img [WHERE (img le T0)] = 0img [WHERE (img gt T0)] = 255return, imgend;--------------------pro ostu_test,imagefileDEVICE, DECOMPOSED=1; 获取本程序所在文件路径RootDir = Sourceroot()if n_elements(imagefile) eq 0 then imagefile='man' file=RootDir+imagefile+'.bmp'imgSize = fileInfo.dimensionsimg=READ_IMAGE(file)ostuimg=ostu(file)WINDOW, /free, XSIZE = imgSize[0], YSIZE = imgSize[1] TV, imgend。
Otsu法在织物疵点检测中的研究及应用
出两部分 的平均灰度值 , 记做 1 和 2 。 () 3 重新选择新 阈值 , 新的阈值 + 记做 T + =(1 ) 1 k 1 + 2 2。重新 / 将 图像进行分割 。 () + 一T < 为一个极小 数 ) , 4当 1 k ( 时 阈值选择 结束 , 时对 此 应 的阈值就是最佳阈值 , 否则转到 () 进行迭代计算 。 2, 1 3大津法 大津法是 日 本人大津展之于 1 7 年提 出的 , 99 该方法是一种 自 适应阈
科技信息
高校 理科 研 究
Os t u法在织物疵 点楦测 巾硇研夯及应用
兰州交通大学电子与信 息工程学院 李红梅 李玉超
【 摘 要] 在织物疵 点检测 中, 阈值分割是 极其重要 的一个环 节。本 文对 常用的三种 阈值 分割算 法进行 比较 , 并提 出了一种 改进的 O s 法 。该方 法 自 t u 适应性更 强, 分割 结果更加完善 , 通过数学形 态学处理得到疵点二值 图像 。仿真 实验结果证明 了该方法行 使 最后 之有效 , 值得借鉴 。 [ 关键词 ] t 阈值 分割 织物疵 点 数 学形 态学 Os u
O 引言 .
均 灰度为 1 ; 1 背景 出现的概率 为 甜 , 均灰度为 t 。图像总 的灰度 。 平 1 1
在纺织生 产过程 中 , 织物质量的检测和控制至关重要 , 而疵点检测 就是极 其重要 的一 个环节 。长期 以来 , 物疵点检测都是 由人工完成 织 的, 也就是 工作人 员借助外界光线或者辅助的照明系统 , 按照 自己的经 验对织 物进行评定 。该方法检 测速度低 , 测结果容易受 到外界及工 检 作人员主观影响 , 并且误检率和漏检率 比较高 。为了克服 以上缺点 , 国 内外许多学者都致力于织物疵点 自 动检测的研究 , 并取得了一些成就} 2 J c 图像 分割是织 物疵点检测 中常用 的方法 , 分割 的 目的是产生疵点 的二值 图像 。图像 分割 的好 坏直接关 系到疵点特征 的提取 , 的图像 好 分割效果应具备 以下 的特征 : () 割出来 的各 区域对某 种特征 ( 1分 如灰度 和纹理 ) 而言具有相似 性, 区域 内部是联通 的且没有过 多的小孔 。 () 2 相邻 区域对分割所依据 的性质有 明显 的差异 。 () 3 区域边界是 明确 的。 现实生活 中, 图像处理 和分析都是面向某种具体应用 , 以上述条 所 件也要视具体情 况而定 。 目前还没有一种方法可 以很好 的兼顾这些约 束条件 , 也没有一种通用 的方法可 以完成不 同图像的分割任务 。 1常用的阈值分割方法及 比较 . 阈值 分割是常用 的图像分割方 法 , 也是 一种简单有效 的方法 。阈 值分割 主要是在灰度 取值范 围内选择一个灰度 值作为 阈值 , 分别记输 人输 出图像为 f Y 和 Fx Y , 单阈值 分割算 法为 : ( ) x, (,)则
【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)
【转】七种常见阈值分割代码(Otsu、最⼤熵、迭代法、⾃适应阀值、⼿动、迭代法、基本全局阈值法)⼀、⼯具:VC+OpenCV⼆、语⾔:C++三、原理otsu法(最⼤类间⽅差法,有时也称之为⼤津算法)使⽤的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最⼤,每个部分之间的灰度差异最⼩,通过⽅差的计算来寻找⼀个合适的灰度级别来划分。
所以可以在⼆值化的时候采⽤otsu 算法来⾃动选取阈值进⾏⼆值化。
otsu算法被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对⽐度的影响。
因此,使类间⽅差最⼤的分割意味着错分概率最⼩。
设t为设定的阈值。
wo:分开后前景像素点数占图像的⽐例uo:分开后前景像素点的平均灰度w1:分开后被景像素点数占图像的⽐例u1:分开后被景像素点的平均灰度u=w0*u0 + w1*u1 :图像总平均灰度从L个灰度级遍历t,使得t为某个值的时候,前景和背景的⽅差最⼤,则这个 t 值便是我们要求得的阈值。
其中,⽅差的计算公式如下:g=wo * (uo - u) * (uo - u) + w1 * (u1 - u) * (u1 - u)[ 此公式计算量较⼤,可以采⽤: g = wo * w1 * (uo - u1) * (uo - u1) ]由于otsu算法是对图像的灰度级进⾏聚类,so 在执⾏otsu算法之前,需要计算该图像的灰度直⽅图。
迭代法原理:迭代选择法是⾸先猜测⼀个初始阈值,然后再通过对图像的多趟计算对阈值进⾏改进的过程。
重复地对图像进⾏阈值操作,将图像分割为对象类和背景类,然后来利⽤每⼀个类中的灰阶级别对阈值进⾏改进。
图像阈值分割---迭代算法1 .处理流程:1.为全局阈值选择⼀个初始估计值T(图像的平均灰度)。
2.⽤T分割图像。
产⽣两组像素:G1有灰度值⼤于T的像素组成,G2有⼩于等于T像素组成。
3.计算G1和G2像素的平均灰度值m1和m2;4.计算⼀个新的阈值:T = (m1 + m2) / 2;5.重复步骤2和4,直到连续迭代中的T值间的差⼩于⼀个预定义参数为⽌。
opencv中区域分割算法
opencv中区域分割算法OpenCV中的区域分割算法区域分割是计算机视觉中的一个重要任务,它通过将图像分割成不同的区域,从而使图像中的每个对象或物体都能够被单独处理。
OpenCV是一个开源计算机视觉库,提供了许多强大的图像处理和分析功能,包括区域分割算法。
在OpenCV中,有许多不同的区域分割算法可供选择,每种算法都有其独特的优势和适用范围。
下面将介绍几种常用的区域分割算法。
1. 基于阈值的分割算法基于阈值的分割算法是最简单和最常用的区域分割方法之一。
它将图像分为两个或多个不同的区域,其中每个区域都具有相似的像素强度或颜色。
该算法的核心思想是选择一个适当的阈值,将图像中的像素分为两个类别:背景和前景。
常用的阈值选择方法包括全局阈值、自适应阈值和Otsu阈值等。
2. 基于边缘的分割算法基于边缘的分割算法旨在通过检测图像中的边缘来实现物体的分割。
这些算法通常基于图像的梯度信息,通过计算像素之间的强度差异来检测边缘。
常见的基于边缘的分割算法包括Canny边缘检测和Sobel算子等。
3. 基于区域增长的分割算法基于区域增长的分割算法根据像素之间的相似性将图像分割成不同的区域。
该算法从一个或多个种子点开始,通过合并相邻像素,直到达到某个停止条件为止。
区域增长算法的优势在于能够处理具有复杂纹理和颜色变化的图像。
常用的区域增长算法包括水平和垂直种子生长算法、区域增长合并算法等。
4. 基于聚类的分割算法基于聚类的分割算法将图像中的像素分为不同的聚类或类别。
该算法将像素看作是特征空间中的点,通过计算像素之间的相似性来将其分组。
常用的聚类算法包括K均值聚类、均值漂移聚类和DBSCAN聚类等。
5. 基于图论的分割算法基于图论的分割算法将图像分割问题转化为图论问题,通过构建图的顶点和边来表示图像中的像素。
该算法通过最小化图的割来实现分割,其中割是将图分为两个不相交子图的边的集合。
常用的基于图论的分割算法包括最小割和归一化割等。
opencv otsu阈值
opencv otsu 阈值介绍在图像处理中,阈值处理是一种常见而重要的操作。
通过阈值处理,我们可以将图像分割成不同的区域,便于后续的图像分析和处理。
而Otsu 阈值法是一种自动确定二值图像阈值的方法,它可以根据图像的直方图自适应地选择最佳的阈值,从而使得前景区域和背景区域的差异最大化。
Otsu 阈值法原理Otsu 阈值法是由日本学者大津展之于1979年提出的,它的原理基于图像的灰度直方图。
假设图像的灰度级别为L ,每个灰度级别对应的像素数为Ni ,总像素数为N 。
Otsu 阈值法的目标是找到一个阈值T ,通过将灰度级别小于等于T 的像素归为一类,灰度级别大于T 的像素归为另一类,从而使得两个类之间的类内方差最小,类间方差最大。
具体来说,Otsu 阈值法将图像分为前景和背景两个类别,通过计算类别内像素的方差和类别间像素的方差,并选择使得类别间方差最大的阈值作为最终的阈值。
在Otsu 阈值法中,我们需要计算两个方差:类别内方差和类别间方差。
类别内方差用来评估单个类别内像素的分布情况,它可以通过以下公式计算:σintra 2(T )=∑N i N Ti=0⋅(μ0−μT )2 其中,T 为阈值,Ni 为灰度级别i 对应的像素数,N 为总像素数,μ0和μT 分别为类别0(灰度级别小于等于T )和类别T (灰度级别大于T )的平均灰度。
类别间方差用来评估两个类别之间的差异,它可以通过以下公式计算:σinter 2(T )=∑N i N L−1i=T+1⋅(μT −μi )2 其中,L 为总的灰度级别数。
通过计算不同阈值下的类别内方差和类别间方差,我们可以选择使得类别间方差最大化的阈值作为最终的阈值。
Otsu阈值法的实现在使用Otsu阈值法时,我们常使用OpenCV库中的cv2.threshold函数。
这个函数接收一个输入图像和一个初始阈值,然后返回最终的阈值和二值化后的图像。
以下是使用Otsu阈值法的代码示例:import cv2# 读取图像img = cv2.imread('image.jpg', 0)# 进行Otsu阈值处理ret, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 显示结果cv2.imshow("Original Image", img)cv2.imshow("Otsu Threshold", thresh)cv2.waitKey(0)cv2.destroyAllWindows()在这个示例中,我们首先读取一张灰度图像,并将其传递给cv2.threshold函数,同时指定阈值为0。
otsu法阈值分割
Otsu阈值分割法是一种确定阈值的算法,也被称为最大类间方差法(大津算法)。
该方法基于图像的灰度分布特性,将图像分成背景和目标两部分,分割的依据是两类之间的间类方差最大,即类别内的差异最小化。
这种方法常用于图像进行二值分割时的自适应阈值计算。
Otsu阈值分割法的原理如下:
1. 假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,
像素灰度大于阈值T的像素个数记作N1。
2. 属于前景(即目标)的像素点数占整幅图像的比例记为ω0,其平均灰度μ0;背景像素点数占整幅图
像的比例为ω1,其平均灰度为μ1。
3. 则有:ω0=N0/(M×N),ω1=N1/(M×N),N0+N1=M×N,ω0+ω1=1,μ=ω0μ0+ω1μ1,
g=ω0*(μ0-μ)^2+ω1*(μ1-μ)^2。
4. 将式(5)代入式(6),得到等价公式:g=ω0ω1(μ0-μ1)^2。
5. 采用遍历的方法得到使类间方差g最大的阈值T,即为所求。
Otsu阈值分割法的优点是计算简单,不受图像亮度和对比度的影响,被认为是图像分割中阈值选取的最佳算法。
otsu's二值化算法
otsu's二值化算法Otsu's 二值化算法二值化是在图像处理中常用的一种技术,它可以将一幅灰度图像转化成只有两个颜色的图像,通常是黑白图像。
在很多应用中,一个图像可能包含了丰富的信息,而我们只对其中的某些特定信息感兴趣。
通过将图像二值化,我们可以将不相关的信息去除,从而更加准确地提取出我们所需的信息。
Otsu's 二值化算法是用于自动寻找最优阈值的一种二值化方法。
它是由日本学者大津展之在1979年提出的,至今仍然被广泛应用于图像处理领域。
Otsu's 二值化算法基于灰度直方图的分布特性,通过最大化类间方差来找到最佳阈值。
下面,我们将一步一步地回答有关Otsu's 二值化算法的问题,以帮助您更好地理解这个算法的原理和应用。
1. 什么是Otsu's 二值化算法?Otsu's 二值化算法是一种自动寻找最优阈值的二值化方法。
它通过最大化图像的类间方差来选择最佳阈值,从而能够更好地将图像分割成背景和前景两部分。
2. Otsu's 二值化算法的原理是什么?Otsu's 二值化算法的核心原理是基于类间方差最大化的思想。
在图像二值化的过程中,我们需要选择一个合适的阈值来将像素分为背景和前景两部分。
而Otsu's 二值化算法通过迭代计算灰度级的类间方差,找到一个阈值,使得类间方差最大化。
当类间方差最大化时,背景和前景之间的差异最明显,二值化效果最好。
3. Otsu's 二值化算法的具体步骤是什么?(1)计算图像的灰度直方图:统计图像中每个灰度级别的像素个数。
(2)对每个灰度级别进行归一化:将每个灰度级别的像素个数除以总像素数,得到各个灰度级别的像素占比。
(3)计算每个灰度级别的累积概率:对每个灰度级别的像素占比进行累积求和,得到累积概率。
(4)计算全局平均灰度值:通过累积概率来计算全局平均灰度值。
(5)计算类内方差:根据全局平均灰度值,计算每个灰度级别的类内方差。
Python基于OpenCV库Adaboost实现人脸识别功能详解
Python基于OpenCV库Adaboost实现⼈脸识别功能详解本⽂实例讲述了Python基于OpenCV库Adaboost实现⼈脸识别功能。
分享给⼤家供⼤家参考,具体如下:以前⽤Matlab写神经⽹络的⾯部眼镜识别算法,研究算法逻辑,采集⼤量训练数据,迭代,计算各感知器的系数。
相当之⿇烦~⽽现在运⽤调⽤pythonOpenCV库Adaboost算法,⽆需知道算法逻辑,⽆需进⾏模型训练,⼈脸识别变得相当之简单了。
需要⽤到的库是opencv(open source computer vision),下载安装⽅式如下:使⽤pip install numpy语句安装numpy(如果出现错误:Microsoft Visual C++ 9.0 is required <unable to find vcvarsall.bat>,使⽤管理员⾝份安装Microsoft Visual C++ 9.0,重新启动计算机,再使⽤使⽤pip install numpy语句安装numpyopencv2.4.10下载之后解压(随便解压到哪⾥),将解压⽬录opencv⽂件夹中,build->python->2.7->x86下的⽂件cv2.pyd 复制到python2.7\Lib\site-packages 中测试是否安装成功,执⾏解压⽬录下的sources\samples\python\drawing.py或者进⼊python环境,使⽤import cv2⾸先讲讲需要⽤到的新函数:CascadeClassifier()函数,导⼊分类器cv2.CascadeClassifier('xxxxx.xml')#haarcascade_frontalface_alt.xml脸部识别⽂件#haarcascade_eye.xml眼部识别⽂件函数的参数是xml完整路径(具体看你的opencv安装在哪⾥的,在opencv\sources\data\haarcascades下⾯),xml⽂件中是封装好的算法detectMultiScale()函数,进⾏识别detectMultiScale(image,scaleFactor,minNeighbors,flags,minSize,maxSize)最终返回值为识别出的矩阵框[x, y, w, h],(x,y)左上⾓起始坐标,w宽,h⾼image:⽤于检测的图像scaleFactor:前后两次相继的扫描中,搜索窗⼝的⽐例系数.例如1.1指将搜索窗⼝依次扩⼤10%。
OpenCV探索之路(二十七):皮肤检测技术
OpenCV探索之路(二十七):皮肤检测技术好久没写博客了,因为最近都忙着赶项目和打比赛==| 好吧,今天我打算写一篇关于使用opencv做皮肤检测的技术总结。
那首先列一些现在主流的皮肤检测的方法都有哪些:1.RGB color space2.Ycrcb之cr分量+otsu阈值化3.YCrCb中133<=Cr<=173 77<=Cb<=1274.HSV中 7<H<20 28<S<256 50<V<2565.基于椭圆皮肤模型的皮肤检测6.opencv自带肤色检测类AdaptiveSkinDetector那我们今天就来一一实现它吧!方法一:基于RGB的皮肤检测根据RGB颜色模型找出定义好的肤色范围内的像素点,范围外的像素点设为黑色。
查阅资料后可以知道,前人做了大量研究,肤色在RGB模型下的范围基本满足以下约束:在均匀光照下应满足以下判别式:R>95 AND G>40 B>20 AND MAX(R,G,B)-MIN(R,G,B)>15 AND ABS(R-G)>15 AND R>G AND R>B在侧光拍摄环境下:R>220 AND G>210 AND B>170 AND ABS(R-G)<=15 AND R>B AND G>B既然判别式已经确定了,所以按照判别式写程序就很简单了。
/*基于RGB范围的皮肤检测*/Mat RGB_detect(Mat& img){/*R>95 AND G>40 B>20 AND MAX(R,G,B)-MIN(R,G,B)>15 AND ABS(R-G)>15 AND R>G AND R>BORR>220 AND G>210 AND B>170 AND ABS(R-G)<=15 AND R>B AND G>B*/Mat detect = img.clone();detect.setT o(0);if (img.empty() || img.channels() != 3){return detect;}for (int i = 0; i < img.rows; i++){for (int j = 0; j < img.cols; j++){uchar *p_detect = detect.ptr<uchar>(i, j);uchar *p_img = img.ptr<uchar>(i, j);if ((p_img[2] > 95 && p_img[1]>40 && p_img[0] > 20 && (MAX(p_img[0], MAX(p_img[1], p_img[2])) - MIN(p_img[0], MIN(p_img[1], p_img[2])) > 15) &&abs(p_img[2] - p_img[1]) > 15 && p_img[2] > p_img[1] && p_img[1] > p_img[0]) ||(p_img[2] > 200 && p_img[1] > 210 && p_img[0] > 170 && abs(p_img[2] - p_img[1]) <= 15 &&p_img[2] > p_img[0] && p_img[1] > p_img[0])){p_detect[0] = p_img[0];p_detect[1] = p_img[1];p_detect[2] = p_img[2];}}}return detect;}检测效果如下:从检测结果可以看出,皮肤的检测效果并不好,首先皮肤检测的完整性并不高,一些稍微光线不好的区域也没法检测出皮肤来。
c++ opencv阈值的方法
文章标题:探寻C++ OpenCV图像处理中的阈值方法在C++ OpenCV中,图像处理的阈值方法是一个十分重要的技术,它可以对图像进行二值化处理,将图像中的目标对象和背景进行有效分割,为后续的图像识别和分析提供了基础。
本文将深入探讨C++ OpenCV中常用的阈值方法,以帮助读者更好地理解和运用这一技术。
1. 了解阈值的概念阈值处理是一种图像分割方法,通过对图像灰度值进行处理,将像素分为目标和背景两部分。
在C++ OpenCV中,常用的阈值方法包括全局阈值、自适应阈值和Otsu阈值等。
通过对比不同的阈值方法,我们可以更好地选择适合特定场景的阈值处理方案。
2. 全局阈值的应用全局阈值是最简单直观的阈值处理方法,在C++ OpenCV中可以使用cv::threshold函数进行实现。
通过设定一个全局固定的阈值,对整个图像进行二值化处理,将灰度值大于阈值的像素设为白色,小于阈值的像素设为黑色。
然而,在实际应用中,全局阈值可能对光照不均匀或者对比度较低的图像效果不佳,因此需要寻求更加灵活的阈值方法。
3. 自适应阈值的优势C++ OpenCV提供了自适应阈值方法,通过计算局部区域的灰度均值或加权平均值来确定阈值,有效应对了图像光照不均匀的情况。
自适应阈值方法使得图像的二值化处理更加灵活,可以适应不同光照条件下的图像处理需求。
4. Otsu阈值的特殊性Otsu阈值是一种自动确定阈值的方法,它能够根据图像的灰度分布特点,自动计算最佳阈值,进而实现图像的自适应二值化处理。
在C++ OpenCV中,Otsu阈值的应用需要结合cv::threshold函数进行实现,通过该方法,图像处理的效果更加准确和稳定。
总结与展望通过本文的探讨,我们对C++ OpenCV中阈值处理的方法有了更深入的了解。
在实际应用中,我们可以根据图像的特点和处理需求,选择合适的阈值处理方法,以实现图像的有效分割和处理。
未来,随着图像处理技术的不断发展,我们可以进一步探索更加高效和智能的阈值方法,为图像处理领域注入新的活力和可能性。
otsu计算题
otsu计算题摘要:1.介绍otsu 算法2.otsu 算法原理3.otsu 算法步骤4.otsu 算法应用场景5.otsu 算法优缺点正文:otsu 算法是一种用于图像二值化的方法,它可以自动计算出最佳的阈值,将图像中的像素分为两个区域,即前景和背景。
该算法是由日本学者Fumio Otsu 于1979 年提出的,因此被称为otsu 算法。
otsu 算法原理是通过计算图像中每个像素点的灰度值分布来确定最佳的阈值。
具体来说,它首先将图像中的所有像素点按照灰度值的大小进行排序,然后计算出最小值和最大值,以及中间值。
接下来,它将图像分为两个区域,即灰度值小于等于最小值的像素点为背景,灰度值大于等于最大值的像素点为前景。
最后,它通过计算两个区域的平均灰度值来确定最佳的阈值。
otsu 算法的步骤如下:1.读取图像,获取图像的宽度和高度。
2.对图像中的每个像素点按照灰度值的大小进行排序。
3.计算最小值、最大值和中间值。
4.根据最小值和最大值将像素点分为两个区域。
5.计算两个区域的平均灰度值。
6.计算两个区域的方差。
7.计算阈值。
8.将像素点分为两个区域。
otsu 算法广泛应用于图像处理领域,例如图像分割、目标检测等。
在医学影像处理中,otsu 算法可以用于分割细胞、血管等目标,以便进行定量分析和诊断。
在工业检测中,otsu 算法可以用于分割缺陷、划痕等目标,以便进行自动检测和分类。
虽然otsu 算法在某些情况下可以获得较好的结果,但它也存在一些缺点。
首先,otsu 算法对噪声敏感,当图像中存在大量的噪声时,算法的性能会受到影响。
其次,otsu 算法需要预先设置阈值个数,这可能会对算法的性能产生一定的影响。
opencv实现c++的otsu自适应阈值分割的算法描述
otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果算法具体描述见otsu论文,或冈萨雷斯著名的数字图像处理那本书这里给出程序流程:1、计算直方图并归一化histogram2、计算图像灰度均值avgValue.3、计算直方图的零阶w[i]和一级矩u[i]4、计算并找到最大的类间方差(between-class variance)variance[i]=(avgValue*w[i]-u[i])*(avgValue*w[i]-u[i])/(w[i]*(1-w[i]))对应此最大方差的灰度值即为要找的阈值5、用找到的阈值二值化图像我在代码中做了一些优化,所以算法描述的某些地方跟程序并不一致otsu代码,先找阈值,继而二值化// implementation of otsu algorithm// author: onezeros(@)// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB void cvThresholdOtsu(IplImage* src, IplImage* dst){int height=src->height;int width=src->width;//histogramfloat histogram[256]= {0};for(int i=0; i<height; i++){unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;for(int j=0; j<width; j++){histogram[*p++]++;}}//normalize histogramint size=height*width;for(int i=0; i<256; i++){histogram[i]=histogram[i]/size;}//average pixel valuefloat avgValue=0;for(int i=0; i<256; i++){avgValue+=i*histogram[i];}int threshold;float maxVariance=0;float w=0,u=0;for(int i=0; i<256; i++){w+=histogram[i];u+=i*histogram[i];float t=avgValue*w-u;float variance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);}更多情况下我们并不需要对每一帧都是用otsu寻找阈值,于是可以先找到阈值,然后用找到的阈值处理后面的图像。
Otsu图像分割算法及其在车型识别中应用研究
Otsu图像分割算法及其在车型识别中应用研究摘 要图像分割是模式识别和计算机视觉领域的一个重要研究方向,具有广泛的实用价值。
在目标检测与分割的实际应用中,经常会遇到检测与分割后的图像轮廓模糊等情况,影响到目标检测和分割的效果以及实时应用。
本文在对图像分割的国内外研究现状进行深入探讨的基础上,研究自适应Otsu图像分割算法,并将其应用在与虚拟线圈相结合的交通视频车型识别中。
全文主要内容如下:1.本文在分析和总结国内外研究成果和最新研究技术的基础上,选取基于阈值图像分割技术作为研究的重点,前期进行了大量的调研分析与研究,比较各种基于阈值的图像分割技术的特点。
2.针对传统二维Otsu算法得不足,本文将绝对差和平均离差引入到阈值判别函数的设计中。
先统计图像目标类与背景类各自类内的绝对差,得到总体类内绝对差之和;再统计目标类和背景类两类之间的总体平均离差;然后把总体类内绝对差之和和类间总体离差的商作为阈值识别函数。
实验结果表明,与其它阈值判别函数相比,通过优化新的阈值判别函数得到的二维阈值,具有了较好的分割效果,能够更好地保留了目标物的轮廓,而且计算量小。
3.传统遗传算法对交叉和变异做统一的操作,对收敛性有很大影响,往往会陷入局部最优解,这是一个经典难题,目前有很多学者都针对这个问题进行研究,本文根据不同的适应度值对种群进行分类,对不同的种群采用不同的交叉方法和变异概率,即采用基于海明距离判别的交叉方式、基于动态变化的变异概率,一定程度上避免了陷入局部最优。
实验结果也表明了应用改进的遗传算法所得到的最优阈值显然要好于传统遗传算法能够更早的得到最优解,也更加接近全局最优解,一定程度上克服了传统GA算法的“早熟”问题。
4.通过对图像采集卡采集到的视频序列的车道位置设置虚拟线圈,提出了一种基于多帧考虑的线圈区域内灰度变化来检测车辆的到达,并运用Otsu算法对特定区域运动的车辆进行目标提取,获得车辆的几何特征,通过对几何特征的分析,从而实现的对车型的识别。
一种改进的应用于肤色分割的Otsu算法
一种改进的应用于肤色分割的Otsu算法项敏;李民政【摘要】In order to make up the defects of the traditional Otsu algorithm applied in skin color segmentation,an improved Otsu algorithm is proposed.The search parameter of Otsu algorithm is set to a specific gray value range,so as to achieve the purpose of shortening the skin color segmentation time.Experimental results show that the improved algorithm can re-duce the time complexity on the basis of ensuring the accuracy of skin color segmentation,and will improve the speed of skin color segmentation greatly.%为了弥补应用于肤色分割的传统Otsu算法在速度上存在的缺陷,提出了一种改进的Otsu算法.将Otsu算法的搜索参数设置到特定灰度范围内,从而达到缩短肤色分割时间的目的.实验结果表明,改进的算法能在保证肤色分割准确度的基础上降低时间复杂度,极大地提高了肤色分割的速度.【期刊名称】《桂林电子科技大学学报》【年(卷),期】2017(037)005【总页数】5页(P396-400)【关键词】Otsu算法;时间复杂度;最佳阈值;肤色分割【作者】项敏;李民政【作者单位】桂林电子科技大学计算机与信息安全学院,广西桂林 541004;桂林电子科技大学计算机与信息安全学院,广西桂林 541004【正文语种】中文【中图分类】TP391近年来,随着人脸检测、人脸识别、手势识别以及疲劳驾驶检测等人体图像相关领域的研究发展,肤色分割技术已成为该领域的一个关注重点,因为通过此技术提取出的肤色区域可为后续相关图像处理提供可靠数据。
opencv阈值处理--threshold函数、自适应阈值处理、Otsu处理(大津法)
opencv阈值处理--threshold函数、⾃适应阈值处理、Otsu处理(⼤津法)threshold函数retval, dst = cv2.threshold(src, thresh, maxval, type)'''retval:返回的阈值;dst:阈值分割结果图像src:输⼊图像thresh:阈值;maxval:需设定的最⼤值type:阈值分割类型'''简单的阈值分割类型有:cv.THRESH_BINARYcv.THRESH_BINARY_INVcv.THRESH_TRUNCcv.THRESH_TOZEROcv.THRESH_TOZERO_INV1import matplotlib.pyplot as plt2import numpy as np3import cv2 as cv45 img = cv.imread(r'Lena.png')6 imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)7 t1, rst1 = cv.threshold(imgray,127,255,cv.THRESH_BINARY) # ⼆值化阈值处理。
⼤于127的像素点会被处理为255,其余处理为08 t2, rst2 = cv.threshold(imgray,127,255,cv.THRESH_BINARY_INV) # 反⼆值化阈值处理。
灰度值⼤于127的像素点处理为0,其余为2559 t3, rst3 = cv.threshold(imgray,127,255,cv.THRESH_TRUNC) # 截断阈值化处理。
⼤于127的像素点处理为127,其余保持不变10 t4, rst4 = cv.threshold(imgray,127,255,cv.THRESH_TOZERO_INV) # 超阈值零处理。
⼤于127的像素点处理为0,其余保持不变11 t5, rst5 = cv.threshold(imgray,127,255,cv.THRESH_TOZERO) # 低阈值零处理。
Otsu多阈值分割算法的研究
R esearch of O tsu multi threshold segm entation algorithm
HU Y in g , CU IW ei feng
(D ep t. of C o mp. Sci . , Shangq iu N ormal Univ. , Shangq iu 476001, China)
文章编号 : 1004 1478( 2010) 02 0079 03
O tsu 多阈值分割算法的研究
胡颖, 崔伟峰
( 商丘师范学院 计算机科学系 , 河南 商丘 476001) 摘要: 在图像分割中, 确定阈值是关键, 但已有选择阈值的方法多是单阈值法 , 不适用于多目标识别 . 鉴于此 , 提出了一种改进的基于一维 O tsu 的多阈值分割算法. 该算法通过对图像多次分类、 使用分 离变量合并多余的分类、 使用松弛变量搜索阈值等方法提高了运算速度. 实验效果验证了该算法的 有效性 . 关键词 : 图像分割 ; 一维 O tsu 法 ; 多阈值 中图分类号 : TP 312 文献标志码: A
( t) =
t< i∃ m - 1
#
p ( i) ,
背景部分点数 N 1 ( t ) = MN
0
t∃ i∃ m - 1
#
p ( i ) , 目 标均值
1
( t) =
0∃ i ∃ t 1
#
ip ( t) /
0
( t) , 背 景 均 值 =
0
( t) = ( t) + &
t< i ∃ m - 1 1
#
1 0 0
+ ∋ 其中 ,
k 0
m- 1 k1
k
OpenCV学习:阈值分割
OpenCV学习:阈值分割
⽬标
使⽤固定阈值、⾃适应阈值和Otsu阈值法”⼆值化”图像
OpenCV函数:cv2.threshold(), cv2.adaptiveThreshold()
教程
固定阈值分割
固定阈值分割很直接,⼀句话说就是像素点值⼤于阈值变成⼀类值,⼩于阈值变成另⼀类值。
import cv2
#读⼊灰度图
img = cv2.imread('xxa.Jpeg')
#阈值分割
#cv2.threshold()⽤来实现阈值分割 ,四个参数:原图 , 设定阈值, 最⼤阈值, 阈值⽅式
ret,th = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow('th',th)
cv2.waitKey(0)
⾃适应阈值
看得出来固定阈值是在整幅图⽚上应⽤⼀个阈值进⾏分割,它并不适⽤于明暗分布不均的图⽚。
cv2.adaptiveThreshold()⾃适应阈值会每次取图⽚的⼀⼩部分计算阈值,这样图⽚不同区域的阈值就不尽相同。
它有5个参数,其实很好理解,先看下效果:
cv2.THRESH_BINARY
⼤于阈值转为最⼤值,⼩于转为0
cv2.THRESH_BINARY_INV
inv---反转
cv2.THRESH_TRUNC
⼤于阈值部分为阈值,⼩于不变
cv2.THRESH_TOZERO
⼤于阈值保持不变,⼩于设为0
cv2.THRESH_TOZERO_INV
inv---反转。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果算法具体描述见otsu论文,或冈萨雷斯著名的数字图像处理那本书这里给出程序流程:1、计算直方图并归一化histogram2、计算图像灰度均值avgValue.3、计算直方图的零阶w[i]和一级矩u[i]4、计算并找到最大的类间方差(between-class variance)variance[i]=(avgValue*w[i]-u[i])*(avgValue*w[i]-u[i])/(w[i]*(1-w[i]))对应此最大方差的灰度值即为要找的阈值5、用找到的阈值二值化图像我在代码中做了一些优化,所以算法描述的某些地方跟程序并不一致otsu代码,先找阈值,继而二值化// implementation of otsu algorithm// author: onezeros(@)// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB void cvThresholdOtsu(IplImage* src, IplImage* dst){int height=src->height;int width=src->width;//histogramfloat histogram[256]= {0};for(int i=0; i<height; i++){unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;for(int j=0; j<width; j++){histogram[*p++]++;}}//normalize histogramint size=height*width;for(int i=0; i<256; i++){histogram[i]=histogram[i]/size;}//average pixel valuefloat avgValue=0;for(int i=0; i<256; i++){avgValue+=i*histogram[i];}int threshold;float maxVariance=0;float w=0,u=0;for(int i=0; i<256; i++){w+=histogram[i];u+=i*histogram[i];float t=avgValue*w-u;float variance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);}// implementation of otsu algorithm// author: onezeros(@)// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB void cvThresholdOtsu(IplImage* src, IplImage* dst){int height=src->height;int width=src->width;//histogramfloat histogram[256]= {0};for(int i=0; i<height; i++){unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;for(int j=0; j<width; j++){histogram[*p++]++;}}//normalize histogramint size=height*width;for(int i=0; i<256; i++){histogram[i]=histogram[i]/size;}//average pixel valuefloat avgValue=0;for(int i=0; i<256; i++){avgValue+=i*histogram[i];}int threshold;float maxVariance=0;float w=0,u=0;for(int i=0; i<256; i++){w+=histogram[i];u+=i*histogram[i];float t=avgValue*w-u;float variance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);}更多情况下我们并不需要对每一帧都是用otsu寻找阈值,于是可以先找到阈值,然后用找到的阈值处理后面的图像。
下面这个函数重载了上面的,返回值就是阈值。
只做了一点改变// implementation of otsu algorithm// author: onezeros(@)// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLABint cvThresholdOtsu(IplImage* src){int height=src->height;int width=src->width;//histogramfloat histogram[256]= {0};for(int i=0; i<height; i++){unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;for(int j=0; j<width; j++){histogram[*p++]++;}}//normalize histogramint size=height*width;for(int i=0; i<256; i++){histogram[i]=histogram[i]/size;}//average pixel valuefloat avgValue=0;for(int i=0; i<256; i++){avgValue+=i*histogram[i];}int threshold;float maxVariance=0;float w=0,u=0;for(int i=0; i<256; i++){w+=histogram[i];u+=i*histogram[i];float t=avgValue*w-u;float variance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}return threshold;}// implementation of otsu algorithm// author: onezeros(@)// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLABint cvThresholdOtsu(IplImage* src){int height=src->height;int width=src->width;//histogramfloat histogram[256]= {0};for(int i=0; i<height; i++){unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;for(int j=0; j<width; j++){histogram[*p++]++;}}//normalize histogramint size=height*width;for(int i=0; i<256; i++){histogram[i]=histogram[i]/size;}//average pixel valuefloat avgValue=0;for(int i=0; i<256; i++){avgValue+=i*histogram[i];}int threshold;float maxVariance=0;float w=0,u=0;for(int i=0; i<256; i++){w+=histogram[i];u+=i*histogram[i];float t=avgValue*w-u;float variance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}return threshold;}我在手的自动检测中使用这个方法,效果很好。
下面是使用上述两个函数的简单的主程序,可以试运行一下,如果处理视频,要保证第一帧时,手要在图像中。
#include <cv.h>#include <cxcore.h>#include <highgui.h>#pragma comment(lib,"cv210d.lib")#pragma comment(lib,"cxcore210d.lib")#pragma comment(lib,"highgui210d.lib")#include <iostream>using namespace std;int main(int argc, char** argv){#ifdef VIDEO //video processCvCapture* capture=cvCreateCameraCapture(-1);if (!capture){cout<<"failed to open camera"<<endl;exit(0);}int threshold=-1;IplImage* img;while (img=cvQueryFrame(capture)){cvShowImage("video",img);cvCvtColor(img,img,CV_RGB2YCrCb);IplImage* imgCb=cvCreateImage(cvGetSize(img),8,1);cvSplit(img,NULL,NULL,imgCb,NULL);if (threshold<0){threshold=cvThresholdOtsu(imgCb);}//cvThresholdOtsu(imgCb,imgCb);cvThreshold(imgCb,imgCb,threshold,255,CV_THRESH_BINARY);cvErode(imgCb,imgCb);cvDilate(imgCb,imgCb);cvShowImage("object",imgCb);cvReleaseImage(&imgCb);if (cvWaitKey(3)==27) //esc{break;}}cvReleaseCapture(&capture);#else //single image processconst char* filename=(argc>=2?argv[1]:"cr.jpg");IplImage* img=cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE);cvThresholdOtsu(img,img);cvShowImage( "src", img );char buf[256];sprintf_s(buf,256,"%s.otsu.jpg",filename);cvSaveImage(buf,img);cvErode(img,img);cvDilate(img,img);cvShowImage( "dst", img );sprintf_s(buf,256,"%s.otsu.processed.jpg",filename);cvSaveImage(buf,img);cvWaitKey(0);#endifreturn 0;}#include <cv.h>#include <cxcore.h>#include <highgui.h>#pragma comment(lib,"cv210d.lib")#pragma comment(lib,"cxcore210d.lib")#pragma comment(lib,"highgui210d.lib")#include <iostream>using namespace std;int main(int argc, char** argv){#ifdef VIDEO //video processCvCapture* capture=cvCreateCameraCapture(-1);if (!capture){cout<<"failed to open camera"<<endl;exit(0);}int threshold=-1;IplImage* img;while (img=cvQueryFrame(capture)){cvShowImage("video",img);cvCvtColor(img,img,CV_RGB2YCrCb);IplImage* imgCb=cvCreateImage(cvGetSize(img),8,1);cvSplit(img,NULL,NULL,imgCb,NULL);if (threshold<0){threshold=cvThresholdOtsu(imgCb);}//cvThresholdOtsu(imgCb,imgCb);cvThreshold(imgCb,imgCb,threshold,255,CV_THRESH_BINARY);cvErode(imgCb,imgCb);cvDilate(imgCb,imgCb);cvShowImage("object",imgCb);cvReleaseImage(&imgCb);if (cvWaitKey(3)==27) //esc{break;}}cvReleaseCapture(&capture);#else //single image processconst char* filename=(argc>=2?argv[1]:"cr.jpg");IplImage* img=cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE);cvThresholdOtsu(img,img);cvShowImage( "src", img );char buf[256];sprintf_s(buf,256,"%s.otsu.jpg",filename);cvSaveImage(buf,img);cvErode(img,img);cvDilate(img,img);cvShowImage( "dst", img );sprintf_s(buf,256,"%s.otsu.processed.jpg",filename);cvSaveImage(buf,img);cvWaitKey(0);#endifreturn 0;}。