系列文章目录
第一篇文章:【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载)
第二篇文章:【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础
第三篇文章:【MATLAB源码】机器视觉与图像识别技术(2)续—图像分割算法
第四篇文章:【MATLAB源码】机器视觉与图像识别技术(3)—数字形态学处理以及图像特征点提取
模式识别与视觉计数
绪论
MATLAB作为一个强大的工具,在机器视觉领域中尤为重要,特别是在模式识别和视觉计数方面。其丰富的图像处理工具和算法使得这些任务变得更加高效和精准。
在模式识别方面,MATLAB利用其图像处理工具箱提供了一系列强大的功能来识别和分类图像中的目标。通过对图像进行预处理,如去噪和对比度增强,用户可以提高后续识别的准确性。常用的技术包括边缘检测和模板匹配,这些方法能够识别图像中的关键特征。MATLAB此外还支持通过机器学习模型(如支持向量机和卷积神经网络)来进一步提升模式识别的效果。利用这些模型,用户可以对复杂的视觉数据进行训练和优化,达到更高的识别准确率。本次文章主要讲三种模式识别的聚类分析。
在视觉计数方面,MATLAB不仅可以计算目标对象的数量,还能对目标的面积进行分析。通过图像分割技术,如阈值化和区域生长,MATLAB能够将目标从背景中分离出来。分割后,连通组件分析技术可以用于统计图像中对象的数量。同时,MATLAB可以计算每个目标的面积,通过这些数据,用户可以评估对象的大小和分布情况。这一切的基础再于我们首先掌握基本的计数函数,连通域的求法。
一、模式识别算法函数基础
(1)"linkage ":执行层次聚类,将成对距离转换为聚类树。生成聚类树,配合 dendrogram 使用以可视化聚类结果。 用法:Z = linkage(Y) 其中 Y 是由 pdist 计算得到的距离向量。
(2)"dendrogram ":用于绘制层次聚类的树状图(或者生成顶部只有p个节点的冰柱图),展示聚类过程中的层次关系。用法: dendrogram(Z) 其中 Z 是通过 linkage 函数生成的层次聚类树。常用于生物信息学、市场细分等领域的层次聚类分析。
(3)"pdist ":用于计算成对观测值之间的两两距离。
用法: D = pdist(X) 其中 X 是包含数据点的矩阵,D 是距离向量。
应用场景: 在聚类分析和多维缩放中,用于测量数据点之间的相似性或差异性。
(4)"fitcknn “和” knnclassify ": 用于训练 k-最近邻(KNN)分类模型。KNN 是一种基于实例的学习算法,通过比较输入样本与训练样本之间的距离来进行分类。注:fitcknn是新版本MATLAB对knnclassify的更改,两者之间的用法发生了改变。 其中fitcknn的用法为Mdl = fitcknn(X, Y) 其中 X 是训练数据,Y 是对应的分类标签。knnclassify它通过计算测试样本与训练样本之间的距离,并选择最近的 k 个邻居,根据多数投票原则决定分类结果, class = knnclassify(sample, training, group, k) 其中 sample 是待分类的数据,training 是训练数据,group 是训练数据的标签,k 是邻居数。查阅可知两种聚类适用于数据分布复杂且样本量较大的场景,尤其在多分类问题和非线性数据中表现优异。其广泛应用于图像识别、推荐系统以及模式识别等领域。。
(5)"classify " :是一种基于统计学的分类方法,通常用于线性判别分析和二次判别分析。它通过分析数据的分布,寻找最适合的分界线或超平面,从而实现分类。这种方法依赖于对数据分布的假设,适合数据分布较为规则的场景中使用分类。用法: label = classify(sample, training, group) 其中 sample 是待分类的数据,training 是训练数据,group 是训练数据的标签, 广泛用于需要预测或分类新样本的应用中。
(6)"kmeans ": 是一种k-均值聚类算法,通过迭代优化将数据集分为K个类别。它通过最小化簇内样本之间的距离来确定最优的聚类结果。尽管“kmeans”主要用于聚类,但在某些情况下也可以用于完成分类任务。用法: [idx, C] = kmeans(X, k) 其中 X 是数据矩阵,k 是聚类数,idx 是簇标签,C 是簇中心。查阅发现“kmeans”适用于无监督学习场景,特别是在需要对数据进行初步探索和分类时非常有效。其应用包括图像分割、市场细分和数据挖掘等领域。
二、视觉计数:面积与数量的分析
(1)"roipoly ":roipoly 函数用于在图像中选择一个多边形区域(记录截取的区域)。这种选择通常用于图像分割或感兴趣区域的标记。用户通过在图像上绘制一个多边形,roipoly 会返回一个逻辑矩阵,其中多边形内的区域为 true,其他区域为 false。应用:1.图像分割: 从图像中提取特定区域,如组织或物体。2.感兴趣区域选择: 手动选择感兴趣的区域进行进一步分析或处理。
(2)"imresize ":imresize 函数用于调整图像的尺寸,可以对图像进行放大或缩小。它支持多种插值方法,包括双线性插值和最近邻插值,以便在调整图像尺寸时保持图像质量。用法中B=imresize(A,m,method)method主要为"nearest"默认最近插值法,"bilinear"双线性插值,"bicubic"采用三次插值法。
(3)"bwlabel ":bwlabel 函数用于标记二值图像中的连通区域。它为每个连通区域分配一个唯一的标签,使得相同区域的像素具有相同的标签。用法:[L,num]=bwlabel(bw,n);返回一个与bw大小的L矩阵,n为4或8连通域,num返回的是连通区域的个数。应用:1.目标检测: 在二值图像中检测和标记各个目标或物体。2.区域分析: 分析和计算图像中各个连通区域的性质,如面积和形状。
(4)"imcrop ":imcrop 函数用于裁剪图像的指定区域。可以通过image显示坐标,来指定矩形区域裁剪出想要的图像,得到感兴趣的部分。用法:X=imcrop(RGB,rect);其中rect[X,Y,Width,Heigh]坐标表示,X和Y表示剪辑区域的左上角坐标,Width和Heigh分别表示剪辑的宽度和高度。应用:1.图像裁剪: 从图像中提取特定区域,用于进一步处理或分析。2.对象定位: 在图像中提取包含感兴趣对象的区域。
(5)"edge ":edge 函数用于检测图像中的边缘。它使用多种边缘检测算法(如Canny、Sobel、Prewitt等)来识别图像中的边缘信息,通常用于图像特征提取和分析。应用:1.图像特征提取: 识别图像中的边缘特征,用于后续的图像处理和分析。2.边缘检测: 在图像处理过程中进行边缘检测,常用于目标识别和轮廓提取。
(6)"bwselect ":bwselect 函数用于从二值图像中选择特定的区域或对象。可以通过鼠标点击选择图像中的一个或多个区域,bwselect 会返回包含所选区域的逻辑矩阵。应用:1.区域选择: 交互式地选择二值图像中的特定区域进行分析。2.目标提取: 从二值图像中提取感兴趣的对象或区域。
(7)"bwmorph ":bwmorph 函数用于提取二进制图像的轮廓特征,它可以用来处理二值图像中的结构特征,增强或减少图像中的形态特征。
三、应用示例分析
1、模式识别应用(分类)
本次示例将对上面的函数介绍中选取常用的三种分类方法给大家进行分析对比,分别是classify、fitcknn( knnclassify)和kmeans。这些方法在图像处理和机器视觉领域中广泛应用。本次样例采取的数据是上一篇文章特征提取的花生粒样本数据进行分类和聚类分析。根据上一篇所示,数据集包含花生粒的若干特征以及对应的分类标签(粒数)如下图所示。通过不同的分类和聚类算法,对样本数据进行分析,评估不同方法的性能和适用性。
示例代码如下:
clc
clear all
close all
A=xlsread('D:\z\花生特征提取数据.xlsx');
a=A(1:1:200,2:9);%训练样本 隔一行取样
b=A(1:3:200,2:9);%待测样本 隔二行取样
c=A(1:1:200,11);%分类标签 隔一行取样
X=A(1:200,2:11);%所有数据矩阵(训练样本+待测样本)
[class1,err]= classify(b,a,c);%线性分类
% k近邻法knnclassify(fitcknn)
k=1 ;%取k值大小
knn=fitcknn(a,c,'NumNeighbors',k,'NSMethod','exhaustive','Distance','cityblock');
class2= predict(knn, b);% k近邻法 分类
[class3,C] = kmeans(X,67);%K-means聚类 分20类
kk=zeros(67,3);% 初始化一个67x3的矩阵,用于保存特征数据
% class1, class2, class3 的长度都为 67,因为我们提取的数据类别就那么多粒数
for i = 1:67
kk(i, 1) = class1(i); % classify分类数据
kk(i, 2) = class2(i); % knnclassify(fitcknn)分类数据
kk(i, 3) = class3(i); % Kmeans分类数据
end
% 保存结果到 Excel 文件
xlswrite('D:\z\花生特征提取数据1.xlsx', kk);
结果显示:由于数据庞大,只截取的部分分类结果,其他的作为资源上传绑定数据了。
最后:三种聚类分析 比较与总结
a.) 原理:”classify”基于统计学,适用于已知数据分布的情况;“fitcknn”基于实例,适用于复杂分布的数据;“kmeans”基于聚类,适用于无监督学习。
b.) 使用场景:”classify”适用于样本量小且分布规律的数据;“fitcknn”适用于大样本量和多分类问题;“kmeans”适用于数据探索和聚类,能够有效地揭示数据的自然分布和聚集情况。
通过本次测验,我们分别使用了线性判别分析(classify)、K-最近邻分类(fitcknn)和 K-means 聚类算法对花生粒样本数据进行了分类和聚类分析。使用相同的样本数据进行分类,根据其原理分类的效果(对比实际花生粒数)可得到,线性判别分析(classify)、K-最近邻分类(fitcknn)的效果一致,classify分类得到的误差err=0.0647,效果较好。
2、视觉计数分析
本次测试采用典型例子鱼苗计数进行讲解,首先我们应该知道作用,鱼苗计数可以帮助养殖场主监测鱼苗的数量。通过定期的鱼苗计数,养殖场可以了解鱼苗的生长状况、存活率和可能存在的健康问题,这有助于养殖场制定合适的养殖计划。那么算法可以有很多,我拿个最简单的进行举例,后面将出一篇精度高的BP神经网络进行预测计数,本次主要讲一下,连通域和面积方法进行计数,前提得先有大量 拍摄数据,进行训练。
示例代码仅作参考,由于需要大量数据处理,方能使得结果更加贴近真实值:
clc
clear all
close all
L = imread('d:\z\309.jpg');
a=imcrop(L,[150 23 326 467]);
% 将图像转换为双精度类型
b = double(a);
% 增强红色通道,减少绿色和蓝色通道的影响
b = 2 * b(:,:,1) - b(:,:,2) - b(:,:,3);
% 归一化图像到[0, 1]范围
b = b - min(min(b));
b = b / max(max(b));
% 将归一化后的图像转换为8位无符号整数类型
b = uint8(255 * b);
h=rgb2gray(a);
c = im2bw(b,120/255);
% 填充二值图像中的孔洞
c1 = imfill(c, 'holes');
C = strel('disk',6);
% 对填充后的图像进行形态学开操作
B2 = imopen(c1, C);
bw2=bwperim(B2,4); %边缘像素提取
% 对二值图像进行连通区域标记
[L, NUM] = bwlabel(B2,4);
q = bwarea(B2);
area1 = 2639;%单条鱼的面积
n = q / area1;%总的鱼的面积
% 输出鲤鱼苗的数量并四舍五入到整数类型
if rem(n, 1) >=5
n = uint8(n) + 1;
else
n = uint8(n);
end
figure(1);
imshow(a);
title(['鱼的条数: ', num2str(n)]);
figure(2);
imshow(bw2);
title(['鱼的条数: ', num2str(n)]);
结果显示
结果利用面积法来计算鱼苗的数量时,在处理数据时候,先计算得一只鱼苗的面积,再根据计算所有连通域的面积,这样就可以算一个整除数,根据结果进行取整,经过数据处理,误差可接近为0.0529,由此可见该方法存在较大的误差。利用计算连通域法所得的结果也可能存在误差,当多条鱼粘合时候,连通域方法就不行。所以这类计数,需要大量的数据进行训练,面积计数才会更精确。
总结
最后,本次的学习讲到这里,根据上面讲的模式识别分类应用,和视觉计数来说,存在有很大不足,只适合基础学习,想要精通,需要更强的算法,我们先从基础意识出发,后面我讲一一给大家介绍高精度的算法计数和识别,先把意识扎牢。还有大家不要忘记点赞关注喔,哈哈哈哈真的非常感谢!下一篇我讲介绍一下视觉标定和BP神经网络的概念。(记得关注点赞哈哈哈哈哈!)