精华内容
下载资源
问答
  • 灰度图像二值化

    2013-11-14 16:05:39
    这是一个基于OpenCV的灰度图像二值化程序,可移植性强,运行完全没有问题,注意显示的图片路径根据需要更改一下。。。
  • 灰度图像二值化方法研究,灰度图像二值化方法研究,灰度图像二值化方法研究,灰度图像二值化方法研究
  • 灰度图像二值化 一、知识简介 图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。 在数字图像处理中,二值图像占有非常重要的地位,图像...

    灰度图像二值化

    一、知识简介

    图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
    在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

    二、灰度图像二值化原理

    当灰度图像的像素值大于某个阈值时将该灰度值设置为最大 反之设置为最小,此时灰度图只有最亮和最黑。

    1、将RGB值转化为[0,1]浮点数 或者[0,255]
    2、 二值化:

    if (img_gray[i, j] <= 0.5): 或者<=128

    img_gray[i, j] = 0

    else:

    img_gray[i, j] = 1

    三、python实现

    import cv2
    # 以灰度图的方式读取图片
    img_gray = cv2.imread("image0.JPG", 0)
    cv2.imshow("Scr", img_gray)
    cv2.waitKey(0)
    
    # 归一化(0,1)
    img_gray = img_gray / 255
    cv2.imshow("Normalization", img_gray)
    cv2.waitKey(0)
    
    # 二值化
    img_gray_h,img_gray_w = img_gray.shape
    for i in range(img_gray_h):
        for j in range(img_gray_w):
            if (img_gray[i][j] <= 0.5):
                img_gray[i][j] = 0
            else:
                img_gray[i][j] = 1
    
    cv2.imshow("Binarization", img_gray)
    cv2.waitKey(0)
    
    
    展开全文
  • 【数字图像处理】灰度图像二值化

    千次阅读 2019-10-08 00:56:27
    灰度图像 每副图像的每个像素对应二维空间中一个特定的位置,并且有一个或者多...灰度图像二值化 二值化:以一个值(阈值)为基准,大于(等于)这个值的数全部变为是1(或者0),小于等于这个数的就全部将他们变...

     

    灰度图像

    每副图像的每个像素对应二维空间中一个特定的位置,并且有一个或者多个与那个点相关的采样值组成数值。

    灰度图像,也称为灰阶图像,图像中每个像素可以由0(黑)到255(白)的亮度值(Intensity)表示。0-255之间表示不同的灰度级。

     

    灰度图像二值化

    二值化:以一个值(阈值)为基准,大于(等于)这个值的数全部变为是1(或者0),小于等于这个数的就全部将他们变为0(或1)。

    二值化算法处理飞思卡尔赛道思路:设定一个阈值valve,对于图像矩阵中的每一行,从左至右比较各像素值和阈值的大小,若像素值大于或等于阈值,则判定该像素对应的是白色赛道;反之,则判定对应的是黑色的目标引导线。

    记下第一次和最后一次出现像素值小于阈值时的像素点的列号,算出两者的平均值,以此作为该行上目标引导线的位置。

    摄像头的二值化的代码:

     
    
    Void image_binaryzation()
    
    {
    
    for(int i=0;i
    
    {
    
        for(int j=0;j
    
        {
    
    if(Image[i][j] >= Threshold)
    
           Image_new[i][j]=1;
    
    else
    
        Image_new[i][j]=0;
    
        }
    
    }
    
    }

    Row是对应采集到的行数,Col是列数,Image[i][j]是摄像头采集未二值化的数据存放的数组,Img[i][j]是新建的存放二值化后的数组。

     

    合适的阈值

    在阈值二值化中,最主要的是选取合适的阈值,这也是二值化的难点所在。常用的二值化阈值选取方法有双峰法、p参数法、大律法(Otsu法)、最大熵阈值法、迭代法等。

    大律法(Otsu法)

    Otsu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为:
    1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个bin的像素点数量
    2) 归一化直方图,也即将每个bin中像素点数量除以总的像素点
    3) i表示分类的阈值,也即一个灰度级,从0开始迭代
    4) 通过归一化的直方图,统计0~i 灰度级的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例w0,并统计前景像素的平均灰度u0;统计i~255灰度级的像素(假设像素值在此范围的像素叫做背景像素) 所占整幅图像的比例w1,并统计背景像素的平均灰度u1;
    5) 计算前景像素和背景像素的方差 g = w0*w1*(u0-u1) (u0-u1)
    6) i++;转到4),直到i为256时结束迭代
    7)将最大g相应的i值作为图像的全局阈值
    缺陷:OSTU算法在处理光照不均匀的图像的时候,效果会明显不好,因为利用的是全局像素信息。
    解决光照不均匀:https://blog.csdn.net/kk55guang2/article/details/78475414
                  https://blog.csdn.net/kk55guang2/article/details/78490069
                  https://wenku.baidu.com/view/84e5eb271a37f111f0855b2d.html
    ***************************************************************/ 
    int GetOSTU(uint8_t tmImage[Use_ROWS][Use_Line]) 
    { 
    /**
      * @brief    未优化过的大津法
      *
      * @param    运算时间比较长
      *
      * @return   实测120*160的图像
      *
      * @note     K66 220MHz需要9ms
      *
      * @example  
      *
      * @date     2019/4/16 星期二
      */
    //    int width = Use_ROWS;
    //    int height = Use_Line;
    //    int x = 0, y = 0;
    //    int pixelCount[256];
    //    float pixelPro[256];
    //    int i, j, pixelSum = width * height, threshold = 0;
    //    
    //    
    //    //初始化
    //    for (i = 0; i < 256; i++)
    //    {
    //        pixelCount[i] = 0;
    //        pixelPro[i] = 0;
    //    }
    //    
    //    //统计灰度级中每个像素在整幅图像中的个数
    //    for (i = y; i < height; i++)
    //    {
    //        for (j = x; j <width; j++)
    //        {
    //            pixelCount[tmImage[i][j]]++;
    //        }
    //    }
    //    
    //    //计算每个像素在整幅图像中的比例
    //    for (i = 0; i < 256; i++)
    //    {
    //        pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);
    //    }
    //    
    //    //经典ostu算法,得到前景和背景的分割
    //    //遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值
    //    float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;
    //    for (i = 0; i < 256; i++)
    //    {
    //        w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
    //        
    //        for (j = 0; j < 256; j++)
    //        {
    //            if (j <= i) //背景部分
    //            {
    //                //以i为阈值分类,第一类总的概率
    //                w0 += pixelPro[j];
    //                u0tmp += j * pixelPro[j];
    //            }
    //            else       //前景部分
    //            {
    //                //以i为阈值分类,第二类总的概率
    //                w1 += pixelPro[j];
    //                u1tmp += j * pixelPro[j];
    //            }
    //        }
    //        
    //        u0 = u0tmp / w0;        //第一类的平均灰度
    //        u1 = u1tmp / w1;        //第二类的平均灰度
    //        u = u0tmp + u1tmp;        //整幅图像的平均灰度
    //        //计算类间方差
    //        deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);
    //        //找出最大类间方差以及对应的阈值
    //        if (deltaTmp > deltaMax)
    //        {
    //            deltaMax = deltaTmp;
    //            threshold = i;
    //        }
    //    }
    //    //返回最佳阈值;
    //    return threshold;
        
    /**
      * @brief    优化过的大津法
      *
      * @param    大大减少运算时间
      *
      * @return   实测K66 220MHz 120*160的图像
      *
      * @note     只需要1.5ms
      *
      * @example  未优化的大津法需要9ms
      *
      * @date     2019/4/16 星期二
      */ 
        int16_t i,j; 
        uint32_t Amount = 0; 
        uint32_t PixelBack = 0; 
        uint32_t PixelIntegralBack = 0; 
        uint32_t PixelIntegral = 0; 
        int32_t PixelIntegralFore = 0; 
        int32_t PixelFore = 0; 
        float OmegaBack, OmegaFore, MicroBack, MicroFore, SigmaB, Sigma; // 类间方差; 
        int16_t MinValue, MaxValue; 
        uint8_t Threshold = 0;
        uint8_t HistoGram[256];              //  
        
        for (j = 0; j < 256; j++)  HistoGram[j] = 0; //初始化灰度直方图 
        
        for (j = 0; j < Use_ROWS; j++) 
        { 
            for (i = 0; i < Use_Line; i++) 
            { 
                HistoGram[tmImage[j][i]]++; //统计灰度级中每个像素在整幅图像中的个数
            } 
        } 
        
        for (MinValue = 0; MinValue < 256 && HistoGram[MinValue] == 0; MinValue++) ;        //获取最小灰度的值
        for (MaxValue = 255; MaxValue > MinValue && HistoGram[MinValue] == 0; MaxValue--) ; //获取最大灰度的值
        
        if (MaxValue == MinValue)      return MaxValue;         // 图像中只有一个颜色    
        if (MinValue + 1 == MaxValue)  return MinValue;         // 图像中只有二个颜色
        
        for (j = MinValue; j <= MaxValue; j++)    Amount += HistoGram[j];        //  像素总数
        
        PixelIntegral = 0;
        for (j = MinValue; j <= MaxValue; j++)
        {
            PixelIntegral += HistoGram[j] * j;//灰度值总数
        }
        SigmaB = -1;
        for (j = MinValue; j < MaxValue; j++)
        {
            PixelBack = PixelBack + HistoGram[j];   //前景像素点数
            PixelFore = Amount - PixelBack;         //背景像素点数
            OmegaBack = (float)PixelBack / Amount;//前景像素百分比
            OmegaFore = (float)PixelFore / Amount;//背景像素百分比
            PixelIntegralBack += HistoGram[j] * j;  //前景灰度值
            PixelIntegralFore = PixelIntegral - PixelIntegralBack;//背景灰度值
            MicroBack = (float)PixelIntegralBack / PixelBack;   //前景灰度百分比
            MicroFore = (float)PixelIntegralFore / PixelFore;   //背景灰度百分比
            Sigma = OmegaBack * OmegaFore * (MicroBack - MicroFore) * (MicroBack - MicroFore);//计算类间方差
            if (Sigma > SigmaB)                    //遍历最大的类间方差g //找出最大类间方差以及对应的阈值
            {
                SigmaB = Sigma;
                Threshold = j;
            }
        }
        return Threshold;                        //返回最佳阈值;
    } 

    可以参考文献

    https://wenku.baidu.com/view/acc24dcf680203d8ce2f2469.html

    https://wenku.baidu.com/view/bb6e38f7c8d376eeaeaa3163.html

     

    二值化图像去噪

    对于二值化图像而言,去除噪声是很重要的一步。

    思路:对任意像素点判断是否为0,取得该像素点周围8个或者四个像素点相加,总和等于255 * 8或者 255 *4,则说明该像素点为噪声,置为255。

    注意:领域的计算方法是没有边界的,所以通常不计算图像四边。

                int bai;
                        for(int i = 1; i < Use_ROWS-1; i++)   
                        {
                            for(int j =1; j < Use_Line-1; j++)
                            { if(Image_Use[i-1][j] == 255) continue;     
                              bai = Image_Use[i-1][j] + Image_Use[i-1][j-1] + Image_Use[i-1][j+1] +Image_Use[i][j+1] +Image_Use[i][j-1] +Image_Use[i+1][j] +Image_Use[i+1][j-1] +Image_Use[i+1][j+1] ;
                              if(bai == 2040)
                              Image_Use[i][j] = 255;
                              
                            }
                        }

     

    转载于:https://www.cnblogs.com/-wenli/p/11486877.html

    展开全文
  • 灰度图像二值化处理

    2018-06-20 18:11:38
    图像灰度化处理算法,涵盖几种经典二值化算法的实现,如:灰度平均值,黄氏模糊阈值,谷底最小值,等13中二值化阈值选择方法
  • 灰度图像二值化代码

    2015-11-20 11:11:54
    用于对灰度图像进行二值化分割,采用贝叶斯方法计算阈值
  • 本文对灰度图像二值化的方法进行研究.提出了一种新的以大津法为基础的图像分块二值化方法。
  • 灰度图像二值化阈值otsuthreshold(C语言)相当于matlab中threshold函数
  • Otsu算法 灰度图像二值化

    千次阅读 2015-10-21 21:24:54
    Otsu方法是一种全局化的动态二值化方法,又叫大津法,是一种灰度图像二值化的常用算法。该算法的基本思想是:设使用某一个阈值将灰度图像根据灰度大小,分成目标部分和背景部分两类,在这两类的类内方差最小和类间...
     Otsu方法是一种全局化的动态二值化方法,又叫大津法,是一种灰度图像二值化的常用算法。该算法的基本思想是:设使用某一个阈值将灰度图像根据灰度大小,分成目标部分和背景部分两类,在这两类的类内方差最小和类间方差最大的时候,得到的阈值是最优的二值化阈值。

        我个人对这个算法实践后的结果是:这个算法在光照均匀的时候,可以得到很好的效果,大多数情况下,都可以的到相当不错的效果。而且其本质是很好理解的。说通俗一点的比方,用一个分数线将班上所有学生的成绩分为好学生和差学生两类,要使两类学生的区分看起来最明显,很显然要达到的效果是:好学生和差学生之间要区别最大,同时好学生和好学生之间分数不能拉太大,同时差学生和差学生之间也差距不大。

        回到图像的问题上来,对一幅N×M个像素的图像来说。

    1°.首先计算图像的平均灰度u,计算如下:
        对于一张大小M×N的图像,统计得到全部图像中灰度为i对应的像素个数n(i),于是该图像的平均灰度值
        u=∑i*n(i)/(M*N);

    2°.列出求解最佳阀值t的相关变量
        记t为目标与背景的分割阈值,记目标像素(灰度大于t)占图像的比例为w1,记目标像素的平均灰度为u1:
        w1= W1/(M*N),其中的W1是灰度值大于t的统计数
        u1= ∑i*n(i)/W1, i>t.
        同理,得到背景像素占图像的比例w2,背景像素的平均灰度u2。

    3°.求解最佳阀值t是类差别最大
        遍历2°中的t,使得G=w1*(u1-u)*(u1-u)+w2*(u2-u)*(u2-u)最大.

        G最大时,即得到了最佳阈值,与上式子等价的还有:G=(u1-u)*(u1-u)*(u2-u)*(u2-u);最大

    两者的等价关系很容易证明。
    展开全文
  • 这次简单的写了灰度图像二值化。。这是什么概念呢? 图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的...

    前天闲着没事干,就写了写BMP图像处理,感觉大家还比较感兴趣。。所以现在没事,继续更新。。这次简单的写了灰度图像二值化。。这是什么概念呢?

    图像的二值化的基本原理

       图像的二值化处理就是将图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。

     

    相信大家看到这里应该觉得很简单吧。。二值化就是把原来灰度图像中每个像素的值要么变成255(白色),要么变为0(黑色)。(

    代码:

    #include<iostream>
    #include <Windows.h>
    
    using namespace std;
    
    
    void main()
    {
    	int threshold=200;
    	FILE* stream=fopen("D:\\6.bmp","rb");
    	if(stream==NULL)
    	{
    		cout<<"文件不存在"<<endl;
    		return;
    	}
    	
    	int sizeFileHeader=sizeof(BITMAPFILEHEADER);
    	int sizeInfoHeader=sizeof(BITMAPINFOHEADER);
    	
    	BITMAPFILEHEADER* bitmapFileHeader=new BITMAPFILEHEADER[sizeFileHeader+1];
    	
    	BITMAPINFOHEADER* bitmapInfoHeader=new BITMAPINFOHEADER[sizeInfoHeader+1];
    	
    	memset(bitmapFileHeader,0,sizeFileHeader+1);
    	memset(bitmapInfoHeader,0,sizeInfoHeader+1);
    	fread(bitmapFileHeader,sizeof(char),sizeFileHeader,stream);
    	fseek(stream,sizeFileHeader,0);
    	fread(bitmapInfoHeader,sizeof(char),sizeInfoHeader,stream);
    	fseek(stream,sizeInfoHeader+sizeFileHeader,0);
    	RGBQUAD* pRgbQuards=new RGBQUAD[256];
    	for (int k=0;k<256;k++)
    	{
    		fread(&pRgbQuards[k],sizeof(RGBQUAD),1,stream);
    	}
    	
    	int count=(((bitmapInfoHeader->biWidth)*8+31)/32)*4-bitmapInfoHeader->biWidth*(bitmapInfoHeader->biBitCount/8);
    	BYTE* tempData=new BYTE[count+1];
    	memset(tempData,0,count+1);
    	fseek(stream,sizeFileHeader+sizeInfoHeader+256*sizeof(RGBQUAD),0);
    	BYTE** data=new BYTE*[bitmapInfoHeader->biHeight];
    	for(int i=0;i<bitmapInfoHeader->biHeight;i++)
    	{
    		data[i]=new BYTE[bitmapInfoHeader->biWidth];
    		for (int j=0;j<bitmapInfoHeader->biWidth;j++)
    		{
    			fread(&data[i][j],sizeof(char),1,stream);
    			if(data[i][j]>threshold)
    				data[i][j]=255;
    			else
    				data[i][j]=0;
    		}
    		for (int n=0;n<count;n++)
    		{
    			fread(&tempData[n],sizeof(char),1,stream);
    		}
    	}
    	
    	fclose(stream);
    	
    
    
    	//写入。。
    	FILE* fileWrite=fopen("D:\\9.bmp","a+");
    	fwrite(bitmapFileHeader,sizeof(char),sizeof(BITMAPFILEHEADER),fileWrite);
    	fwrite(bitmapInfoHeader,sizeof(char),sizeof(BITMAPINFOHEADER),fileWrite);
    	fwrite(pRgbQuards,sizeof(RGBQUAD),256,fileWrite);
    
    	for(int i=0;i<bitmapInfoHeader->biHeight;i++)
    	{
    		for(int j=0;j<bitmapInfoHeader->biWidth;j++)
    		{
    			fwrite(&data[i][j],sizeof(BYTE),1,fileWrite);
    		}
    		for(int m=0;m<count;m++)
    			fwrite(&tempData[m],sizeof(char),1,fileWrite);
    	}
    	fclose(fileWrite);
    
    	cout<<"success"<<endl;
    }


    这里我就不解释了。看了前几篇文章肯定觉的very easy....

    效果:

    原图:

    二值图:

     

    MY QUESTION:上面说了二值化就是变成二值化图像,而我在网上查了资料说二值化图像像素的大小是1位,这就和上面说的不符合了,应该上面介绍的是还是8位。所以我就有些不懂了。。希望大神可以给我解释解释....

    转载于:https://www.cnblogs.com/james1207/p/3255894.html

    展开全文
  • 改进的EM算法在分块灰度图像二值化中的应用
  • Otsu方法是一种全局化的动态二值化方法,又叫大津法,是一种灰度图像二值化的常用算法。该算法的基本思想是:设使用某一个阈值将灰度图像根据灰度大小,分成目标部分和背景部分两类,在这两类的类内方差最小和类间...
  • 基于简单遗传算法的灰度图像二值化,采用的适应度函数为类间距最小、类内距最大,经过简单的修改可以处理任意格式的文件。
  • 在很多图像处理的过程中,经常需要对灰度图像进行二值化。本文对几种常用的图像二值化算法进行了阐述,并通过仿真,进行比较研究。根据实验结果,阐明了各种算法的优缺点。
  • cvThreshold是OpenCV(Version2.4.9)中针对图像二值化的一个API,本文首先贴出小编的一个简单的源程序,之后对其源码实现进行分析。 下面是使用cvThreshold函数的一个简单例子: #include <iostream> #...
  • 为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上...当R、G、B分量相同时,表现为灰度图像,该就是我们所求的一般来说,转换公式有3种。第一种转换公式为: Gray(i,j)=[R(i,j)+G(i...
  • 灰度图像二值化-大津法 大津法又称最大类间方差法。对图像,记t为前景与背景的分割阈值,前景点数占图像比例为 w0, 平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。图像的总平均灰度为:u=w0*...
  • 数字图像灰度图像二值化实验报告matlab实现数字图像处理实验报告实验二 灰度图像的二值化处理学号姓名日期实验二 灰度图像的二值化处理一、实验目的图像二值化二值化图像的显示与打印十分方便,存储与传输也非常容易...
  • 前言写爬虫有一个绕不过去的问题就是验证码...相应的,验证码识别大体可以分为下面几个步骤:灰度处理增加对比度(可选)二值化降噪倾斜校正分割字符建立训练库识别由于是实验性质的,文中用到的验证码均为程序生成而...
  • 以下代码主要是对一幅灰度图像yanzi.jpg进行一些处理,消除yanzi.jpg图像中的亮度不一致的背景,并使用阀值分割将修改后的图像转换为二值图像,使用轮廓检测返回图像中目标对象的个数以及统计属性。 代码如下://#...
  • 灰度图像二值化

    2011-10-14 16:42:14
    介绍了图像及数字图像处理技术的一些概念和相关知识;对Matlab7.0 软 件的发展和软件在图像处理中的应用做了简要介绍;还介绍了灰度图像二值化方法以及利用Matlab7.0 软件工具进行算法的实现
  • 图片灰度二值化处理
  • 灰度图像经典二值化Matlab代码

    热门讨论 2009-07-23 13:56:48
    我自己实现的经典的灰度图像二值化Matlab代码:包括Otsu二值化方法,Niblack二值化,Kittler最小分类错误二值化。内有使用说明和示例图片。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,473
精华内容 1,389
关键字:

灰度图像二值化