1. ¿Qué es la binarización?
La binarización de imágenes consiste en establecer el "valor de gris" del píxel en la imagen en [0, 0, 0] o [255, 255, 255], es decir, negro puro o blanco puro.
2. El papel de la binarización
A través de la binarización, la forma y el contorno de los objetos se pueden analizar mejor.
3. Realización de la binarización
La implementación de la binarización generalmente incluye: método de
umbral global, método de umbral adaptativo, binarización OTSU, etc.
, es 0.
(2) Método de umbral adaptativo
El método de umbral global es relativamente simple y tosco. El principio del método de umbral adaptativo es comparar el punto de píxel con el valor promedio de los píxeles en el área donde se encuentra el punto, y si es mayor que 255, de lo contrario, es 0. (3) La binarización de OTSU no es muy claro, y se realizará después de encuentros
posteriores Replenish.
4. Implementación del código
# ---------------------------
# @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()
Efecto:
Dimensiones impresas:
原图的shape: (2338, 1080)
全局阈值的shape: (2338, 1080)
局部阈值的shape: (2338, 1080)
OTSU的shape: (2338, 1080)
Nota:
La implementación del código de este artículo se refiere a este artículo. Este artículo está muy bien escrito. Puede consultarlo: Agregar descripción del enlace