基于VC的最大类间方差(Otsu)方法分割图像

基于VC的最大类间方差(Otsu)方法分割图像

该程序所用的算法: 大津阈值分割算法(OTSU处理图像)

算法描述:
在这里插入图片描述

void Otsu(void)
{
	float TCandidate[256]={0},TC=0,T=0;
	int i,j,k=0;
	float w0=0,w1=0;
	float u0=0,u1=0;
	for(k=0;k<=255;k++)//get Best T
	{
		u0=0;u1=0;w0=0;w1=0;
		for(i=0;i<N;i++)
    	{
    		for(j=0;j<M;j++)
        	{
				if(image[i][j]<=k)
				{
					w0++;//front
					u0+=image[i][j];
				}
				else
				{
					w1++;//background
					u1+=image[i][j];
				}
			}
		}
		u0/=w0;
		u1/=w1;
		w0/=(M*N);
		w1/=(M*N);
		TCandidate[k]=w0*w1*pow(u0-u1,2);
	}
	for(i=0;i<256;i++)//find the best threshold value
	{
		if(TCandidate[i]>=TC)
		{
			TC=TCandidate[i];
			T=i;
		}
		else 
			continue;
	}
	for(i=0;i<N;i++)
    {
    	for(j=0;j<M;j++)
        {
			if(image[i][j]<=T)
				imageT[i][j]=0;
			else
				imageT[i][j]=255;
		}
	}
	for(i=1;i<N;i++)
        for(j=1;j<M;j++)
        image[i][j]=imageT[i][j];
}`

Otsu算法与固定阈值分割算法的对比:

固定阈值分割算法的C语言实现:
在这里我随意选定了一个灰度阈值:100。

void SThresholdSeg(void)
{
	int t,i,j;
	printf("Enter Threshold value:\n");
	scanf("%d",&t);	
	
	for(i=0;i<N;i++)
    {
    	for(j=0;j<M;j++)
        {
			if(image[i][j]<=t)
				imageT[i][j]=0;
			else
				imageT[i][j]=255;
		}
	}
	for(i=1;i<N;i++)
        for(j=1;j<M;j++)
        image[i][j]=imageT[i][j];
}
原图

在这里插入图片描述

采用固定阈值分割算法后输出的二值图像为:

在这里插入图片描述
而使用Otsu算法的图像为:
在这里插入图片描述
对比可以看出采用OTSU算法处理的图像在经过二值化后图像特征保存的更好。

调试过程中可以查看到该图像在类方差最大时的灰度值为146,即经过遍历后得出的最佳分割阈值为146。则以此灰度值为阈值分割出的二值图像保留了原图像最多的信息。

因此,该算法可以部署在一些算力不高的单片机、DSP以及一些对程序运行时间要求较高的场合。用于把信息量较大的图像转换为二值图像,同时最大程度保证图像特征不丢失。为系统的判决服务。
最佳阈值

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CmosWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值