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

      

  • 相关阅读:
    剑指offer之 二维数组的查找
    常用的基础算法总结之 希尔排序
    让shell脚本中的echo输出带颜色
    nginx利用lua实现nginx反向代理proxy_store缓存文件自删除
    LNMP平滑升级nginx并安装ngx_lua模块教程
    nginx的luajit安装luarocks并安装luafilesystem
    PHP图片识别成文字
    使用tesseract-ocr破解网站验证码
    利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
    http://ocr.wdku.net/
  • 原文地址:https://www.cnblogs.com/chagmf/p/3805819.html
Copyright © 2011-2022 走看看