您现在的位置是:首页 >技术杂谈 >opencv二值化详解网站首页技术杂谈
opencv二值化详解
大家好,今天来跟大家讲讲 opencv二值化。 先从一个比较经典的方法开始讲解,看 opencv官方文档: 二值化(binary)的定义:在一个输入图像中,将其一个像素点设置为0,将其两个像素点设置为1。 二值化可以使图像中的每个像素值都被指定为0或1。在二值化之前,每个像素都是灰度的。 二值化是图像处理中最常用的方法之一,它的目的是将一个像素点从灰度图像转变成彩色图像。可以说二值化是一种常用的图像处理技术。 我们先来看下 opencv官方文档的方法: 从上面这段话,我们可以看到,对于一幅图片来说,二值化后需要先对图片进行归一化,然后再转换成彩色图像。 在 opencv官方文档中,把二值化分为三个步骤: 1、归一化图像; 2、转换为彩色图像; 我们先来看下二值化的定义:
-
1、归一化图像
归一化图像主要是为了解决在二值化过程中,因为光照变化或者像素颜色不一致而产生的影响,从而使得图像的像素点的灰度大小一致,以方便后期二值化操作。 在 opencv官方文档中,对于一个物体来说,其像素点可以按照以下方式来设置: 这种设置方式就是我们平时说的归一化图像,那么这里有个问题,就是如果物体中包含了多个像素点怎么办?为了解决这个问题,在 opencv官方文档中给出了一个简单的处理方法: 通过这个方法,我们可以对物体进行归一化。这个方法的思路非常简单,就是将物体中所有的像素点进行统一处理。 这种归一化方式对于物体中包含多个像素点来说是非常好的,因为在二值化过程中,需要对图像进行运算,如果每个像素点的颜色不一样,就会导致运算结果不一致。当然了,这个方法是有限制条件的: 1、物体中包含的像素点必须是灰度大小一致; 2、图像必须是一个黑色像素点和一个白色像素点组成;
-
2、转换为彩色图像
前面的归一化图像,相当于把原图的灰度信息去掉了,为后面的颜色信息做准备。那么这里就需要对原图进行一些处理,比如加个色标之类的。这样做主要是为了避免二值化过程中,因为像素点颜色不同而造成的误差,所以这步很关键。 在 opencv中有一个opencv_color方法,使用它可以将输入图片转换成彩色图像。opencv_color方法会对图片进行一些处理,比如设置一个阈值,这个阈值就是图像中的灰度值与要转换成彩色图像的灰度之间的差。如果阈值不是零,那么该像素将被转换为颜色。 下面就来看看这个方法如何处理图片: 1、首先我们将图片保存下来。为了方便后面使用,我们在保存之前先进行一次缩放处理。因为图片是 jpg格式,所以我们首先要打开它。 2、然后打开一个新文件,先保存到其他位置: 3、最后我们打开转换好的 color文件,看看效果如何: 4、然后我们就可以在 opencv中调用这个方法来实现图片的二值化了。 下面看一个简单的例子: 上面是一个比较经典的二值化演示代码: 这个例子其实是有一个特殊点的:由于图像是黑白图像,所以我们只需要先把颜色降成黑白就可以了。但是对于很多情况下,我们需要把一幅图像转换成彩色图像。例如在人脸识别中,我们可能需要把人脸转化成彩色图像(因为人脸是彩色的);在视频监控中我们可能需要把视频转换成彩色图像(因为视频是黑白的);所以大家可以看到这个方法的处理过程还是比较复杂的。
-
3、把归一化图像转换成彩色图像
对图像进行归一化是为了消除噪声,使图像更清晰。归一化后,我们就可以开始把图片转换成彩色图像了。 关于二值化, opencv官方文档给出了两种方法: (1)、基于灰度的方法: 这种方法是用像素值的范围来判断一个像素是否属于一个颜色通道,从而把像素值从灰度图像转换成彩色图像。在这种方法中,我们会得到两个分别用0和1表示的值:0代表是黑色,1代表是白色。颜色通道的选择会根据图像中每个像素的灰度值来决定,因此也被称为灰度图。 这种方法将图像分成了三个颜色空间,分别为 RGB (红、绿、蓝)、 HSV (红和 YCbCr (红、蓝)。这种方法实际上是把图像中每个像素点的值都看作是三个颜色空间中的一个,所以也被称为彩色图。 对于灰度图来说,它不能反映出图像的真实颜色,而将灰度图转换为彩色图是为了利用图像中每个像素点的颜色信息来处理图像。 一般情况下,在进行图像处理时会对灰度和彩色图像分别进行处理。 从上面两种方法可以看出,通过转换之后,两种方法得到的结果都是彩色图。
-
4、把归一化后的彩色图像转换成二值图像
上面是一个很经典的方法,下面我们来看下具体步骤: 1、选择图像区域:要处理的图像,即需要二值化的区域,选择一个最大值或者最小值; 2、对图像进行归一化:首先要对图像进行归一化,从上面的图片可以看到,归一化后的图片就变成了彩色图像了,所以我们需要先将原图进行归一化处理; 3、将归一化后的图片转换为二值图像:这个步骤很重要,因为 opencv只支持2*2、4*4等比较大的二值化区域,所以我们需要将归一化后的图片转换为二值图像; 4、用彩色图像处理二值化:大家应该都知道,彩色图像的像素点是由红绿蓝三个颜色构成,而我们在处理二值化时,将像素点转换为 RGB值(红绿蓝三个颜色),这样就完成了对图片的二值化,下面是具体步骤: 5、用 RGB图像处理二值化:前面几个步骤已经完成了对图片进行了归一化处理,所以我们现在需要把图片转换为 RGB值(红绿蓝三个颜色),再用同样的方法对 RGB图像进行二值化处理; 7、最后对图片进行裁剪:把图片中不需要的部分裁剪掉;
-
5、将二值图像转换为像素点的灰度值
如果将二值图像转换为像素点的灰度值,那么这个过程就叫做转换。转换的过程与归一化过程相反,是先将图像转换为灰度值,然后再将其转换为像素点的灰度值。 通过上面这段代码,我们可以看到,要把图片转换为像素点的灰度值,首先是要把图片转换成 RGB颜色空间,然后再用 opencv进行处理,这里就需要调用 opencv库的 image.plot_binary ()函数了。 这段代码中我们使用了一个新的方法来进行灰度值的计算: 在这里我们要用到 opencv中的 image.plot_binary ()函数,这个函数的作用是计算像素点灰度值。
以下是几个常用的OpenCV二值化代码示例:
1. 全局阈值二值化:
```python
import cv2
img = cv2.imread('image.jpg', 0)
_, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('image', img)
cv2.imshow('threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
2. 自适应阈值二值化:
```python
import cv2
img = cv2.imread('image.jpg', 0)
thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('image', img)
cv2.imshow('adaptive threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
3. Otsu二值化:
```python
import cv2
img = cv2.imread('image.jpg', 0)
_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('image', img)
cv2.imshow('Otsu threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这些示例代码可以根据需要进行修改和调整,以适应不同的图像处理任务。