• 关于阀值 && 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; }

      

  • 相关阅读:
    自学数据分析书单2
    自学的数据分析书单
    @RequestBody, @ResponseBody 注解详解(转)
    @RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)
    @RequestMapping 用法详解之地址映射(转)
    关于java属性字段命名
    jQuery对象和DOM对象使用说明
    UAP开发错误之The given System.Uri cannot be converted into a Windows.Foundation.Uri(windows phone背景更换)
    Windows Azure之Mobile Service
    .NET重思(二)接口和抽象类的取舍
  • 原文地址:https://www.cnblogs.com/chagmf/p/3805819.html
Copyright © 2020-2023  润新知