二值化 订阅
图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。 展开全文
图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。
信息
所属学科
视觉传达
外文名
Thresholding (image processing)
效    果
黑和白
释    义
将图像上像素点灰度值设为0或255
中文名
二值化
隶    属
图像分割
二值化简介
二值化(英语:Thresholding)是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。 比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等。 [1] 
收起全文
精华内容
下载资源
问答
  • 自适应阈值图像二值化
    千次阅读
    2020-08-13 16:08:24

    一、二值化

    关于二值化的介绍,以前的博客中有介绍,这里就不再描述了,二值化介绍;二值化分为固定阈值二值化和自适应阈值二值化,固定阈值二值化方式是我们常用的二值化方式,需要自己摸索一个经验阈值,不断调整,直到找到最佳阈值,这种方式在刚刚的链接中已经介绍;而这篇文档主要介绍的就是另一种二值化方式:自适应阈值二值化。

    二、自适应阈值二值化

    图像进行二值化,且做到自适应阈值参数,有4种自适应阈值二值化方法;先从自适应阈值的作用范围来区分,自适应阈值分为:

    • 全局阈值

    使用自适应全局阈值的全局二值化方法有:大津法图像二值化、三角法图像二值化;

    • 局部阈值

    使用自适应局部阈值的局部二值化方法有:局部均值处理、局部高斯处理;

    三、大津法图像二值化

    OTSU算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

    大津法二值化适用于图像直方图中存在双峰的图像(直方图中的双峰就是指背景像素和前景像素),最佳阈值就是双峰之间的某个参数,即将背景像素和前景像素分割开,其原理就是最大类间方差法。

    大津法二值化的大致算法思路如下:

    1. 计算灰度图像的直方图,计算出0 - 255 每个像素值所占的像素个数;
    2. 遍历阈值 0 - 255,小于或等于阈值的像素为背景,大于阈值的像素为前景;
    3. 计算背景像素个数所占总像素个数的比例、背景像素的平均值;
    4. 计算前景像素个数所占总像素个数的比例、前景像素的平均值;
    5. 计算类间方差或类内方差,当使类间方差最大或者使类内方差最小的阈值,即为最佳阈值;
    6. 使用最佳阈值,对图像进行二值化处理。

    思路细化:

    1. 图像宽[w],图像高度[h],灰度阈值[T];遍历T,从0 - 255 ;
    2. 小于阈值T的像素个数[c0],c0为背景像素个数;大于阈值T的像素个数[c1],c1为前景像素个数;c0 + c1 = w * h ;
    3. 背景像素个数占总像素个数的比例[w0],w0 = c0 / (w * h) ; 前景像素个数占总像素个数的比例[w1],w1 = c1 / (w * h) ; 且w0 + w1 = 1 ;
    4. 背景的平均像素灰度值[u0],u0 = c0个背景像素灰度值之和 / c0 ;前景的平均像素灰度值[u1],u1 = c1个前景像素灰度值之和 / c1 ;
    5. 整张图像的像素灰度平均值[u],u = (c0个背景像素灰度值之和 + c1个前景像素灰度值之和) / (w * h) ;
    6. 类间方差[g],g = w0 * (u0 - u)^2 + w1 * (u1 - u)^2 ;类间方差指的是前景和背景之间的差异,显然该差异越大,说明分离度越好。
    7. 根据第(6)步,推导后类间方差g = w0 * w1 * (u0 - u1) ^ 2 ;
    8. 找到最大类间方差对应的灰度阈值T,即是最佳阈值。

    除了最大类间方差,也可以通过计算最小类内方差来得到最佳阈值,这里有篇博客介绍到:链接

    对于一些噪声较多的图像,可以先使用高斯滤波去噪,再用大津法对图像进行二值化,这样会使二值化的图像效果更好

    OpenCV中有大津法二值化的接口:

    double threshold(InputArray src, OutputArray dst, double thresh, double maxVal, int thresholdType)

    将第5个参数 thresholdType 设置成 THRESH_OTSU 即可,可以将THRESH_OTSU 和THRESH_BINARY等类型配合使用;当使用了THRESH_OTSU,函数threshold()返回值即是找到的最佳阈值,且函数中第三个参数thresh将不起作用。

     

    最大类间方差法 实现代码:

    //二值化处理,自适应阈值 大津法
    int Binarization::BinaryProcessing_OTSU(Mat& srcImg)
    {
    	//【1】安全性检查
    	if (!srcImg.data || srcImg.data == NULL) 
    	{
    		cout << "BinaryProcessing_OTSU() --> srcImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】图像灰度化
    	Mat grayImg;
    	cvtColor(srcImg, grayImg, CV_BGR2GRAY);
    
    	//【3】获取最佳二值化阈值
    	int nBestTH = 0;
    	int nRet = GetBestTH_OTSU(grayImg, nBestTH);
    	if (nRet != MTC_SUCCESS) 
    	{
    		cout << "BinaryProcessing_OTSU() --> 获取最佳二值化阈值 失败" << endl;
    		return MTC_FAIL;
    	}
    	cout << "BinaryProcessing_OTSU() --> 最佳二值化阈值 = " << nBestTH << endl;
    
    	//【4】图像二值化
    	Mat binaryImg;
    	threshold(grayImg, binaryImg, nBestTH, 255, CV_THRESH_BINARY);
    
    	//【5】显示图像
    	imshow("二值化图像", binaryImg);
    
    	return MTC_SUCCESS;
    }
    
    //获取最佳阈值,自适应阈值 大津法(最大类间差法)
    int Binarization::GetBestTH_OTSU(Mat& grayImg, int& nBestTH)
    {
    	//【1】安全性检查
    	if (!grayImg.data || grayImg.data == NULL)
    	{
    		cout << "GetBestTH_OTSU() --> grayImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	if (grayImg.channels() != 1) 
    	{
    		cout << "GetBestTH_OTSU() --> grayImg不是灰度图像" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】参数准备
    	double sum = 0.0;			//所有像素灰度之和
    	double w0 = 0.0;			//背景像素所占比例
    	double w1 = 0.0;			//前景像素所占比例
    	double u0_temp = 0.0;
    	double u1_temp = 0.0;
    	double u0 = 0.0;			//背景平均灰度
    	double u1 = 0.0;			//前景平均灰度
    	double delta_temp = 0.0;	//类间方差
    	double delta_max = 0.0;		//最大类间方差
    	const int GrayScale = 256;
    
    	//src_image灰度级  
    	int pixel_count[GrayScale] = { 0 };		//每个灰度级的像素数目
    	float pixel_pro[GrayScale] = { 0 };		//每个灰度级的像素数目占整幅图像的比例  
    
    	int height = grayImg.rows;
    	int width = grayImg.cols;
    	//统计每个灰度级中像素的个数  
    	for (int i = 0; i < height; i++)
    	{
    		for (int j = 0; j < width; j++)
    		{
    			int index = i * width + j;
    			pixel_count[(int)grayImg.data[index]]++;		//每个灰度级的像素数目
    			sum += (int)grayImg.data[index];				//灰度之和
    		}
    	}
    	cout << "平均灰度:" << sum / (height * width) << endl;
    
    	//计算每个灰度级的像素数目占整幅图像的比例  
    	int imgArea = height * width;
    	for (int i = 0; i < GrayScale; i++)
    	{
    		pixel_pro[i] = (float)pixel_count[i] / imgArea;
    	}
    
    	//遍历灰度级[0,255],寻找合适的threshold  
    	for (int i = 0; i < GrayScale; i++)
    	{
    		w0 = w1 = u0_temp = u1_temp = u0 = u1 = delta_temp = 0;
    		for (int j = 0; j < GrayScale; j++)
    		{
    			if (j <= i)   //背景部分  
    			{
    				w0 += pixel_pro[j];			//背景像素比例
    				u0_temp += j * pixel_pro[j];
    			}
    			else		 //前景部分  
    			{
    				w1 += pixel_pro[j];			//前景像素比例
    				u1_temp += j * pixel_pro[j];
    			}
    		}
    		u0 = u0_temp / w0;		//背景像素点的平均灰度
    		u1 = u1_temp / w1;		//前景像素点的平均灰度
    
    		delta_temp = (float)(w0 * w1 * pow((u0 - u1), 2));		//类间方差 g=w0*w1*(u0-u1)^2
    
    		//当类间方差delta_temp最大时,对应的i就是阈值T
    		if (delta_temp > delta_max)
    		{
    			delta_max = delta_temp;
    			nBestTH = i;
    		}
    	}
    
    	return MTC_SUCCESS;
    }
    

    OpenCV接口,实现代码:

    //二值化处理,自适应阈值 大津法 opencv自带接口
    int Binarization::BinaryProcessing_OTSU_OpenCV(Mat& srcImg)
    {
    	//【1】安全性检查
    	if (!srcImg.data || srcImg.data == NULL)
    	{
    		cout << "BinaryProcessing_OTSU() --> srcImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】图像灰度化
    	Mat grayImg;
    	cvtColor(srcImg, grayImg, CV_BGR2GRAY);
    
    
    	//【3】图像二值化
    	Mat binaryImg;
    	double dBestTH = threshold(grayImg, binaryImg, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);		//CV_THRESH_OTSU
    	cout << "BinaryProcessing_OTSU_OpenCV() --> dBestTH = " << dBestTH << endl;
    
    	//【4】显示图像
    	imshow("二值化图像-opencv", binaryImg);
    
    	return MTC_SUCCESS;
    }

     

    四、三角法图像二值化

    三角法二值化,适用于图像直方图中存在单峰的图像,这是一种纯几何的方法来寻找最佳阈值,它的成立条件是假设直方图最大波峰在靠近最亮的一侧,然后通过三角形求得最大直线距离,根据最大直线距离对应的直方图灰度等级即为分割阈值,图示如下:

    在直方图上从最高峰处bmx到最暗对应直方图bmin(p=0)%构造一条直线,从bmin处开始计算每个对应的直方图b到直线的垂直距离,直到bmax为止,其中最大距离对应的直方图位置即为图像二值化对应的阈值T。

     

    三角法二值化算法步骤:

    (1)图像转灰度

    (2)计算图像灰度直方图

    (3)寻找直方图中两侧边界

    (4)寻找直方图最大值

    (5)检测是否最大波峰在亮的一侧,否则翻转

    (6)求解到直线的最大值

    设灰度级别为L,频率为α,当频率αmax最大的时候设L=L_αmax,当Lmin时,α=α_Lmin

    • 求解直线方程:根据点(Lmin,α_Lmin)和点(L_αmax,αmax)可以确定直线l的方程;
    • 求解各点到直线的距离:各点(L,α)到直线l的距离d,根据点到直线的距离公式可以求得,用一个列表去存放所有的距离d,然后利用max函数即可求得dmax;
    • 找到当点(L,α)到直线l的距离d最大时,灰度级别L的值即为最佳阈值;

    (7)确定最佳阈值T,如果翻转则最佳阈值为255 - T

    (8)使用最佳阈值,对图像进行二值化处理。

     

    OpenCV中有三角法二值化的接口:

    double threshold(InputArray src, OutputArray dst, double thresh, double maxVal, int thresholdType)

    将第5个参数 thresholdType 设置成 THRESH_TRIANGLE即可,可以将THRESH_TRIANGLE 和THRESH_BINARY等类型配合使用;当使用了THRESH_TRIANGLE,函数threshold()返回值即是找到的最佳阈值,且函数中第三个参数thresh将不起作用。

    几何法 实现代码:

    //二值化处理,自适应阈值 三角法
    int Binarization::BinaryProcessing_Triangle(Mat& srcImg)
    {
    	//【1】安全性检查
    	if (!srcImg.data || srcImg.data == NULL)
    	{
    		cout << "BinaryProcessing_Triangle() --> srcImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】图像灰度化
    	Mat grayImg;
    	cvtColor(srcImg, grayImg, CV_BGR2GRAY);
    
    	//【3】获取最佳二值化阈值
    	int nBestTH = 0;
    	int nRet = GetBestTH_Triangle(grayImg, nBestTH);
    	if (nRet != MTC_SUCCESS)
    	{
    		cout << "BinaryProcessing_Triangle() --> 获取最佳二值化阈值 失败" << endl;
    		return MTC_FAIL;
    	}
    	cout << "BinaryProcessing_Triangle() --> 最佳二值化阈值 = " << nBestTH << endl;
    
    	//【4】图像二值化
    	Mat binaryImg;
    	threshold(grayImg, binaryImg, nBestTH, 255, CV_THRESH_BINARY);
    
    	//【5】显示图像
    	imshow("二值化图像", binaryImg);
    
    
    	return MTC_SUCCESS;
    }
    
    //获取最佳阈值,自适应阈值 三角法
    int Binarization::GetBestTH_Triangle(Mat& grayImg, int& nBestTH)
    {
    	//【1】安全性检查
    	if (!grayImg.data || grayImg.data == NULL)
    	{
    		cout << "GetBestTH_Triangle() --> grayImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	if (grayImg.channels() != 1)
    	{
    		cout << "GetBestTH_Triangle() --> grayImg不是灰度图像" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】参数准备
    	const int GrayScale = 256;
    	int pixel_count[GrayScale] = { 0 };		//每个灰度级的像素数目
    	int height = grayImg.rows;
    	int width = grayImg.cols;
    	int left_bound = 0;						//最左边零的位置
    	int right_bound = 0;					//最右边零的位置
    	int max_mid = 0;						//像素数量最多的灰度级位置
    	bool bIsFlipped = false;				//是否将直方图左右翻转
    
    	//【3】统计每个灰度级的像素数目
    	for (int i = 0; i < height; i++)
    	{
    		for (int j = 0; j < width; j++)
    		{
    			int index = i * width + j;
    			pixel_count[grayImg.data[index]]++;
    		}
    	}
    
    	//【4】找到最左边零的位置
    	for (int i = 0; i < GrayScale; i++)
    	{
    		if (pixel_count[i] > 0) 
    		{
    			left_bound = i;
    			break;
    		}
    	}
    
    	//位置再移动一个步长,即为最左侧零位置
    	if (left_bound > 0)
    		left_bound--;
    
    	//【5】找到最右边零的位置
    	for (int i = GrayScale - 1; i >= 0; i--)
    	{
    		if (pixel_count[i] > 0)
    		{
    			right_bound = i;
    			break;
    		}
    	}
    
    	//位置再移动一个步长,即为最右侧零位置
    	if (right_bound < GrayScale - 1)
    		right_bound++;
    
    	//【6】找到像素数量最多的灰度级位置
    	int maxNum = 0;
    	for (int i = 0; i < GrayScale; i++)
    	{
    		if (pixel_count[i] > maxNum) 
    		{
    			maxNum = pixel_count[i];
    			max_mid = i;
    		}
    	}
    
    	//【7】如果最大值(max_mid)位置落在靠左侧这样就无法满足三角法求阈值,所以要检测是否最大值(max_mid)位置是否靠近左侧
            
    	//如果靠近左侧则通过翻转到右侧位置
    	if (max_mid - left_bound < right_bound - max_mid) 
    	{
    		int i = 0;
    		int j = GrayScale - 1;
    		int temp = 0;
    		while (i < j)
    		{
    			temp = pixel_count[i];
    			pixel_count[i] = pixel_count[j];
    			pixel_count[j] = temp;
    			i++;
    			j--;
    		}
    
    		bIsFlipped = true;
    		left_bound = GrayScale - 1 - right_bound;
    		max_mid = GrayScale - 1 - max_mid;
    	}
    	  
    	//【8】计算求得阈值
    	nBestTH = left_bound;
    	int a = maxNum;
    	int b = left_bound - max_mid;
    	float maxDist = 0;
    	for (int i = left_bound + 1; i <= max_mid; i++)
    	{
    		//计算距离(点到直线的距离 (Ax + Bx + C) / 根号[A的平方 + B的平方] 
    		//因为只有 Ax+Bx 是变化的,而我们的目的是比较距离大小,所以只计算 Ax+Bx 的值)
    		float tempDist = a * i + b * pixel_count[i];
    		if (tempDist > maxDist) 
    		{
    			maxDist = tempDist;
    			nBestTH = i;
    		}
    	}
    	nBestTH--;
    
    	//【9】对已经得到的最佳阈值,如果前面已经翻转了,则阈值要用 255 - nBestTH
    	if (bIsFlipped)
    		nBestTH = GrayScale - 1 - nBestTH;
    
    	return MTC_SUCCESS;
    }
    

    OpenCV接口,实现代码:

    //二值化处理,自适应阈值 三角法 opencv自带接口
    int Binarization::BinaryProcessing_Triangle_OpenCV(Mat& srcImg)
    {
    	//【1】安全性检查
    	if (!srcImg.data || srcImg.data == NULL)
    	{
    		cout << "BinaryProcessing_Triangle_OpenCV() --> srcImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】图像灰度化
    	Mat grayImg;
    	cvtColor(srcImg, grayImg, CV_BGR2GRAY);
    
    
    	//【3】图像二值化
    	Mat binaryImg;
    	double dBestTH = threshold(grayImg, binaryImg, 0, 255, CV_THRESH_BINARY | CV_THRESH_TRIANGLE);		//CV_THRESH_TRIANGLE
    	cout << "BinaryProcessing_Triangle_OpenCV() --> dBestTH = " << dBestTH << endl;
    
    	//【4】显示图像
    	imshow("二值化图像-opencv", binaryImg);
    
    	return MTC_SUCCESS;
    }

     

    五、自适应局部阈值图像二值化

    全局阈值图像二值化 只可以对整张图像使用同一个阈值进行二值化,如果图像中亮度分布不均匀,每个区域亮度都有差别,那么再使用全局阈值图像二值化,会导致部分信息缺失。

    而自适应局部阈值化能够根据图像不同区域亮度分布,来改变阈值。

     

    OpenCV中集成了这样的方法,接口如下:

    void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)

    参数介绍:

    src参数 表示输入图像(8位单通道图像);

    maxValue参数 表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值;

    adaptiveMethod参数 表示自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C);

    thresholdType参数表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型;

    blockSize参数 表示块大小(奇数且大于1,比如3,5,7........ );

    C参数是常数,表示从平均值或加权平均值中减去的数。通常情况下,这是正值,但也可能为零或负值。

    (1)局部均值法图像二值化

    将参数adaptiveMethod 设置为ADAPTIVE_THRESH_MEAN_C,自适应阈值T(x, y),通过计算像素(x, y)周围blockSize x blockSize大小像素块的平均值并减去常量 C 得到。

    (2)局部高斯处理图像二值化

    将参数adaptiveMethod 设置为ADAPTIVE_THRESH_GAUSSIAN_C,自适应阈值T(x, y),通过计算像素(x, y)周围blockSize x blockSize大小像素块的加权求和(与高斯窗口相关)并减去常量 C 得到。

    如果使用平均的方法,则所有像素周围的权值相同;

    如果使用高斯的方法,则每个像素周围像素的权值则根据其到中心点的距离通过高斯方程得到。

    OpenCV接口 实现代码: 

    //自适应阈值二值化  均值
    int Binarization::AdaptiveThreshold_Mean(Mat& srcImg)
    {
    	//【1】安全性检查
    	if (!srcImg.data || srcImg.data == NULL)
    	{
    		cout << "AdaptiveThreshold_Mean() --> srcImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】图像灰度化
    	Mat grayImg;
    	cvtColor(srcImg, grayImg, CV_BGR2GRAY);
    
    	//【3】自适应阈值二值化
    	Mat binaryImg;
    	adaptiveThreshold(grayImg, binaryImg, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 11, 2);
    
    	//【4】显示图像
    	imshow("二值化图像", binaryImg);
    
    	return MTC_SUCCESS;
    }
    
    
    
    //自适应阈值二值化  高斯
    int Binarization::AdaptiveThreshold_GAUSSIAN(Mat& srcImg)
    {
    	//【1】安全性检查
    	if (!srcImg.data || srcImg.data == NULL)
    	{
    		cout << "AdaptiveThreshold_GAUSSIAN() --> srcImg读取失败" << endl;
    		return MTC_FAIL;
    	}
    
    	//【2】图像灰度化
    	Mat grayImg;
    	cvtColor(srcImg, grayImg, CV_BGR2GRAY);
    
    	//【3】自适应阈值二值化
    	Mat binaryImg;
    	adaptiveThreshold(grayImg, binaryImg, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 11, 2);
    
    	//【4】显示图像
    	imshow("二值化图像", binaryImg);
    
    	return MTC_SUCCESS;
    }

    总结

    (1)大津法的优点在于可以快速有效的找到类间分割阈值,但其缺点也很明显,就是只能针对单一目标分割,或者感兴趣的目标都属于同一灰度范围,若需探测目标灰度范围分布较大,则必将有一部分目标探测丢失。

    (2)局部分割的优点在于可以进行多目标分割,缺点在于基于局部阈值分割出的目标连结性较差,包含噪声。

     

    关于二值化,这里有几篇从OpenCV官网找到的介绍供参考:

    链接1 链接2 链接3

    更多相关内容
  • OpenCV图像二值化

    热门讨论 2012-12-05 10:41:27
    《【OpenCV入门指南】第四篇 图像的二值化》http://blog.csdn.net/morewindows/article/details/8239678 的配套程序,可以动态调整二值化的阈值,以便更好观察二值化效果。
  • 一文搞懂图像二值化算法

    万次阅读 多人点赞 2021-03-25 12:56:14
    图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。

    传统的机器视觉通常包括两个步骤:预处理和物体检测。而沟通二者的桥梁则是图像分割(Image Segmentation[1]。图像分割通过简化或改变图像的表示形式,使得图像更易于分析。

    举个例子,食品加工厂新进了一批肉鸡,想通过视觉检测其美味程度。机器在预处理优化完图像之后,要先把图像中的鸡肉和背景分开,并对感兴趣的区域单独进行分析,才能做出快速准确的判断。

    食品加工厂的视觉处理

    然而,图像分割对愚蠢的AI来说并不容易。聪明的人类一眼就能看出下图中哪些东西能吃、哪些不能吃。但计算机要把这些东西分开却得花费一番功夫。

    原图

     

    图像分割结果

    最简单的图像分割方法是二值化(Binarization)

    图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。

    彩色图、灰度图、二值图对比

    由于二值图像数据足够简单,许多视觉算法都依赖二值图像。通过二值图像,能更好地分析物体的形状和轮廓。二值图像也常常用作原始图像的掩模(又称遮罩、蒙版,Mask):它就像一张部分镂空的纸,把我们不感兴趣的区域遮掉。进行二值化有多种方式,其中最常用的就是采用阈值法(Thresholding进行二值化。

    在计算机视觉里,一般用矩阵来表示图像。也就是说,无论你的图片看上去多么好吃,对计算机来说都不过是个矩阵而已。

    在这个矩阵里,每一个像素就是矩阵中的一个元素。在三通道的彩色图像中,这个元素是由三个数字组成的元组。

    彩色三通道图像

    而对于单通道的灰度图像来说,这个元素就是一个数字。这个数字代表了图像在这个点的亮度,数字越大像素点也就越亮,在常见的八位单通道色彩空间中,0代表全黑,255代表全白。

    单通道的灰度图

    阈值法是指选取一个数字,大于它就视为全白,小于它就视为全黑。就像教室里的灯管开关,我们轻轻地推动它,如果突然间超过了某个阈值,灯就啪的一声亮了。

    根据阈值选取方式的不同,可以分为全局阈值和局部阈值。

    1、全局阈值(Global Method)

    全局阈值,指的是对整个图像中的每一个像素都选用相同的阈值。我们可以在Photoshop的图像—调整—阈值里体验这一操作:

    Photoshop里的阈值

    可以看到阈值色阶从1到255的移动过程中,图像变黑的区域越来越多。当阈值数字在某个特定范围内的时候,红米肠的轮廓清晰可辨。

    正确的二值化使红米肠轮廓清晰可辨

    在生产线环境下,光照是已知的,常常会设定一个固定的数字来作为全局阈值。但是在室外或者机器人比赛中,光照条件往往更加复杂。

    同样是奥利奥冰激凌,在白天和晚上,摄像头看到的画面可能不太一样,常数阈值无法同时适应这两种情况。

    明暗不同的画面

    对于画面比较暗的晚上,我们需要一个比较低的阈值,比如说设定阈值为50,它在晚上能很清楚地把黑白两种颜色分开,但是到了白天就是一片白(左边);如果我们把阈值设置得比较高,比如说172,在白天能顺利分割,但在晚上就是一片黑(右边)。我们需要能够适应复杂环境的算法。

    左边阈值=50,右边阈值=172

    其实,稍作分析我们可以发现,这张图像中的颜色差异还是比较明显的,只有深浅两种颜色。因此,无论是在白天还是黑夜,它的色阶直方图都应该是两个明显的波峰,分别代表深色和浅色的区域。只是色阶直方图在白天会整体向右偏移,而在夜晚整体向左偏移。

    图像的色阶直方图

    如果选择两个波峰之间的波谷作为阈值,就能轻松地把这两类像素分开。但是图像的直方图往往是不连续的,有非常多尖峰和抖动,要找到准确的极值点十分困难。

    日本工程师大津展之为这个波谷找到了一个合适的数学表达,并于1979年发表[2]。这个二值化方法称为大津算法(Otsu’s method。大津算法类似于一维Fisher判别分析的离散化模拟。通过穷举法找到一个阈值数字,把这些像素切成两类,使得这两类像素的亮度的类内方差最小。类内方差指的是两类像素的方差的加权和,这里权指的是这类像素点数量占整个图像像素点数量的比值。

    也许你的画面不会只有两坨差异较大的颜色,比如这款雪糕的就有三个尖峰。

    三色雪糕(取雪糕部位的直方图)

    这时候,只需对大津算法稍加扩展也可以完成。对大津算法的多级推广成为多大津算法(multi Otsu method[3]。

    2、局部阈值(Local Method)

    局部阈值(Local Method)又称自适应阈值(Adaptive Thresholding)。

    比赛中常常会有聚光灯照在一个特定区域,产生局部受光、局部不受光的画面。

    局部受光的图像

    对于局部受光的图像进行全局阈值,可能会出现“无论设置什么阈值参数,都无法满足全图要求”的尴尬。比如上面这幅图像,直接进行全局阈值时,左上半边的寿司全都显露出来时,右下半边还是一片黑色。

    局部受光图像的全局阈值处理

    这个时候我们就要用到局部阈值来处理了。其实,人的眼睛也是自带了这一步操作的。我们判定一个东西颜色深浅,往往会受到物体周边的颜色影响,这也就是为什么黑人的牙齿看上去更白。

    局部阈值法假定图像在一定区域内受到的光照比较接近。它用一个滑窗扫描图像,并取滑窗中心点亮度与滑窗内其他区域(称为邻域, neighborhood area的亮度进行比较。如果中心点亮度高于邻域亮度,则将中心点标记为白色,否则标记为黑色。

    局部阈值的滑窗

     

    这里提到的是局部阈值的基本方法,对于实际使用中常见的其他局部阈值方法,请参阅Chow-Kaneko自适应阈值法 [4]。

    局部阈值的应用非常广泛,特别是对白纸黑字的处理非常有效。光学字符识别(OCR)和二维码扫描的算法中,很多都用了局部阈值操作。

    比如下面这张二维码就是一张典型的局部受光图像:

    局部受光的二维码

     

    如果对这张图片采用全局阈值(例如下图采用大津算法进行分割),是无论如何都无法正确分割的。

    全局方法不能处理局部受光图像

     

    而采用局部阈值方法就能很好地分割图像。从图片里可以明显观察到,局部阈值方法对于一大片干净区域的细节比较敏感,所以纸面上多出了很多我们原本注意不到的斑点。

    局部方法分割二维码

    实际运用中,我们要根据需求选择不同的二值化方法,没有哪个方法是绝对完美的。

    例如,在识别敌方机器人时,由于装甲片灯条是自发光物体,受环境光影响较小,为了提高程序运行效率,我们采用固定数字作为全局阈值:

    基地自动反击

    在能量机关的识别中,由于能量机关只有黑白两种颜色,我们采用了大津算法及其多种变体:

    大能量机关各区域的二值图

    而在空中机器人读取基地区二维码的时候又用到了局部阈值方法:

    空中机器人识别基地

    除了基于阈值的图像分割方法外,常用的分割方法还可以基于边缘(如Yanowitz-Bruckstein自适应阈值方法[5])、区域(如区域生长算法[6])等,它们在卫星图像处理、交通控制系统、工业生产监控、医疗影像等领域发挥着巨大的作用。

    脑部组织图像分割

     

    本文所述阈值方法的OpenCV实现,请参见博客:Python+OpenCV图像处理实验

    项目效果

    参考文献

    [1] Spirkovska, L. (1993). A summary of image segmentation techniques.

    [2] Nobuyuki Otsu (1979). "A threshold selection method from gray-level histograms". IEEE Trans. Sys., Man., Cyber9 (1):62–66.

    [3] Ping-Sung Liao and Tse-Sheng Chen and Pau-Choo Chung (2001). "A Fast Algorithm for Multilevel Thresholding". J. Inf. Sci. Eng17 (5):713–727.

    [4] Chow,C.K.; and Kaneko, T.: Boundary Detection of Radiographic Images by a Thresholding Method. Frontiers of Pattern Recognition, S. Watanabe, ed.,Academic Press, New York, 1972, pp. 61-82.

    [5] Yanowitz, S. D., & Bruckstein, A. M. (1988, November). A new method for image segmentation. In Pattern Recognition, 1988., 9th International Conference on (pp. 270-275). IEEE.

    [6] Richardson H W. Regional growth theory[M]. Macmillan,1973.

    展开全文
  • 图像二值化是什么?最简单的图像分割方法是二值化(Binarization)。图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素...

    图像二值化是什么?最简单的图像分割方法是二值化(Binarization)图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白

    进行二值化的方式?其中最常用的就是采用阈值法(Thresholding)进行二值化,(根据阈值选取方式的不同,可以分为全局阈值局部阈值【又称为自适应阈值

    全局阈值的缺陷?在生产线环境下,光照是已知的,常常会设定一个固定的数字来作为全局阈值,在室外或者机器人比赛中,光照条件往往更加复杂我们需要能够适应复杂环境的算法

    目录

    1、全局阈值(Global Method)

    2、局部阈值(Local Method)

    阈值算法实现:


    由于二值图像数据足够简单,许多视觉算法都依赖二值图像。通过二值图像,能更好地分析物体的形状和轮廓。二值图像也常常用作原始图像的掩模(又称遮罩、蒙版,Mask):它就像一张部分镂空的纸,把我们不感兴趣的区域遮掉。进行二值化有多种方式,其中最常用的就是采用阈值法(Thresholding)进行二值化。

    在计算机视觉里,一般用矩阵来表示图像。也就是说,无论你的图片看上去多么好吃,对计算机来说都不过是个矩阵而已。在这个矩阵里,每一个像素就是矩阵中的一个元素。在三通道的彩色图像中,这个元素是由三个数字组成的元组。而对于单通道的灰度图像来说,这个元素就是一个数字。这个数字代表了图像在这个点的亮度,数字越大像素点也就越亮,在常见的八位单通道色彩空间中,0代表全黑,255代表全白。

    阈值法是指选取一个数字,大于它就视为全白,小于它就视为全黑。就像教室里的灯管开关,我们轻轻地推动它,如果突然间超过了某个阈值,灯就啪的一声亮了。根据阈值选取方式的不同,可以分为全局阈值和局部阈值。

    1、全局阈值(Global Method)

    全局阈值,指的是对整个图像中的每一个像素都选用相同的阈值。我们可以在Photoshop的图像—调整—阈值里体验这一操作:

    可以看到阈值色阶从1到255的移动过程中,图像变黑的区域越来越多。当阈值数字在某个特定范围内的时候,红米肠的轮廓清晰可辨。

    在生产线环境下,光照是已知的,常常会设定一个固定的数字来作为全局阈值但是在室外或者机器人比赛中,光照条件往往更加复杂。同样是奥利奥冰激凌,在白天和晚上,摄像头看到的画面可能不太一样,全局阈值无法同时适应这两种情况。我们需要能够适应复杂环境的算法

    对于画面比较暗的晚上,我们需要一个比较低的阈值,比如说设定阈值为50,它在晚上能很清楚地把黑白两种颜色分开,但是到了白天就是一片白(左边);如果我们把阈值设置得比较高,比如说172,在白天能顺利分割,但在晚上就是一片黑(右边)。

    其实,稍作分析我们可以发现,这张图像中的颜色差异还是比较明显的,只有深浅两种颜色。因此,无论是在白天还是黑夜,它的色阶直方图都应该是两个明显的波峰,分别代表深色和浅色的区域。只是色阶直方图在白天会整体向右偏移,而在夜晚整体向左偏移。

    如果选择两个波峰之间的波谷作为阈值,就能轻松地把这两类像素分开。但是图像的直方图往往是不连续的,有非常多尖峰和抖动,要找到准确的极值点十分困难。

    日本工程师大津展之为这个波谷找到了一个合适的数学表达,并于1979年发表[2]。这个二值化方法称为大津算法(Otsu’s method)。大津算法类似于一维Fisher判别分析的离散化模拟。通过穷举法找到一个阈值数字,把这些像素切成两类,使得这两类像素的亮度的类内方差最小。类内方差指的是两类像素的方差的加权和,这里权指的是这类像素点数量占整个图像像素点数量的比值。

    也许你的画面不会只有两坨差异较大的颜色,比如这款雪糕的就有三个尖峰。

    这时候,只需对大津算法稍加扩展也可以完成。对大津算法的多级推广成为多大津算法(multi Otsu method)[3]。

    2、局部阈值(Local Method)

    局部阈值(Local Method)又称自适应阈值(Adaptive Thresholding)。

    比赛中常常会有聚光灯照在一个特定区域,产生局部受光、局部不受光的画面。

    对于局部受光的图像进行全局阈值,可能会出现“无论设置什么阈值参数,都无法满足全图要求”的尴尬。比如上面这幅图像,直接进行全局阈值时,左上半边的寿司全都显露出来时,右下半边还是一片黑色。

    这个时候我们就要用到局部阈值来处理了。其实,人的眼睛也是自带了这一步操作的。我们判定一个东西颜色深浅,往往会受到物体周边的颜色影响,这也就是为什么黑人的牙齿看上去更白。

    局部阈值法假定图像在一定区域内受到的光照比较接近。它用一个滑窗扫描图像,并取滑窗中心点亮度与滑窗内其他区域(称为邻域, neighborhood area)的亮度进行比较。如果中心点亮度高于邻域亮度,则将中心点标记为白色,否则标记为黑色。

     这里提到的是局部阈值的基本方法,对于实际使用中常见的其他局部阈值方法,请参阅Chow-Kaneko自适应阈值法 [4]。局部阈值的应用非常广泛,特别是对白纸黑字的处理非常有效。光学字符识别(OCR)和二维码扫描的算法中,很多都用了局部阈值操作。

    比如二维码就是一张典型的局部受光图像:

    如果对这张图片采用全局阈值(例如下图采用大津算法进行分割),是无论如何都无法正确分割的。

    而采用局部阈值方法就能很好地分割图像。从图片里可以明显观察到,局部阈值方法对于一大片干净区域的细节比较敏感,所以纸面上多出了很多我们原本注意不到的斑点。

    实际运用中,我们要根据需求选择不同的二值化方法,没有哪个方法是绝对完美的。

    阈值算法实现:

    本文所述阈值方法的OpenCV实现,请参见博客:Python+OpenCV图像处理实验

    展开全文
  • Python图像的二值化

    千次阅读 多人点赞 2021-03-13 11:08:13
    什么是图像二值化 在认识二值化前,我们先简单介绍一下几个概念: 彩色图像 彩色图像有blue,green,red三个通道,取值范围均为0-255 灰度图 灰度图:只有一个通道,取值范围在0-255,所以一共有256种颜色 ...

    什么是图像二值化

    在认识二值化前,我们先简单介绍一下几个概念:

    1. 彩色图像

      彩色图像有blue,green,red三个通道,取值范围均为0-255
      
    2. 灰度图

      灰度图:只有一个通道,取值范围在0-255,所以一共有256种颜色
      
    3. 二值图像

      二值图像,只有两种颜色,既黑色和白色
      

    图像二值化

    图像的二值化也很简单,大概二步就可以完成,具体如下

    • 第一步:获取阈值

      获取阈值很简单,OpenCv的threshold函数进行全局阈值,也可通过OpenCv的adaptiveThreshold获取局部阈值,同时也可以自定义阈值。下面就简单介绍一下这三种阈值。

      1. 全局阈值
        全局阈值可以通过OpenCv的threshold函数进行全局阈值,函数如下:

        cv.threshold(src, thresh, maxval, type[, dst]) -> retval, dst)
        

        参数说明:

          # src: 表示输入图像(多通道,8位或32位浮点)。
          # thresh: 表示阈值。
          # maxval: 与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。
          # type: 阈值的类型
          # retval: 返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。
          # dst: 输出与src相同大小和类型以及相同通道数的图像。		   
        

        注意: 阈值的类型也包括如下几种

    类型说明
    THRESH_BINARY超过阈值的值为最大值,其他值是0
    THRESH_BINARY_INV超过阈值的值为0,其他值为最大值
    THRESH_TRUNC超过阈值的值等于阈值,其他值不变
    THRESH_TOZERO超过阈值的值不变,其他值为0
    THRESH_TOZERO_INV超过阈值的值为0,其他值不变

    下面就意义讲解这几种阈值的代码简单实现:

    • 全局阈值THRESH_BINARY 阈值的实现
    def threshold_By_OTSU(input_img_file):
        image=cv2.imread(input_img_file)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)   ##要二值化图像,必须先将图像转为灰度图
        ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        print("threshold value %s" % ret)  #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
        cv2.imshow("threshold", binary) #显示二值化图像
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    好了,看一下效果图:

    在这里插入图片描述

    • 全局阈值THRESH_TRIANGLE,三角形算法
    def threshold_By_THRESH_TRIANGLE(input_img_file):
        image=cv2.imread(input_img_file)
        cv2.imshow("image", image)  # 显示二值化图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)   ##要二值化图像,必须先将图像转为灰度图
        ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE)
        print("threshold value %s" % ret)  #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
        cv2.imshow("threshold", binary) #显示二值化图像
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    看一下效果图如下:
    在这里插入图片描述

    • 全局阈值THRESH_BINARY_INV 阈值的实现
    def threshold_By_THRESH_BINARY_INV(input_img_file):
        image=cv2.imread(input_img_file)
        cv2.imshow("image", image)  # 显示二值化图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)   ##要二值化图像,必须先将图像转为灰度图
        ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_BINARY_INV)
        print("threshold value %s" % ret)  #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
        cv2.imshow("threshold", binary) #显示二值化图像
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    看一下效果图:
    在这里插入图片描述

    同理,这里就不用了在讲其他几种类型了,只需要修改threshold函数的type参数类型就可以了,看了这三种效果,我们可以得出一下结论:

    cv.THRESH_OTSU和cv.THRESH_TRAINGLE都是自动获取阈值
    THRESH_OTSU:适用于双波峰
    THRESH_TRIANGLE:适用于单个波峰,最开始用于医学分割细胞等

    好了,了解了系统提供的全局阈值,下面我就简单介绍一下自定义全局阈值,自定义全局阈值很简单,就是自己定义threshold函数的参数。

    1. 自定义全局阈值
      (1)THRESH_BINARY_INV大于阈值的都为0
      ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
      
      代码如下:
    def threshold_By_Avto(input_img_file):
        image=cv2.imread(input_img_file)
        cv2.imshow("image", image)  # 显示二值化图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)   ##要二值化图像,必须先将图像转为灰度图
        ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)#自定义阈值
        print("threshold value %s" % ret)  #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
        cv2.imshow("threshold", binary) #显示二值化图像
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    看一下效果图如下:
    

    在这里插入图片描述
    (2)THRESH_TRUNC截断大于127的值都为127,其他值不变

    def threshold_By_Avto(input_img_file):
        image=cv2.imread(input_img_file)
        cv2.imshow("image", image)  # 显示二值化图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)   ##要二值化图像,必须先将图像转为灰度图
        ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_TRUNC)#自定义阈值
        print("threshold value %s" % ret)  #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
        cv2.imshow("threshold", binary) #显示二值化图像
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    看一下效果图:
    在这里插入图片描述
    (3)THRESH_TOZERO 超过阈值的值不变,小于阈值的为0

    def threshold_By_Avto(input_img_file):
        image=cv2.imread(input_img_file)
        cv2.imshow("image", image)  # 显示二值化图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)   ##要二值化图像,必须先将图像转为灰度图
        ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO)#自定义阈值
        print("threshold value %s" % ret)  #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
        cv2.imshow("threshold", binary) #显示二值化图像
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    好了,再看一下THRESH_TOZERO 的效果图:
    在这里插入图片描述
    全局阈值和自定义全局阈值说完,下面我们来讲解一下局部阈值。

    1. 局部阈值
      局部阈值可以使图片更加清晰,而局部阈值可以使用OpenCV的adaptiveThreshold函数进行局部阈值,函数以及参数说明如下:

      adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize,C[, dst]) -> dst)

      参数说明:

      src:输入图像(8位单通道图像)。
      maxValue:使用THRESH_BINARY和THRESH_BINARY_INV的最大值.
      adaptiveMethod参数表示自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯 (ADAPTIVE_THRESH_GAUSSIAN_C)。
      thresholdType:阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。
      blockSize: 块大小(奇数且大于1,比如3,5,7… )。
      C: 常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值

    在使用平均和高斯两种算法情况下,通过计算每个像素周围blockSize x blockSize大小像素块的加权均值并减去常量C即可得到自适应阈值。如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则每个像素周围像素的权值则根据其到中心点的距离通过高斯方程得到:

    def jubuThreshold(input_img_file):
        image = cv2.imread(input_img_file)
        cv2.imshow("image", image)  # 显示二值化图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 25, 10)
        cv2.imshow("binary", binary)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    好了,看一下效果图:
    在这里插入图片描述

    当然,我们还可以自己计算阈值,自己计算阈值就是计算图像的均值,用均值作为阈值,来分割图像。代码如下:

    def custom_Threshold(input_img_file):
        image = cv2.imread(input_img_file)
        cv2.imshow("image", image)  # 显示二值化图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        h, w = gray.shape[:2]
        m = np.reshape(gray, [1, h*w]) #将图像转为1行h*w列
        mean = m.sum() / (h*w)  #计算图像的均值,用均值作为阈值,来分割图像
        ret, binary = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY)
        print("threshold value %s" % ret)
        cv2.imshow("cudtom_binary", binary)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    好了,看一下效果图如下:
    在这里插入图片描述
    而自己计算阈值所得到的阈值如下:
    在这里插入图片描述
    好了,至此关于常用的阈值和定义阈值基本讲述完毕,下面就讲如何根据阈值去二值化图像。

    • 第二步:根据阈值去二值化图像

      前面讲的那么多都是如何获取阈值的,获取阈值的方式有很多,具体就根据实际开发情况使用,得到阈值后就是开启二值化了,到了这里就非常简单,其实在上面已经列出了,只是为了方便大家看到效果而已。
      cv2.threshold和cv2.adaptiveThreshold这俩个函数就已经实现了二值化并且返回了阈值给我们。

    展开全文
  • 文章目录数据离散和类型 数据离散和类型 操作数据的逻辑分层,所谓离散是将无限空间中的有限个体映射到有限空间。数据离散操作主要在连续数据上执行。处理后,数据范围分布将从连续属性更改为离散属性。此...
  • 图像处理一之-摄像头二值化处理-(什么是二值化)

    万次阅读 多人点赞 2019-02-27 22:53:20
    图像二值化binary image 什么是二值化二值化是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值(阈值)的像素灰度设为灰度极大值(255),把小于这个值的像素灰度设为灰度极...
  • 图像处理二之----摄像头二值化算法汇总+代码

    万次阅读 多人点赞 2019-02-28 11:05:58
    上一节中我们讲解了什么是二值化,并且讲到了二值化的一般方法,那么每种算法究竟是怎么样对图像经行二值化处理的呢?,算法的原理是什么呢,怎么样用代码实现,这节我们分享下。 1.otsu(最大类间方差法、大津法...
  • 二值化方法

    千次阅读 2020-07-01 14:39:18
    一、全局阈值法 1.固定阈值方法 该方法是对于输入图像中的所有像素点统一使用同一个固定阈值。...那么,如果将图像的每一个像素点的强度作为一个数据集合中的单元,那么,阈值就相当于是一个...
  • opencv之图像二值化处理

    千次阅读 2022-03-19 19:16:43
    opencv二值化操作分为:全局阈值和局部阈值两种。 全局阈值 全局阈值分为:手动阈值和自动阈值两种。 手动阈值 opencv函数: threshold(gray_src, dst, threshold_value, threshold_max,THRESH_BINARY); //原图,...
  • 图像二值化的阈值求法

    千次阅读 2020-10-28 18:37:25
    图像二值化的操作,就是寻找一个合适的阈值T,把图像中所有像素值小于等于该阈值的像素点设置为一个像素值,同时把图像中所有像素值大于该阈值的像素点设置为另一个像素值。也就是说,二值化之后整幅...
  • 图像二值化方法介绍

    千次阅读 2019-09-09 01:58:27
    ImageJ中图像二值化方法介绍 概述 二值图像分析在对象识别与模式匹配中有重要作用,同时也在机器人视觉中也是图像处理的关键步骤,选择不同图像二值化方法得到的结果也不尽相同。本文介绍超过十种以上的基于全局...
  • 基于阈值的图像二值化方法MATLAB

    万次阅读 多人点赞 2020-10-25 18:50:35
    基于阈值的图像二值化方法
  • python 图像二值化处理

    千次阅读 2021-12-12 15:43:17
    python 图像二值化处理 import os from PIL import Image import shutil file_path = './5-crack919/mask/' save_path = './5-crack919/mask01/' if not os.path.exists(save_path): os.makedirs(save_path) ###...
  • 图像二值化

    万次阅读 多人点赞 2020-02-11 14:00:03
    什么是图像二值化 彩色图像: 有blue,green,red三个通道,取值范围均为0-255 灰度图:只有一个通道0-255,所以一共有256种颜色 二值图像:只有两种颜色,黑色和白色 图像二值化 图像二值化的步骤 获取阈值 根据...
  • 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值。 原理:方差越大,相关性越低,黑白越分明。 目的:找出一个灰度值阈值Threshold,对该灰度值以上或以下的像素的分别计算方差,满足...
  • OpenCV 二值化分割方式

    千次阅读 2022-03-10 16:46:40
  • [2] 图像处理之----二值化处理

    千次阅读 2021-08-16 14:28:29
    1、什么是二值化处理 我们都知道,图像是由矩阵构成,矩阵中每个点的RGB值都不一样,呈现出来的色彩不一样,最终整体呈现给我们的就是一张彩色的图像。所谓”二值化处理“就是将矩阵中每个点的RGB值(0,0,0)[黑色...
  • 灰度图二值化算法

    千次阅读 2020-02-21 11:53:14
    【摘要】 目前最常用的快速二值化阈值确定方法为根据每一张目标图像来动态的计算平均灰度值。然后将灰度图像中的每个像素灰度值和此平均阈值作对比,高于平均阈值的记为“1”(白色),低于的则设置为“0”(黑色)...
  • 二值化方法总结

    千次阅读 2019-06-28 08:32:22
    Author:cxf7394373 回首前尘,尽是可耻的的往事。每当想起这句话,心里惶惶不可终日,兴趣... 很长时间都在做图像二值化算法方面的工作,看了一些论文,总结了一些算法,总的来说,在这方面的算法特别多,大致...
  • 图片的灰度化与二值化

    千次阅读 2018-07-28 16:16:48
    灰度 RGB颜色模型 一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光,且三原色的红绿蓝不可能用其他单色光合成。 RGB色彩模式使用RGB模型为图像中每...
  • 图像二值化中阈值算法浅析

    千次阅读 2021-01-30 02:14:42
    二值化中常见的阈值算法:1.OSTU大津法2.iteration迭代法3.Sobel算子图像边缘提取
  • Python - OpenCV 图像二值化处理

    万次阅读 多人点赞 2020-11-21 16:35:46
    图像二值化处理时图像处理过程中非常常见的一种操作,在python中比较常用的主要是opencv,pil两个第三库,对比来看的话,opencv使用要更加的方便灵活, 文本主要介绍以下基于opencv的图像二值化处理方法。 首相我们...
  • opencv 快速简单二值化的做法

    千次阅读 2022-03-06 16:30:34
    大家在网上搜索opencv二进制,很多人会告诉你用threshold等函数。这类函数虽然支持自适应等功能,但是参数...我们只要简单二值化的时候可以用以下做法: Mat img = imread("a.png", IMREAD_GRAYSCALE)<100; ...
  • 本篇将介绍彩色图像灰度化和二值化的原理,并使用Python来实现对应算法内容。
  • 彩色图像的二值化,取经之旅第 6 天

    万次阅读 多人点赞 2020-12-29 21:14:00
    图像的二值化,虽然不知道未来可以干啥,不过看起来很厉害的样子
  • opencv 图像阈值 二值化处理

    千次阅读 多人点赞 2020-11-27 14:54:29
    opencv 图像阈值 二值化处理
  • 图像预处理(二值化

    万次阅读 多人点赞 2018-04-22 12:02:09
    图像预处理(二值化) 本文的实验室主要通过opencv与python3实现,相关的代码可以在GitHub中找到。 1. 图像获取与灰度化 通过摄像头获取到的图像为彩色的图像。彩色图像主要分为两种类型,RGB及CMYK。其中RGB的...
  • 图像二值化算法

    千次阅读 2019-07-05 11:35:52
    图像二值化,首先要将原图转换成灰度图,这里展示Android代码: /** * 将彩色图转换为灰度图 * * @param img 位图 * @return 返回转换好的位图 */ public static Bitmap convertGreyImg(Bitmap img) { //...
  • 灰度即R=G=B 二值化只取255 0 对图片进行灰度化处理,目的是 1 减少数据量 (减少不明显) 2 为二值化准备 对数据进行灰度发现数据量减少并不明显 尤其是 最大 和 平均 灰度法 权重法数据量减少明显 但是权重不容易...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,834,359
精华内容 1,133,743
关键字:

二值化

友情链接: 归档.zip