首页天道酬勤为什么要将图像灰度化,otsu阈值分割优缺点

为什么要将图像灰度化,otsu阈值分割优缺点

张世龙 05-12 22:22 21次浏览

灰度图像的自动阈值分割(Otsu法)机器视觉领域的许多算法首先要求图像二值化。 这种二值化操作阈值的选择非常重要。 如果阈值选择不当,得到的结果可能没有用。 今天我们来谈谈如何自动计算阈值。 这种方法被称为Otsu法。 发明者是日本人,被称为Nobuyuki Otsu (大津展之)。

简单地说,该算法假设图像由前景颜色和背景颜色组成,并以统计学方法选择阈值,使得该阈值尽量分离前景颜色和背景颜色。 更准确地说,在某种判断标准下是最佳的。 与数理统计领域的费休线性判别算法其实是等价的。

otsu算法中的这个判断标准是最大类间方差(intra-classvarianceorthevariancewithintheclass )。 这里详细说明了什么是intra-class variance。

因为知道灰度的图像,所以可以计算该颜色的平均值,也可以更进一步。 可以计算灰度直方图。

例如,以下示例的照片:

这张照片是拍条形码的。 在此图中,前景颜色为黑色条形码,背景颜色为其馀部分的灰色。 可以计算此图像的灰度直方图。

图中的大峰值是背景色的部分,小峰值是前景色。

平均灰度值为122。 这个平均值称为m。

在此选择任意灰度值t,可以将该直方图分为前后。 这两个部分分别称为a和b。 对应于前景色和背景色。 这两个部分各自的平均值为MA和MB。

将a部分的像素数占全部像素数的比例设为PA,将b部分的像素数占全部像素数的比例设为PB。

Nobuyuki Otsu将类间方差定义如下。

icv=pa(mam ) 2pb (MBM ) 2

该最佳阈值t是使ICV最大化的值。

对于以上的测试图像,我们可以取t的各种值来计算ICV。 然后,可以画出这样的ICV曲线(绿线)。

可见,ICV取最大值的点确实区分了前景颜色和背景颜色。

以下是示例代码,使用了Qt的QImage。

intotsu(constqimageimage ) {双主机[ 256 ]; 标准化的histogram (image,hist ); 双面omega [ 256 ]; 双穆[ 256 ]; omega[0]=hist[0]; mu[0]=0; for(intI=1; i 256; I ) { omega[i]=omega[i-1] hist[i]; //累积分布函数mu[i]=mu[i-1] i * hist[i]; }双面=mu [ 255 ]; //灰度平均值double max=0; int k_max=0; for(intk=1; k 255; k ) {双pa=omega [ k ]; //A类所占比例double PB=1 - omega[k]; //B类所占比例double value=0; if(Fabs(pa ) 0.001 fabs (Pb ) 0.001 ) { double MA=mu[k]/PA; //A类灰度平均双精度MB=(均值- mu [ k ] )/PB; //B类灰度平均值value=pa*(* (MA - mean ) ) ma-mean (Pb * ) * (MB - mean ) ) * (MB - mean ); //类间方差if (值最大) { max=值; k_max=k; }//q调试(k ' ' hist [ k ] ' ' value; } return k_max; } boolnormalizedhistogram (constqimageimage,双主机[ 256 ] ) for(intI=0; i 256; I ) { hist[i]=0.0; (} int height=image.height ); int width=image.width (; int N=height * width; if(image.format )!=qimage :3360 format _ indexed8({返回假; }for(intI=0; i height; I ) const quint8* pdata=(const quint8* ) image.constScanLine(i ) I; for(intj=0; j width; j () { hist[ pData[j] ]; }for(intI=0; i 256; I ) { hist[i]=hist[i]/N; }返回真; }用该方法计算出的阈值二值化后的图像如下。

可见效果很好。

Otsu方法也不是万能的。 当目标与背景大小比例极大时,类间方差准则函数可能呈双峰或多峰,效果较差。 这个时候必须考虑其他方法。

其实,可以仔细观察ICV的计算公式。

icv=pa(mam ) 2pb (MBM ) 2

其中的PA和PB相当于对前景颜色和背景颜色的部分进行加权。 如果当前景色或背景色具有区域。 例如PA很小。 于是,计算出的t接近b区域,这种情况下的分割效果降低。 我们可以稍微改造一下ICV的公式。

icv=pa(mam ) 2pb(MBM ) 2

这里的可以取0-1之间的值。 例如,上例的图像,取=0.8进行计算更有效。 当然这个值都要依靠经验来决定。

局部阈值分割算法matlab,阈值分割法缺点 图像二值化如何选取阈值,阈值法图像处理