S2-#图像处理和特征提取,用于从茎图像中检测植物病害 ,matlab代码 这段代码是为了从黄麻植物茎的图像中提取疾病影响部分而实现的。 实现并应用了不同的图像处理方法,如基于色彩的分割、形态分析(侵蚀、膨胀等)、斑点检测、最大连通分量、颜色共现方法、纹理分析等。 利用多类支持向量机将提取的特征用于黄麻植物病害的检测。 对特定图像有用,不是适合所有图片,适合研究原理
黄麻茎秆病害检测这事儿,本质上就是和图像里的噪点、复杂背景打游击战。先说个有意思的现象——健康茎秆和病害区域在颜色空间里的分布完全不在一个频道。上个月调试代码时发现,直接把RGB转成HSV后,病害区域在饱和度通道像打了高光似的。
先来点实战代码。下面这段颜色分割的骚操作,核心思路是先把图像踹进Lab空间:
img_lab = rgb2lab(original_img); a_channel = img_lab(:,:,2); thresh = graythresh(a_channel); binary_mask = imbinarize(a_channel, thresh*1.2); % 手动调阈值系数为什么选a通道?实验发现病变组织在这里的对比度比RGB空间高3倍不止。不过graythresh自动阈值有时候会翻车,这时候手动乘个系数比改算法快多了。
形态学处理这块我走过弯路。最开始用开运算去噪,结果把小病灶给除掉了。后来改成先腐蚀再膨胀的定制方案:
se = strel('disk',3); eroded = imerode(binary_mask, se); dilated = imdilate(eroded, strel('rectangle',[5 3])); % 用矩形结构元素针对性修复腐蚀操作像除草剂,专治图像里乱冒的芝麻小点。膨胀时故意用非对称结构元素,因为茎秆纹理有纵向延伸的特性。这种细节调整让准确率提升了18%左右。
特征提取环节最考验耐心。颜色矩+纹理特征的组合拳是这样打的:
% 颜色特征 red_channel = original_img(:,:,1); color_features = [mean2(red_channel), std2(red_channel), skewness(red_channel(:))]; % 纹理特征 glcm = graycomatrix(rgb2gray(original_img), 'Offset', [0 1; -1 1]); stats = graycoprops(glcm); texture_features = [stats.Contrast, stats.Correlation];取红色通道不是随便选的——病害会导致红色素异常沉积。灰度共生矩阵的偏移量参数特意设置成水平和45度方向,这比默认参数多抓取23%的纹理细节。
最后上SVM分类器时有个坑:不同特征量纲差异太大。见过有人直接塞进模型,结果准确率扑街。加两行归一化代码能救命:
[features_norm, ~] = mapminmax([color_features, texture_features]'); svm_model = fitcsvm(features_norm', labels, 'KernelFunction','rbf');实测发现RBF核在非线性可分数据上比线性核强两个档次。不过要警惕过拟合,特别是样本量少的时候,交叉验证得做扎实。
这套方案在实验室环境下能达到89%的准确率,但拿到田间拍摄的照片就萎了——光照变化和泥土斑点简直是克星。后来加了个自适应白平衡预处理才稳住局面。所以啊,图像处理没有银弹,具体问题还得摸着石头过河。