- 所属学科
- 视觉传达
- 外文名
- Thresholding (image processing)
- 效 果
- 黑和白
- 释 义
- 将图像上像素点灰度值设为0或255
- 中文名
- 二值化
- 隶 属
- 图像分割
-
二值化
2014-12-06 15:30:08图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰度置为0或255,也就是将整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二...图像的二值化的基本原理图像的二值化处理就是将图像上的点的灰度置为0或255,也就是将整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于在对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阈值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阈值选取技术来分割该图像。动态调节阈值实现图像的二值化可动态观察其分割图像的具体结果。void GrayTrans::BinaryImage(int threshold){ if (m_nBitCount == 8){ if(m_pImgDataOut != NULL){ delete []m_pImgDataOut ; m_pImgDataOut = NULL ; } if (m_lpColorTableOut != NULL){ delete []m_lpColorTableOut ; m_lpColorTableOut = NULL ; } m_nBitCountOut = m_nBitCount ; m_nColorTableLengthOut = ComputeColorTabalLength(m_nBitCountOut) ; m_lpColorTableOut = new RGBQUAD[m_nColorTableLengthOut] ; memcpy(m_lpColorTableOut , m_lpColorTable , sizeof(RGBQUAD) * m_nColorTableLengthOut) ; m_imgHeightOut = m_imgHeight ; m_imgWidthOut = m_imgWidth ; int lineByte = (m_imgWidthOut * m_nBitCountOut / 8 + 3) / 4 * 4 ; m_pImgDataOut = new unsigned char[lineByte * m_imgHeightOut] ; for(int i = 0 ; i < m_imgHeightOut ; i++){ for(int j = 0 ; j < m_imgWidthOut ; j++){ if(* (m_pImgData + i * lineByte + j) < threshold) *(m_pImgDataOut + i * lineByte + j) = 0 ; else *(m_pImgDataOut + i * lineByte + j) = 255 ; } } } else{ if(m_pImgDataOut != NULL){ delete []m_pImgDataOut ; m_pImgDataOut = NULL ; } if(m_lpColorTableOut != NULL){ delete []m_lpColorTableOut ; m_lpColorTableOut = NULL ; } m_nBitCountOut = 8 ; m_nColorTableLengthOut = ComputeColorTabalLength(m_nBitCountOut) ; if(m_nColorTableLengthOut != 0){ m_lpColorTableOut = new RGBQUAD[m_nColorTableLengthOut] ; for(int i = 0 ; i < m_nColorTableLengthOut ; i++){ m_lpColorTableOut[i].rgbBlue = i ; m_lpColorTableOut[i].rgbGreen = i ; m_lpColorTableOut[i].rgbRed = i ; m_lpColorTableOut[i].rgbReserved = 0 ; } } m_imgWidthOut = m_imgWidth ; m_imgHeightOut = m_imgHeight ; int lineByteIn = (m_imgWidth * 3 + 3) / 4 * 4 ; int lineByteOut = (m_imgWidth * m_nBitCountOut/8 + 3)/4*4 ; m_pImgDataOut = new unsigned char[m_imgHeightOut * lineByteOut] ; for(int i = 0 ; i < m_imgHeightOut ; i++){ for(int j = 0 ; j < m_imgWidthOut ; j++){ *(m_pImgDataOut + i * lineByteOut + j) = 0.11 * *(m_pImgData + i*lineByteIn + 3 * j + 0) + 0.59 * *(m_pImgData + i*lineByteIn + 3 * j + 1) + 0.30 * *(m_pImgData + i*lineByteIn + 3 * j + 2) + 0.5 ; } } for(int i = 0 ; i < m_imgHeightOut ; i++){ for(int j = 0 ; j < m_imgWidthOut ; j++){ if(* (m_pImgDataOut + i * lineByteOut + j) < threshold) *(m_pImgDataOut + i * lineByteOut + j) = 0 ; else *(m_pImgDataOut + i * lineByteOut + j) = 255 ; } } } }
-
图像二值化
2020-02-11 14:00:03什么是图像二值化 彩色图像: 有blue,green,red三个通道,取值范围均为0-255 灰度图:只有一个通道0-255,所以一共有256种颜色 二值图像:只有两种颜色,黑色和白色 图像二值化 图像二值化的步骤 获取阈值 根据...什么是图像二值化
彩色图像: 有blue,green,red三个通道,取值范围均为0-255
灰度图:只有一个通道0-255,所以一共有256种颜色
二值图像:只有两种颜色,黑色和白色
图像二值化
图像二值化的步骤
- 获取阈值
- 根据阈值去二值化图像
Opencv二值化的方法及代码
全局阈值
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_OTSU大津法
def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) ##要二值化图像,必须先将图像转为灰度图 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) print("threshold value %s" % ret) #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色 cv.imshow("threshold", binary) #显示二值化图像
threshold value 137.0 #获取阈值为137- 全局阈值使用THRESH_TRIANGLE 三角形算法
def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY|cv.THRESH_TRIANGLE) print("threshold value %s" % ret) cv.imshow("threshold", binary)
threshold value 105.0
知识补充:
cv.THRESH_OTSU和cv.THRESH_TRAINGLE都是自动获取阈值
THRESH_OTSU:适用于双波峰
THRESH_TRIANGLE:适用于单个波峰,最开始用于医学分割细胞等- 全局阈值 自己手动设定阈值
(1)THRESH_BINARY_INV大于阈值的都为0
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
(2)THRESH_TRUNC截断大于127的值都为127,其他值不变ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TRUNC)
(3)THRESH_TOZERO 超过阈值的值不变,小于阈值的为0ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TOZERO)
局部阈值
可以使图片更加清晰
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 adaptive_demo(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10) cv.imshow("binary", binary)
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
全局和局部阈值比较
自己计算阈值
def custom_demo(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) h, w = gray.shape[:2] m = np.reshape(gray, [1, h*w]) #将图像转为1行h*w列 mean = m.sum() / (h*w) #计算图像的均值,用均值作为阈值,来分割图像 ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY) print("threshold value %s" % ret) cv.imshow("cudtom_binary", binary)
threshold value 107.0
知识补充:
np.reshpe是给数组一个新的形状而不改变其数据,
函数原型:reshape(a, newshape, order=‘C’)a参数表示需要重新形成的原始数组。
newshape参数表示int或int类型元组(tuple),若为(1, 3),表示生成的新数组是1行3列。
order参数表表示使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。
函数返回值:如果可能的话,这将是一个新的视图对象; 否则,它会成为副本。注意:将图像转一维数组,转换维度要保证图像的size不变,newshape=[行,列]
- 获取阈值
-
图像处理一之-摄像头二值化处理-(什么是二值化)
2019-02-27 22:53:20图像二值化binary image 什么是二值化:二值化是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值(阈值)的像素灰度设为灰度极大值(255),把小于这个值的像素灰度设为灰度极...图像二值化 binary image
什么是二值化:
二值化是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值(阈值)的像素灰度设为灰度极大值(255),把小于这个值的像素灰度设为灰度极小值(0),从而实现二值化,简单来说:设定一个阈值valve,对于视频信号矩阵中的每一行,从左至右比较各像素值和阈值的大小,若图像灰度值大于或等于阈值,则判定该像素对应的255;反之,小于阈值的灰度值则为0。就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。
二值化的作用:
简单通俗的说:二值化的所用就是将图像分成黑和白,更加有利于做图像处理判别。也就是我们说的黑白图像
在了解了这些之后,我们看下二值化的方法:
根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值(动态阈值)。 比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等
固定阈值和自适应阈值:
这个就很简单理解了,固定阈值就是设置一个固定的阈值,进行二值化处理,而现在大部分二值化算法用的都是自适应阈值(动态阈值),很容易理解:固定阈值的二值化呢,,一个阈值往往只对应一类图像,如果图像的光照变暗了,或者其他因素改变了,那个单阈值情况的二值化效果会大大的折扣。自适应二值化其实就是一种根据图片的灰度直方图,得到一个适合本图像的二值化阈值。
硬件二值化和软件二值化:
硬件二值化的摄像头,是二值化的过程由逻辑芯片直接处理,就是内部自带二值化,它输出的就是二值化后的值了,,所得的图像即为黑白。给单片机节约二值化处理时间,从而不需要进行二值化处理。----软件二值化就是摄像头没有自带二值化,需要自己做二值化处理
附最简单二值化代码,其他算法之后讲解
Void image_binaryzation() { for(int i=0;i<Row;i++) { for(int j=0;j<Col;j++) { if(Image[i][j] >= Threshold) Image_new[i][j]=1; else Image_new[i][j]=0; } } }
其中 Row是对应采集到的行数,Col是列数,Image[i][j]是摄像头采集未二值化的数据存放的数组,Image_new[i][j]是新建的存放二值化后的数组,Threshold是阈值(前面有阈值的讲解)。
整理不易,点个赞再走呗!
-
二值化神经网络系列一:二值化神经网络介绍
2017-02-14 02:11:561. 二值化神经网络简介 2. 神经网络的二值化方法 3. 训练二值化神经网络二值化神经网络以其高模型压缩率和快计算速度的潜在优势,近些年成为深度学习的热门研究方向。本篇博文将对二值化神经网络做一个详细的介绍。
尊重原创,转载请注明:
http://blog.csdn.net/tangwei2014/article/details/550771721. 二值化神经网络简介
二值化神经网络,是指在浮点型神经网络的基础上,将其权重矩阵中权重值和各个激活函数值同时进行二值化得到的神经网络。二值化神经网络具有很好的特性,具体体现在:
- 通过将权重矩阵二值化,一个权重值只占用一个比特,相比于单精度浮点型权重矩阵,网络模型的内存消耗理论上能减少32倍,因此二值化神经网络在模型压缩上具有很大的优势。
- 当权重值和激活函数值同时进行二值化之后,原来32个浮点型数的乘加运算,可以通过一次异或运算(xnor)和一次popcnt运算解决,在模型加速上具有很大的潜力。
通过以上分析可以看出,二值化神经网络在模型压缩和模型加速方面都具有非常明显的优势。研究二值化神经网络对解决当前浮点型神经网络模型应用到嵌入式或移动场景下 (例如手机端、可穿戴设备、自动驾驶汽车等) 存在的模型过大,计算密度过高等问题,具有很重大的意义。一种全连接的二值化神经网络示例如图1所示。二值化神经网络中的二值化通常指将权重值和激活函数值二值化到+1和-1实现。
图一: 全连接二值化神经网络示例2. 神经网络的二值化方法
二值化神经网络以其高的模型压缩率和在前传中计算速度上的优势,近几年格外受到重视和发展,成为神经网络模型研究中的非常热门的一个研究方向。 第一篇真正意义上将神经网络中的权重值和激活函数值同时做到二值化的是Bengio组2016年发表的名为《Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1》的一篇论文。这篇论文第一次给出了关于如何对网络进行二值化和如何训练二值化神经网络的方法。
如何对浮点型的神经网络进行二值化? BinaryNet这篇文章提供了两种思路,第一种思路是概率化的方式:
即首先将权重值或者激活函数值通过例如sigmoid函数转为一种概率,然后按照概率采样为+1或者-1。另一种思路是采用决定化的方式:
即直接由浮点型权重值或者激活函数值的正负号决定二值化为+1还是-1。 由于频繁的采样在面临大量参数的网络和大量的输入数据时非常耗时,所以这篇论文推荐使用决定化的方式。3. 训练二值化神经网络
如何训练二值化神经网络? BinaryNet这篇论文提出了在用BP算法训练神经网络时,前传和反传区别进行的方式,即在整个训练过程中,即保留浮点型的权重值,又保留二值化的权重值。
在前传过程中,根据浮点型的权重值和浮点型的激活函数值分别利用决定化的方式对其进行二值化,利用二值化后的权重值和激活函数值进行运算。即前传过程如下:
在反传过程中,对决定化方式中的Sign函数进行松弛化,即前传中是:
反传中对已知q的梯度对r求梯度时,Sign函数松弛为:
即当r的绝对值小于等于1时,r的梯度等于q的梯度,否则r的梯度为0。 最后求得各层浮点型权重值对应的梯度和浮点型激活函数值对应的残差,然后用SGD方法或者其他梯度更新方法对浮点型的权重值进行更新,以此不断的进行迭代,直到loss不再继续下降。求各层梯度方式如下:
梯度更新方式如下:
-
Opencv2.4学习::二值化(3)自适应二值化
2018-09-07 19:01:23二值化系列: (1)OTSU算法 (2)固定二值化 (3)自适应二值化 adaptiveThreshold void adaptiveThreshold(InputArray src, OutputArraydst,double maxValue,int adaptiveMethod,int thresholdType, ... -
【OpenCV图像处理】二、图像的二值化操作
2017-02-19 14:36:11我们对灰度图像进行二值化处理,可以突出一定范围的信息,但是对于A和B的不同取值,二值化的效果会有很大的不同。 下面使用OpenCV和C++实现图像的二值化过程。 //对一幅图像进行二值化 #incl... -
python 图像二值化
2017-07-15 21:35:36python 图像二值化 -
自适应阈值图像二值化
2020-08-13 16:08:24二值化分为固定阈值二值化和自适应阈值二值化,固定阈值二值化方式是我们常用的二值化方式,需要自己摸索一个经验阈值,不断调整,直到找到最佳阈值,这种方式在刚刚的链接中已经介绍;而这篇文档主要介绍的就是另一... -
opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化
2020-07-15 09:40:38基础版二值化讲解 opencv学习笔记10:阈值分割 图像二值化原理 二值化方法:全局阈值,局部阈值 具体原理见上面链接 图像二值化实现 全局阈值 通常情况,我们一般不知道设定怎样的阈值thresh才能得到比较好的二值化... -
MATLAB图像二值化
2020-06-29 15:09:08听说可以在PPT作图然后用MATLAB二值化把复杂边界用01矩阵表达出来。上网看了下: I = imread('18_4_25.jpg'); imshow(I); thresh = graythresh(I); %自动确定二值化阈值 I2 = im2bw(I,thresh); %对图像二值化 ... -
图像二值化解释
2019-05-09 13:12:21图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。 二值化(Thresholding)是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把... -
opencv二值化详解
2019-03-20 21:49:16二值化 学习了二值化,我通过看了很多资料,希望通过总结和大家一起学习,一起努力,有错误,希望大家指正 在处理图片操作时,二值化在图片领域占有很大作用 在数字图像处理中,二值图像占有非常重要的地位,图像的二值化... -
二值化处理
2018-12-06 09:23:27这是一个简单的图像二值化处理,因为机器识别图像是有局限性的,基于布尔代数的计算机只能表示是与非,多彩的图像反而成为了不易识别的东西,为了识别图像我们往往先采用图像二值化,即使图像非黑即白,有用的元素... -
什么叫二值化以及二值化的作…
2014-05-13 15:33:07原文地址:什么叫二值化以及二值化的作用作者:宁静致远lsp 二值化概念: 一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最常用的方法就是设定一个阈值T,用T将图像的数据分成... -
大津二值化算法(Ostu二值化算法)及其改进算法
2019-11-07 09:10:37使用大津算法来二值化图像!大津算法,也被称作最大类间方差法,是一种可以自动确定二值化中阈值的算法,从类内方差和类间方差的比值计算得来: 小于阈值 t 的类记作 0,大于阈值 t 的类记作 1; w0 和 w1 是被... -
opencv 二值化图像详解 一文看懂各种二值化方法
2020-03-28 21:25:01本文介绍使用不同的阈值方法“二值化”图像 固定阈值分割 图解 代码 import cv2 as cv # 读入灰度图像 img = cv.imread('baby_g.jpg', 0) # 阈值127分割图像 ret, th = cv.threshold(img, 127, 255, cv.THRESH_... -
彩色图像的二值化,取经之旅第 6 天
2020-12-29 21:14:00图像的二值化,虽然不知道未来可以干啥,不过看起来很厉害的样子 -
二值化图片生成
2019-10-29 19:45:36由原图生成二值化图片 -
二值化神经网络
2018-04-17 20:14:54什么是二值化网络二值化神经网络,是指在浮点型神经网络的基础上,将其权重矩阵中权重值和各个激活函数值同时进行二值化得到的神经网络。二值化神经网络具有很好的特性,具体体现在:通过将权重矩阵二值化,一个权重... -
Python OpenCV 图像处理二值化,取经之旅第 7 天
2020-12-30 21:33:13二值化操作竟然还没有学完~ -
Matlab图像二值化
2017-03-23 21:02:41图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。 将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理... -
图片二值化
2017-11-27 14:41:59新一版的需求中,加入了图片二值化的处理,踩过坑,受过累,做一个标记,积累积累。。。 一、Android实现 /** * 该函数实现对图像进行二值化处理 */ public static Bitmap gray2Binary(Bitmap ... -
图片灰化和二值化
2017-11-02 12:43:01图片灰化和二值化处理 -
Emgu 学习笔记(二)---图像二值化,自适应阈值化,Otsu二值化
2017-04-14 17:12:51图像二值化,自适应阈值化,Otsu二值化 Emgu灰度化、二值化操作方法和OpenCV中区别不大,Threshold()来实现的。 自适应阈值是整幅图像使用一个阈值,自适应阈值是图像的不同区域使用不同的阈值,而这个阈值是对... -
二值化的方法
2019-01-04 15:35:211.二值化 图像二值化的目的是最大限度的将图像中感兴趣部分保留下来,在很多情况下,也是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。在这些庞大的图像二值化分类方法中,基于直方图的全局二值... -
作业:使用决策树(decision-tree)预测隐形眼镜类型(标签二值化(LabelBinarizer)复原输出)
2020-07-28 23:11:07使用决策树(decision-tree)预测隐形眼镜类型(标签二值化(LabelBinarizer)复原输出)