码迷,mamicode.com
首页 > 其他好文 > 详细

关于阀值 && OSTU算法

时间:2014-06-24 15:08:33      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   http   tar   color   

bubuko.com,布布扣

photoshop中的解释:阈值”命令将灰度或彩色图像转换为高对比度的黑白图像。可以指定某个色阶作为阈值。所有比阈值亮的像素转换为白色;而所有比阈值暗的像素转换为黑色。“阈值”命令对确定图像的最亮和最暗区域很有用。

       如果图像的像素等于阀值时怎么处理呢?

   如果是普通图片,怎么处理都不怎么影响,可当图片是二值化之后的,会怎么样呢?传一张全白的怎么样呢?

   这可能存在的隐形问题如果没考虑到,会有出乎意料的结果。

int otsuThreshold(int *data, int size)//buf里保存的是
{
	int pixelCount[GrayScale];
	float pixelPro[GrayScale];
	int *pdata = data;
	int i, j, pixelSum = size, threshold = 0;

	for(i = 0; i < GrayScale; i++)
	{
		pixelCount[i] = 0;
		pixelPro[i] = 0;
	}

	//统计灰度级中每个像素在整幅图像中的个数

	for(j = 0;j < pixelSum;j++)
	{
		i = *pdata++;
		pixelCount[i]++;
	}

	//计算每个像素在整幅图像中的比例
	for(i = 0; i < GrayScale; i++)
	{
		pixelPro[i] = (float)pixelCount[i] / pixelSum;
	}

	//遍历灰度级[0,255]
	float w0, w1, u0tmp, u1tmp, u0, u1, u, 
		deltaTmp, deltaMax = 0;
	for(i = 0; i < GrayScale; i++)
	{
		w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
		for(j = 0; j < GrayScale; j++)
		{
			if(j <= i)   //背景部分
			{
				w0 += pixelPro[j];
				u0tmp += j * pixelPro[j];
			}
			else   //前景部分
			{
				w1 += pixelPro[j];
				u1tmp += j * pixelPro[j];
			}
		}
		u0 = u0tmp / w0;
		u1 = u1tmp / w1;
		u = u0tmp + u1tmp;
		deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);
		if(deltaTmp > deltaMax)
		{
			deltaMax = deltaTmp;
			threshold = i;
		}
	}
	return threshold;
}

  当一个图片背景大部分为白色时,而其图片特征轮廓可能是灰色和黑色分界,对着局部区域取阀值比较可取,如下:

/*-----------------------------------------/
一个图片宽度固定,但仅对x, y区域的求阀值
x是从行头开始的宽,y是固定大小的height,
这个程序是对图像左半部x求阀值 -----------------------------------------*/ int otsuThreshold(int *data, int x, int y, int width) { int pixelCount[GrayScale]; float pixelPro[GrayScale]; int *pdata = data; int i, j, pixelSum = x*y, threshold = 0; for(i = 0; i < GrayScale; i++) { pixelCount[i] = 0; pixelPro[i] = 0; } //统计灰度级中每个像素在整幅图像中的个数 int n; for(i = 0; i < y; i++) { for(j = 0; j < x; j++) { n = *(pdata + i*width + j); pixelCount[n]++; } } //计算每个像素在整幅图像中的比例 for(i = 0; i < GrayScale; i++) { pixelPro[i] = (float)pixelCount[i] / pixelSum; } //遍历灰度级[0,255] float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0; for(i = 0; i < GrayScale; i++) { w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0; for(j = 0; j < GrayScale; j++) { if(j <= i) //背景部分 { w0 += pixelPro[j]; u0tmp += j * pixelPro[j]; } else //前景部分 { w1 += pixelPro[j]; u1tmp += j * pixelPro[j]; } } u0 = u0tmp / w0; u1 = u1tmp / w1; u = u0tmp + u1tmp; deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2); if(deltaTmp > deltaMax) { deltaMax = deltaTmp; threshold = i; } } return threshold; }

  

关于阀值 && OSTU算法,布布扣,bubuko.com

关于阀值 && OSTU算法

标签:style   class   blog   http   tar   color   

原文地址:http://www.cnblogs.com/chagmf/p/3805819.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!