【OpenCV】【入门】4.图像阈值化处理

软件环境

本系列文章中所提到的接口及代码在以下环境中得到过验证:

Python == 3.8.5
opencv-contrib-python == 4.5.5.64
numpy == 1.23.2

前言

在寻找图像中特征的应用中,对图像做阈值化处理是非常常见的一个操作。阈值化处理可以很方便的从灰度图中提取出某个较亮或较暗的区域,或者是从彩色图片中将具有某种颜色的区域与其它区域区分出来。
阅读此文章前请先阅读本系列文章中的【【入门】2.色彩空间转换】。

API介绍

cv2.threshold( src, thresh, maxval, type[, dst] ) -> retval, dst

该函数多用于灰度图像的二值化处理中
在这里插入图片描述
src 输入图像数组
dst 输出图像数组
thresh 图像阈值
maxval 与 THRESH_BINARY 和 THRESH_BINARY_INV 阈值类型一起使用的最大值
type 阈值类型(请参阅阈值类型,常见的如下表)

选项像素值>thresh其他情况
cv2.THRESH_BINARYmaxval0
cv2.THRESH_BINARY_INV0maxval
cv2.THRESH_TRUNCthresh当前灰度值
cv2.THRESH_TOZERO当前灰度值0
cv2.THRESH_TOZERO_INV0当前灰度值

另有以下特殊取值:

选项用处
cv2.THRESH_OTSU使用 Otsu 算法选择最佳阈值
cv2.THRESH_TRIANGLE使用三角形算法选择最佳阈值
cv2.THRESH_MASK【官方文档此处为空白】

cv2.inRange( src, lowerb, upperb[, dst] ) -> dst

该函数多用于彩色图像的二值化处理中
在这里插入图片描述
src 输入图像数组
lowerb 阈值下限数组
upperb 阈值上限数组
dst 输出图像数组

处理灰度图

1、提取物体的特征

如图所示,这是一张智能车上所搭载的灰度摄像头所拍摄到的画面,如果我们需要将赛道的边缘提取出来,需要如何操作呢?
在这里插入图片描述
最简单的一个操作就是对整张图片使用二值化操作:

import cv2

img = cv2.imread('gray_test.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('gray', img)

ret1, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)     # 使用130作为图像阈值
cv2.imshow('THRESH_BINARY', thresh1)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果:
在这里插入图片描述

2、自适应阈值

从使用者的角度来判定一个程序设计得合不合理,肯定不是看其在理想条件下的表现,而是看其在不同环境下的适应能力。上面这种将二值化阈值写死的的操作,如果环境的灯光出现了较大的改变(例如上帝之光),那么这个阈值肯定会失效。针对这个场景,我们可以留意cv2.THRESH_OTSUcv2.THRESH_TRIANGLE这两个特殊的API:

import cv2

img = cv2.imread('gray_test.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('gray', img)

# 阈值处理
ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_TRIANGLE)
ret3, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 平均值阈值
th4 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,10)
# 高斯阈值
th5 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,10)

cv2.imshow('THRESH_BINARY', thresh1)
cv2.imshow('THRESH_BINARY+TRIANGLE', thresh2)
cv2.imshow('THRESH_BINARY+OTSU', thresh3)
cv2.imshow('ADAPTIVE_THRESH_MEAN_C', th4)
cv2.imshow('ADAPTIVE_THRESH_GAUSSIAN_C', th5)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果:
在这里插入图片描述在这里插入图片描述

处理彩色图片

将彩色图像在HSV色彩空间下处理可以在一定程度上避免环境光线的影响。HSV色彩空间使用色调(Hue,也称色相)、饱和度(Saturation)、亮(Value)度表示图像。

import cv2
import numpy as np

img = cv2.imread('test.jpg')
cv2.imshow('img', img)
 
# 从BGR色彩空间转换到HSV色彩空间
grid_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# H、S、V范围:
lower1 = np.array([58,100,0])
upper1 = np.array([78,150,255])
mask1 = cv2.inRange(grid_HSV, lower1, upper1)       # mask1 为二值图像
cv2.imshow('mask1', mask1)


cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

参考

https://docs.opencv.org/4.5.5/d2/de8/group__core__array.html#ga48af0ab51e36436c5d04340e036ce981
https://blog.csdn.net/u011493046/article/details/126570604

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值