OpenCV图像处理----图像的二值化

news/2024/7/21 6:32:13 标签: opencv, 图像处理, 计算机视觉

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。


二值化的原理

import cv2

img = cv2.imread('img/lena.jpg')
# 转为灰度图
new_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
height, width = new_img.shape[0:2]

# 设置阈值
thresh = 60

# 遍历每一个像素点
for row in range(height):
    for col in range(width):
        # 获取到灰度值
        gray = new_img[row, col]
        # 如果灰度值高于阈值 就等于255最大值
        if gray > thresh:
            new_img[row, col] = 255
        # 如果小于阈值,就直接改为0
        elif gray < thresh:
            new_img[row, col] = 0

cv2.imshow('img', new_img)
cv2.waitKey()

在这里插入图片描述


OpenCV提供的图像二值化API

threshold()方法参数:

  1. 图片矩阵
  2. 阈值
  3. 图片中的最大值
  4. 二值化的方式

二值化的方式:

THRESH_BINARY高于阈值改为255,低于阈值改为0
THRESH_BINARY_INV高于阈值改为0,低于阈值改为255
THRESH_TRUNC截断,高于阈值改为阈值,最大值失效
THRESH_TOZERO高于阈值不改变,低于阈值改为0
THRESH_TOZERO_INV高于阈值该为0,低于阈值不改变
import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

thresh, new_img = cv2.threshold(img, 60, 255, cv2.THRESH_BINARY)

print(thresh)
cv2.imshow('img', img)
cv2.imshow('NEW_IMG', new_img)
cv2.waitKey()

在这里插入图片描述


自适应阈值

使用一个全局值作为阈值。但是在所有情况下这可能都不太好。如果图像在不同区域具有不同的照明条件。在这种情况下,自适应阈值阈值可以帮助。这里,算法基于其周围的小区域确定像素的阈值。因此,我们为同一图像的不同区域获得不同的阈值,这为具有不同照明的图像提供了更好的结果。

adaptlive()方法参数:

  1. 图片矩阵
  2. 图片灰度最大值
  3. 计算阈值的方法
  4. 阈值类型
  5. 处理块大小
  6. 算法所用的常量C
  • cv2.ADAPTIVE_THRESH_MEAN_C:该阈值是该附近区域减去恒定的平均Ç。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值减去常数C的高斯加权和。
import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

thresh_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 5)

cv2.imshow('thresh_img', thresh_img)
cv2.waitKey()

在这里插入图片描述

大津算法(最大类间方差法)

图像分割中阈值选取的最佳算法

threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

# 使用255的阈值进行二值化
ret, thresh_img = cv2.threshold(img, 255, 255, cv2.THRESH_BINARY)
cv2.imshow('normal', thresh_img)

# 使用高斯滤波模糊图像  参数1: 图片矩阵  参数2:卷积核 参数3: 越大越模糊
gaussian_img = cv2.GaussianBlur(img, (5, 5), 0)
cv2.imshow('gaussian_img', gaussian_img)

# 使用大津算法0阈值二值化经过高斯滤波模糊后的图像
ret, thresh_img = cv2.threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

cv2.imshow('otsu', thresh_img)

cv2.imshow('img', img)
cv2.waitKey()

原图:
在这里插入图片描述

使用255的阈值进行二值化 图片全黑了:

在这里插入图片描述

使用高斯滤波模糊图像:

  1. 图片矩阵
  2. 卷积核
  3. 越大越模糊

在这里插入图片描述

使用0阈值的大津算法二值化经过高斯滤波模糊后的图像:

在这里插入图片描述


http://www.niftyadmin.cn/n/740501.html

相关文章

OpenCV图像处理----图片卷积

图片卷积 图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是图像预处理中不可缺少的操作&#xff0c;其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法&#xff0c;它允许我们对图像进行处理&…

机器学习----纯手撸线性回归代码

什么是线性回归&#xff1f; 线性回归是利用函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析, 简单来说线性回归其实是试图找到自变量与因变量之间的关系 比如房子的面积和价格&#xff1a; 房子的面积越大&#xff0c;房子的价格就越高 假设房子的面积和价…

机器学习----感知机(神经网络的基础)

什么是感知机&#xff1f; 机器学习中有分类和回归两大问题&#xff1a; 回归预测线性问题&#xff0c;例如房子价格、每一年的降水量 。分类给物体分类&#xff0c;输出之后输出判断是一个香蕉还是一个苹果。 感知机是神经网络的基础 引入问题 颜色越红&#xff0c;形状越圆…

机器学习----PyTorch入门

PyTorch PyTorch是一个开源的python机器学习库 PyTorch的前身是Torch&#xff0c;其底层和Torch框架一样&#xff0c;使用Python重新写了很多内容 更加灵活&#xff0c;支持动态图&#xff0c;是一个以Python优先的深度学习框架&#xff0c;不仅能实现强大的GPU加速&#xff…

机器学习----PyTorch中的梯度计算

什么是梯度&#xff1f; 在一元函数中,某点的梯度标的就说某点的导数. 在多元函数中某点的梯度表示的是由每个自变量所对应的偏导数所组成的向量在前面的线性回归中 就像y wx b方程中求出w参数最优的解&#xff0c;就需要对w参数进行偏导数的求取&#xff0c;然后通过偏导数…

机器学习----PyTorch正向传播与反向传播

正向传播 神经网络本质上就是一个复杂且有很多参数的复合函数&#xff0c;数据为函数的输入&#xff0c;结果为函数的输出。正向传播就是通过函数的输入以及神经网络&#xff0c;得到函数的输出。通常用来验证当前的参数是否是最优解&#xff0c;或者已经训练好的模型用来检测…

机器学习----PyTorch模型训练

PyTorch 在前面使用纯手工做了线性回归&#xff0c;线性回归的问题其实就是求解损失函数最小的情况下的w值。在PyTorch里面很多的函数都进行了封装&#xff0c;我们直接用就可以。 损失函数 手写损失函数 def loss(y, y_pred):"""损失函数"""…

PyTorch----从零实现乳腺癌预测

分类问题 使用线性回归解决的都是线性问题&#xff0c;而乳腺癌预测是分类问题。 那么PyTorch是怎么求解一个非线性问题&#xff1f; 乳腺癌预测 根据血常规的化验预测&#xff0c;查询出规律。有30多个特征&#xff0c;输出0或1 是否患有乳腺癌。 一、获取数据 import pa…