一、前言
大家好,这里是matlab图像处理毕设系列文章!
各位同学对毕设这一块有任何疑问都可以联系咨询交流。QQ空间-分享生活,留住感动
这两年开始,各个学校对毕设的要求越来越高,难度也越来越大,一些同学在毕业设计上,耗费时间长、精力耗费多,最后折腾一番还达不到要求,吃力不讨好。希望这些系列的文章对各位同学的思考能带来一点帮助。
系列文章均以案例为基础,简要概述算法原理和具体代码算法流程,话不多说,今天要分享的新项目是
基于LBP和HSV特征的KNN的葡萄分类识别系统
二、识别原理
在图像处理领域,传统图像识别方法的核心是手工设计特征并结合分类器进行模式识别。其流程可分为特征提取与分类两大部分,前期我们的系列文章中对特征提取、分类器做了比较详细的介绍,这里就不再重复贴上来了,想了解的同学可以看看前期文章。
【水果识别】基于傅里叶描述子和KNN的水果识别系统-Matlab(https://zhuanlan.zhihu.com/p/1900589059354654375)
三、核心算法介绍
(1)局部二值模式(Local Binary Pattern, LBP)
局部二值模式(Local Binary Pattern, LBP)是一种用于图像纹理分析和特征提取的有效算法,广泛应用于人脸识别、纹理分类等领域。以下是对LBP算法的详细介绍:
1. 基本原理
LBP通过比较像素与其邻域的灰度值生成二进制模式,捕捉局部纹理特征。核心思想是将每个像素的邻域二值化,生成一个描述局部结构的编码。
2. 实现步骤
2.1 邻域选择
- 传统LBP:使用3×3邻域,中心像素与周围8个像素比较。
- 圆形邻域(扩展LBP):在半径为RR的圆上均匀采样PP个点,通过插值(如双线性插值)获取非整数坐标的像素值,记为LBPP,RLBPP,R。
2.2 二值化与编码
- 对每个邻域点gpgp与中心像素gcgc比较,生成二进制位:
s(gp−gc)={1若 gp≥gc0否则s(gp−gc)={10若 gp≥gc否则
- 按固定顺序(如顺时针)排列二进制位,转换为十进制值作为LBP编码。
2.3 特征图生成
- 每个像素的LBP值构成特征图,值范围为00到2P−12P−1。
3. 改进方法
3.1 统一模式(Uniform Patterns)
- 定义:若二进制序列中0/1跳变次数(如00001110跳变2次)≤2次,则为统一模式。
- 作用:将模式数从2P2P减少到P(P−1)+2P(P−1)+2。例如,P=8P=8时,模式数从256降为59,提高效率。
3.2 旋转不变性
- 方法:对二进制序列循环移位,取最小值作为旋转不变编码。
- 结合统一模式:进一步减少特征维度(如P=8P=8时仅需9种模式)。
3.3 多尺度分析
- 使用不同PP和RR组合(如LBP8,1LBP8,1、LBP16,2LBP16,2),捕捉多尺度纹理特征。
4. 特征提取与应用
4.1 分块统计直方图
- 步骤:
- 将图像划分为子区域(如16×16块)。
- 每个子区域计算LBP直方图。
- 连接所有子区域直方图,形成全局特征向量。
- 优点:保留空间分布信息,增强区分能力。
4.2 应用场景
- 人脸识别:结合分块LBP和分类器(如SVM)。
- 纹理分类:如医学图像分析、工业表面检测。
- 实时系统:计算高效,适合嵌入式设备。
5. 优缺点
优点
- 计算高效:仅需比较和位运算,适合实时处理。
- 光照鲁棒性:对灰度线性变化不敏感。
- 局部特征保留:捕捉细微纹理差异。
缺点
- 噪声敏感:噪声可能导致错误二值化。
- 缺乏全局信息:需分块处理弥补。
- 复杂纹理限制:对高度非均匀纹理效果有限。
6. 数学表达
- LBP值计算:
LBPP,R=∑p=0P−1s(gp−gc)⋅2pLBPP,R=p=0∑P−1s(gp−gc)⋅2p
- 旋转不变LBP:
LBPP,Rri=min{ROR(LBPP,R,i)∣i=0,1,...,P−1}LBPP,Rri=min{ROR(LBPP,R,i)∣i=0,1,...,P−1}
其中,ROR表示循环右移。
7. 变种与扩展
- 中心对称LBP:比较对称点简化计算。
- 三值LBP(TLBP):引入中间状态增强鲁棒性。
- 动态纹理LBP:结合时间信息分析视频序列。
LBP以其简洁高效成为纹理分析的基石,后续改进持续提升其性能,适用于多样化的图像处理任务。
(2)HSV颜色特征算法
1、HSV颜色空间的基本概念
HSV(Hue, Saturation, Value)颜色空间是一种基于人类颜色感知的模型,包含三个分量:
- 色相(Hue):表示颜色类型,取值范围为0°~360°,对应色轮上的角度(如红色为0°/360°,绿色为120°,蓝色为240°)。
- 饱和度(Saturation):表示颜色纯度,范围0%(灰度)~100%(完全饱和)。
- 明度(Value):表示颜色亮度,范围0%(黑色)~100%(最大亮度)。
HSV空间常被建模为倒立圆锥体或圆柱体,其中H为绕中心轴的角度,S为半径,V为高度。
2、RGB到HSV的转换算法
转换公式(假设RGB归一化到[0,1]):
- 计算最大值与最小值:
- V=max(R,G,B)V=max(R,G,B)
- min=min(R,G,B)min=min(R,G,B)
- Δ=V−minΔ=V−min
- 饱和度S:
S={0if V=0ΔVotherwiseS={0VΔif V=0otherwise
- 色相H:
- 若Δ=0Δ=0,H=0H=0(无色相)。
- 否则,根据最大值分量计算:
- 若R为最大值:H=60°×(G−BΔmod 6)H=60°×(ΔG−Bmod6)
- 若G为最大值:H=60°×(B−RΔ+2)H=60°×(ΔB−R+2)
- 若B为最大值:H=60°×(R−GΔ+4)H=60°×(ΔR−G+4)
- 若H<0H<0,则H+=360°H+=360°。
注意:实际应用中(如OpenCV),H可能被缩放到0-179(8位存储),S和V为0-255。
3、HSV颜色特征的算法流程
- 图像预处理:
- 输入RGB图像,可能进行去噪或光照归一化。
- 颜色空间转换:
- 将RGB图像转换为HSV空间,得到H、S、V三个通道。
- 阈值分割(如需要分割):
- 定义目标颜色的阈值范围(例如检测红色):
- H:0-10°或350-360°(在OpenCV中对应0-5和170-179)。
- S:下限(如50)避免低饱和度区域。
- V:下限(如50)排除过暗区域。
- 生成二值掩膜:像素在阈值范围内为白色(255),否则黑色(0)。
- 定义目标颜色的阈值范围(例如检测红色):
- 后处理:
- 形态学操作:
- 腐蚀(Erosion)去除小噪声。
- 膨胀(Dilation)填充空洞。
- 常用开运算(先腐蚀后膨胀)和闭运算(先膨胀后腐蚀)。
- 连通区域分析:
- 使用轮廓检测(如OpenCV的findContours)定位目标区域。
- 过滤小面积区域以排除噪声。
- 形态学操作:
- 获取特征:
- 获取HSV三个通道的直方图特征, 并归一化到一维维度。
(3)K最近邻算法(K-Nearest Neighbors, KNN)
1. 基本思想
KNN是一种基于实例的监督学习算法,核心假设是“相似样本在特征空间中彼此靠近”。其分类或回归结果由最近的 KK 个邻居的投票(分类)或加权平均(回归)决定。
2. 算法流程
输入:
- 训练集 {(x1,y1),(x2,y2),...,(xN,yN)}{(x1,y1),(x2,y2),...,(xN,yN)},其中 xixi 为特征向量,yiyi 为标签。
- 测试样本 xtestxtest。
- 参数 KK(邻居数量)和距离度量方式(如欧氏距离)。
- 计算距离:
计算 xtestxtest 与所有训练样本 xixi 的距离:di=distance(xtest,xi)di=distance(xtest,xi)
- 选择邻居:
选取距离最小的前 KK 个样本,记其标签为 {y(1),y(2),...,y(K)}{y(1),y(2),...,y(K)}。
决策规则:
- 分类任务:多数投票法,即统计 KK 个邻居中各类别出现次数,选择最多者。
- 回归任务:取 KK 个邻居标签的均值。
3. 关键参数与优化
距离度量:
- 欧氏距离:d(x,y)=∑i=1n(xi−yi)2d(x,y)=∑i=1n(xi−yi)2(最常用)。
- 曼哈顿距离:d(x,y)=∑i=1n∣xi−yi∣d(x,y)=∑i=1n∣xi−yi∣。
- 余弦相似度:cosθ=x⋅y∥x∥∥y∥cosθ=∥x∥∥y∥x⋅y(适合高维稀疏数据)。
K值选择:
- 小K(如K=1):模型复杂,易过拟合(对噪声敏感)。
- 大K(如K=N):模型简单,易欠拟合(忽略局部特征)。
- 交叉验证:通过实验选择使验证集误差最小的K值。
数据预处理:
- 归一化:消除特征量纲差异(如Min-Max标准化)。
- 降维:对高维数据使用PCA等方法减少计算量。
(4)LBP和HSV特征与KNN的结合
流程示例:
1.LBP特征:使用LBP提取图像特征
2.HSV特征:使用HSV提取图像特征
3.特征融合:通过加权等方式,融合LBP和HSV特征,得到特征向量
4.将特征向量输入KNN分类器,计算与训练样本的距离。
5.根据最近邻的类别标签进行分类。
四、代码仿真效果呈现
(1)训练图库
(2)GUI效果展示
(3)部分关键代码
如要获取完整文件代码,可联系博主。
clear
clc
close all
%%
% 识别部分代码
%
%% 读取图片部分
% 读取图像
[filename,pathname,filter] = uigetfile({'*.jpg;*.jpeg;*.bmp;*.gif;*.png'},'选择图片');
if filter == 0
return
end
str = fullfile(pathname,filename);
img_filename=str;
I=imread(str);
I_source=I;
% 显示
figure
imshow(I);
title('输入的原图');
%% 载入数据库
load mydatabase
% 获取图片数,database_pic
[database_pic,N]=size(mydatabase);
%% 提取图片特征
fprintf('正在计算图片的特征...\n');
% 获取颜色特征
[Hist] = getImage_colorHists(I);
SP=[-1 -1; -1 0; -1 1; 0 -1; -0 1; 1 -1; 1 0; 1 1];
% 获取尺寸
[size_M,size_N,size_C]=size(I);
% 转灰度图
if size_C>1
I=rgb2gray(I);
end
% 生成LBP特征
[T]=lbp(I,SP,0,'nh');
% 特征向量
Feature=[T Hist'];