Python实现图片二值化

1. 什么是二值化

图像二值化就是将图像上的像素点的"灰度值"设置为[0, 0, 0]或[255, 255, 255],即要么纯黑,要么纯白。

2. 二值化的作用

通过二值化,能更好地分析物体的形状和轮廓。

3. 二值化的实现

二值化的实现一般有: 全局阈值法、自适应阈值法、OTSU二值化等 (1)全局阈值法 就是选定一个全局阈值,大于这个值的色素点就赋值为255;反之为0。 (2)自适应阈值法 全局阈值法相对比较简单粗暴。自适应阈值法的原理就是将像素点与该点所在区域的像素的平均值做比较,大于则赋予255;反之,为0. (3)OTSU二值化 不太明白,后续遇到后再进行补充。

4.代码实现

ini 复制代码
# ---------------------------
# @Time     : 2022/5/2 22:37
# @Author   : lcq
# @File     : two_.py
# @Function : 图像二值化
# ---------------------------

import cv2
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.rcParams['font.sans-serif'] = ['SimHei']     # 显示中文
# 为了坐标轴负号正常显示。matplotlib默认不支持中文,设置中文字体后,负号会显示异常。需要手动将坐标轴负号设为False才能正常显示负号。
matplotlib.rcParams['axes.unicode_minus'] = False


# 读取灰度图像
img = cv2.imread("C:\\Users\\17631\\Desktop\\test.jpeg", 0)
print("原图的shape: ", img.shape)
plt.subplot(2, 2, 1)
plt.imshow(img, cmap='gray')
plt.title("原图")


# 1.全局阈值法
ret, mask_all = cv2.threshold(src=img,                  # 要二值化的图片
                              thresh=127,               # 全局阈值
                              maxval=255,               # 大于全局阈值后设定的值
                              type=cv2.THRESH_BINARY)   # 设定的二值化类型,THRESH_BINARY:表示小于阈值置0,大于阈值置填充色
print("全局阈值的shape: ", mask_all.shape)
plt.subplot(2, 2, 2)
plt.imshow(mask_all, cmap='gray')
plt.title("全局阈值")

# 2.自适应阈值法
mask_local = cv2.adaptiveThreshold(src=img,                                     # 要进行处理的图片
                                   maxValue=255,                                # 大于阈值后设定的值
                                   adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,   # 自适应方法,ADAPTIVE_THRESH_MEAN_C:表区域内均值;ADAPTIVE_THRESH_GAUSSIAN_C:表区域内像素点加权求和
                                   thresholdType=cv2.THRESH_BINARY,             # 同全局阈值法中的参数一样
                                   blockSize=11,                                # 方阵(区域)大小,
                                   C=1)                                         # 常数项,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
print("局部阈值的shape: ", mask_local.shape)
plt.subplot(2, 2, 3)
plt.imshow(mask_local, cmap='gray')
plt.title("局部阈值")

# 3.OTSU二值化
ret2, mask_OTSU = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print("OTSU的shape: ", mask_OTSU.shape)
plt.subplot(2, 2, 4)
plt.imshow(mask_OTSU, cmap='gray')
plt.title("OTSU")

plt.show()

效果: 打印的维度:

makefile 复制代码
原图的shape:  (2338, 1080)
全局阈值的shape:  (2338, 1080)
局部阈值的shape:  (2338, 1080)
OTSU的shape:  (2338, 1080)

注:

本文的代码实现有参考这一篇文章,这篇文章写得非常好,各位可查看:添加链接描述

相关推荐
努力学算法的蒟蒻25 分钟前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_8414956429 分钟前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
AC赳赳老秦31 分钟前
2026国产算力新周期:DeepSeek实战适配英伟达H200,引领大模型训练效率跃升
大数据·前端·人工智能·算法·tidb·memcache·deepseek
2401_841495641 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
budingxiaomoli1 小时前
优选算法-字符串
算法
qq7422349841 小时前
APS系统与OR-Tools完全指南:智能排产与优化算法实战解析
人工智能·算法·工业·aps·排程
A尘埃2 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹2 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
不穿格子的程序员2 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
大江东去浪淘尽千古风流人物2 小时前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam