4. 农业图像灰度化与二值化
在农业视觉任务中,彩色图像携带的信息量很大,但很多分析目标——叶片轮廓、病斑面积、籽粒形状、杂草覆盖度——本质上只关心“亮暗”与“前景/背景”的区分。灰度化与二值化正是把三维彩色信息压缩为可计算、可分割表达的关键预处理环节。本节围绕灰度化方法、全局阈值与自适应阈值、Otsu 阈值法,以及作物与背景分离的实战展开。
一、灰度化:从三通道到单通道
OpenCV 默认以 BGR 顺序读入图像。最常用的灰度化是加权求和:
gray = 0.114*B + 0.587*G + 0.299*R
这组权重来自人眼对绿光最敏感、蓝光最迟钝的亮度感知特性。在 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 中即按此公式计算。对农业图像而言,绿色通道往往最能区分健康叶片与土壤背景,因此有时直接取 img[:,:,1] 作为“灰度”反而比标准加权更利于后续分割——这是一种有意的通道选择,而非标准灰度化。
另一种常见做法是使用 HSV 空间中的 V(明度)通道,或对 R、G、B 取算术平均。前者对光照变化更稳健,后者计算简单但会削弱对比度。选择哪种方式,取决于后续要突出的是颜色差异还是亮度差异:若目标是分离绿色作物与褐色土壤,优先考虑 G 通道或 2G-R-B 这类超绿指数;若目标是检测果实亮度,则标准灰度或 V 通道更合适。
二、全局阈值与自适应阈值
灰度图到手后,二值化的核心是选阈值。全局阈值对整个图像使用同一个 T:
_, bw = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
它实现简单、速度快,适合光照均匀的室内育苗盘、扫描叶片等场景。但田间图像常存在阴影、反光和光照梯度,固定阈值会把亮处的土壤误判为作物,或把暗处的叶片漏掉。
自适应阈值则对每个像素根据其邻域统计量单独计算阈值,OpenCV 提供均值法和高斯法:
bw = cv2.adaptiveThreshold(gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 35, 10)
其中 blockSize=35 表示邻域窗口边长(必须为奇数),C=10 是从邻域均值中减去的偏置。窗口越大,阈值越平滑、越能适应大范围光照变化;C 越大,被判为前景的像素越少。实践中可先固定 C,再以 15、25、35、51 等窗口做对比,观察叶脉、虫孔等细节是否被保留。
三、Otsu 阈值法及其在农业图像中的适用性
Otsu 法遍历所有可能阈值,计算前景与背景两类的类间方差,取使方差最大的阈值。它无需人工设定 T,在直方图呈明显双峰时效果接近最优。调用只需在 cv2.threshold 中加上标志:
t, bw = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print(t) # 示例中可能得到 96 之类的自动阈值
农业场景中,Otsu 特别适合背景相对单一、目标与背景亮度差异明显的图像,例如白色育苗盘上的绿色幼苗、深色传送带上的籽粒。但当图像中土壤、阴影、枯叶同时存在,直方图出现多峰或宽峰时,Otsu 求出的单一阈值会把部分背景并入前景。此时可先做高斯模糊抑制噪声,或先按颜色指数增强对比度,再交给 Otsu。
四、作物与背景分离实战
下面以“绿色叶片与土壤分离”为例,给出一个可复现的处理流程(参数为教学示例,需按实际图像调整):
import cv2, numpy as np
img = cv2.imread("field.jpg")
# 1) 超绿指数增强作物与土壤差异
b, g, r = cv2.split(img.astype(np.int16))
exg = 2*g - r - b
exg = np.clip(exg, 0, 255).astype(np.uint8)
# 2) 轻度高斯模糊抑制噪点
blur = cv2.GaussianBlur(exg, (5, 5), 0)
# 3) Otsu 自动阈值
t, bw = cv2.threshold(blur, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 4) 形态学去小噪点、填孔
k = np.ones((3, 3), np.uint8)
bw = cv2.morphologyEx(bw, cv2.MORPH_OPEN, k)
bw = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, k)
# 5) 统计前景占比
ratio = bw.mean() / 255.0
print("作物覆盖比例约", round(ratio, 3))
处理过程中值得观察的变化是:超绿指数把“绿色程度”变成亮度,使叶片明显亮于土壤;模糊后直方图双峰更干净;Otsu 给出的阈值通常落在两峰之间的谷底附近;开运算去掉零散亮点,闭运算补上叶片内部的小孔。最终用前景像素占比、连通域数量和轮廓面积分布来判断分割是否可用——若覆盖比例与目测明显不符,或出现大量碎片连通域,说明阈值或颜色指数需要调整。
cv2.bitwise_and(img, img, mask=bw) 把原图裁剪出来,再在彩色数据上提取特征。小结:灰度化决定“用什么亮度表达目标”,阈值方法决定“在哪里切开前景与背景”。全局阈值简单但怕光照,自适应阈值灵活但参数敏感,Otsu 自动但依赖双峰分布。农业图像中,先做颜色指数增强、再选阈值策略、最后用形态学与统计指标验证,是一条稳定可复现的作物与背景分离路线。