zoukankan      html  css  js  c++  java
  • 关于阀值 && OSTU算法

    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; }

      

  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/chagmf/p/3805819.html
Copyright © 2011-2022 走看看