软件环境
本系列文章中所提到的接口及代码在以下环境中得到过验证:
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_BINARY | maxval | 0 |
cv2.THRESH_BINARY_INV | 0 | maxval |
cv2.THRESH_TRUNC | thresh | 当前灰度值 |
cv2.THRESH_TOZERO | 当前灰度值 | 0 |
cv2.THRESH_TOZERO_INV | 0 | 当前灰度值 |
另有以下特殊取值:
选项 | 用处 |
---|---|
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_OTSU与cv2.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