typora-copy-images-to: image

二值化实验

二值化,顾名思义,就是将某张图像的所有像素改成只有两种值之一,其操作的图像也必须是灰度图。也就是说,二值化的过程,就是将一张灰度图上的像素根据某种规则修改为0和maxval(maxval表示最大值,一般为255,显示白色)两种像素值,使图像呈现黑白的效果,能够帮助我们更好地分析图像中的形状、边缘和轮廓等特征。

在本实验中,使用了六种不同的方式来对灰度图进行二值化。

1. 阈值法(THRESH_BINARY)

阈值法就是通过设置一个阈值,将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(黑),大于阈值的像素就被设置为maxval。

| 在这里插入图片描述
| 在这里插入图片描述
|
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 灰度图 | 二值化图 |

如上图所示,在灰度图中像素值较高的地方,如猫咪的背景、脸部等地方的像素值比阈值高,那么在生成的二值化图中的对应位置的像素值就会被设置为255,也就是纯白色。

示例代码:

import cv2
#阈值法二值化:大于thresh的像素值被设置为maxval,小于等于thresh的值被设置为0(THRESH_BINARY)
img=cv2.imread("./cat1.png",cv2.IMREAD_GRAYSCALE)
#image要二值化的灰度图 127代表阈值  230最大值超过就取它  cv2.THRESH_BINARY二值化的类型(简单的二值化)
_,img_binary=cv2.threshold(img,127,230,cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("img_binary",img_binary)
cv2.waitKey(0)

2. 反阈值法(THRESH_BINARY_INV)

顾名思义,就是与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会变成0(黑),当灰度图的像素值小于等于阈值时,该像素值将会变成maxval。

| 在这里插入图片描述
| 在这里插入图片描述
|
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 灰度图 | 二值化图 |

如上图所示,使用反阈值法对灰度图进行二值化时,会将灰度图中像素值大于阈值的地方置为0(也就是黑),将灰度图中像素值小于阈值的地方置为255(也就是白)。

示例代码:

import cv2
#反阈值法二值化:大于thresh的像素值被设置为0,小于等于thesh值被设置为maxval(THRESH_BINARY_INV)
img=cv2.imread("./cat1.png",cv2.IMREAD_GRAYSCALE)
_,img_binary=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
#image要二值化的灰度图 127代表阈值超过就取0  255最大值  cv2.THRESH_BINARY_INV二值化的类型
cv2.imshow("img",img)
cv2.imshow("img_binary",img_binary)
cv2.waitKey(0)

3. 截断阈值法(THRESH_TRUNC)

截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小于等于阈值的部分不变。换句话说,经过截断阈值法处理过的二值化图中的最大像素值就是阈值。

| 在这里插入图片描述
| 在这里插入图片描述
|
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 灰度图 | 二值化图 |

当截断阈值为127时时,如上图所示,可以看到由灰度图变为二值图,图片的亮度变低了。

示例代码:

import cv2
#截断阈值法二值化:大于thresh的像素值被设置为thresh,小于等于thresh的像素值保持不变(THRESH_TRUNC)
img=cv2.imread("./cat1.png",cv2.IMREAD_GRAYSCALE)
_,img_binary=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
#image要二值化的灰度图 127代表阈值超过就取0  255最大值  cv2.THRESH_BINARY_INV二值化的类型
cv2.imshow("img",img)
cv2.imshow("img_binary",img_binary)
cv2.waitKey(0)

4. 低阈值零处理(THRESH_TOZERO)

低阈值零处理,字面意思,就是像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。

| 在这里插入图片描述
| 在这里插入图片描述
|
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 灰度图 | 二值化图 |

如上图所示,在灰度图中较亮的部分,其像素值比阈值大,所以在二值化后其像素值并没有发生变化。而灰度图中较暗的部分,也就是像素值较低的地方,由于像素值比阈值小,就会被置为0,对应二值化图中的黑色部分。

示例代码:

import cv2
#低阈值零处理:像素值小于等于thresh被设置为0,大于thresh保持不变(THRESH_TOZERO)
img=cv2.imread("./cat1.png",cv2.IMREAD_GRAYSCALE)
_,img_binary=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
#image要二值化的灰度图 127代表阈值超过就取0  255最大值  cv2.THRESH_TOZERO二值化的类型
cv2.imshow("img",img)
cv2.imshow("img_binary",img_binary)
cv2.waitKey(0)

5. 超阈值零处理(THRESH_TOZERO_INV)

超阈值零处理就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0(也就是黑色),像素值小于等于阈值的部分不变。

| 在这里插入图片描述
| 在这里插入图片描述
|
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 灰度图 | 二值化图 |

如上图所示,在灰度图中较亮的部分,其像素值比阈值大,所以在二值化后其像素值会被置为0(也就是黑色),对应二值化图中的黑色部分。而灰度图中较暗的部分,也就是像素值较低的地方,由于像素值比阈值小,将不会发生改变。

示例代码:

import cv2
#超阈值零处理:像素值大于thresh被设置为0,小于等于thrsh保持不变(THRESH_TOZERO_INV)
img=cv2.imread("./cat1.png",cv2.IMREAD_GRAYSCALE)
_,img_binary=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
#image要二值化的灰度图 127代表阈值超过就取0  255最大值  cv2.THRESH_TOZERO_INV二值化的类型
cv2.imshow("img",img)
cv2.imshow("img_binary",img_binary)
cv2.waitKey(0)

6.OTSU阈值法

OTSU算法是通过一个值将这张图分前景色和背景色(也就是灰度图中小于这个值的是一类,大于这个值的是一类),通过统计学方法(最大类间方差)来验证该值的合理性,当根据该值进行分割时,使用最大类间方差计算得到的值最大时,该值就是二值化算法中所需要的阈值。通常该值是从灰度图中的最小值加1开始进行迭代计算,直到灰度图中的最大像素值减1,然后把得到的最大类间方差值进行比较,来得到二值化的阈值。

| 在这里插入图片描述
| 在这里插入图片描述
|
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 灰度图 | 二值化图 |

示例代码:

import  cv
#OTSU阈值法:通过一个值将这张图分前景色和背景色(也就是灰度图中小于这个值的是一类,大于这个值的是一类(THRSH_OTSU)
img=cv2.imread("./cat1.png",cv2.IMREAD_GRAYSCALE)
_,img_binary=cv2.threshold(img,127,255,cv2.THRESH_OTSU)
cv2.imshow("img",img)
cv2.imshow("img_binary",img_binary)
cv2.waitKey(0)
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐