基于Matlab的图像识别从入门到实践:手把手教你做第一个项目
你有没有想过,手机里的拍照翻译、超市的自助结账机,背后其实都藏着图像识别的影子?而今天,我们要用Matlab这个强大的工具,从零开始搭建一个属于自己的图像识别小项目——不用复杂的Python框架,不用啃厚厚的机器学习理论,只要跟着步骤走,你也能做出让人眼前一亮的效果!
为什么选Matlab做图像识别?
首先得说,Matlab绝对是新手入门图像识别的“捷径”。它自带的图像处理工具箱(Image Processing Toolbox) 把所有底层算法都封装成了简单的函数——比如边缘检测、滤波、特征提取,你不用自己写几百行代码,一行函数就能搞定。而且Matlab的可视化功能超棒,每一步处理的结果都能实时看到,调试起来特别方便。我第一次用Matlab做图像识别的时候,简直被它的便捷性惊到了——原来不用懂太多数学,也能玩转图像识别!
第一步:环境准备,别让工具拖后腿
要开始之前,你得先有Matlab(正版或者试用版都可以)。安装的时候记得勾选图像处理工具箱和机器学习工具箱(后面进阶会用到)。怎么确认工具箱有没有装?打开Matlab,在命令行输入ver,看看列表里有没有这两个工具箱就行。如果没装,去Matlab官网下载补充安装包就行啦。
对了,这里有个小坑——别用太老版本的Matlab!比如2018年之前的版本,有些函数可能不一样,推荐用2020版及以上,兼容性更好。
第二步:图像预处理,识别的“地基”要打牢
你以为图像识别就是直接喂图给算法?No no no!预处理这一步要是偷懒,后面的结果能让你哭出来——比如图片太亮太暗,或者有很多噪声,算法根本抓不到重点!咱们先从最基础的预处理操作开始:
1. 读入和显示图像
这是第一步,没什么难度,但得注意路径问题。比如你有一张叫“apple.jpg”的图片,把它放在Matlab的当前工作目录(就是左侧“当前文件夹”显示的路径),然后输入:
img = imread('apple.jpg'); % 读入图像
imshow(img); % 显示图像
title('原始图像');
如果图片不在当前目录,就用绝对路径,比如imread('C:\Users\YourName\Pictures\apple.jpg')。
2. 灰度化:简化计算量
彩色图像有RGB三个通道,计算起来慢。灰度化就是把它变成黑白图,只保留亮度信息。一行代码搞定:
gray_img = rgb2gray(img); % 转灰度图
imshow(gray_img);
title('灰度图像');
为什么要灰度化?比如识别苹果的时候,颜色可能不是唯一标准,但形状和边缘更重要——灰度图足够了,还能省一半以上的计算时间!
3. 滤波:去掉噪声干扰
图片里经常有小点点(比如拍照时的颗粒感),这些噪声会影响后续识别。高斯滤波是最常用的去噪方法:
filtered_img = imgaussfilt(gray_img, 1); % 高斯滤波,第二个参数是sigma值,越大越模糊
imshow(filtered_img);
title('滤波后图像');
我之前做硬币识别的时候,一开始没滤波,结果硬币边缘全是毛刺,识别出来的圆形歪歪扭扭的——加了高斯滤波后,瞬间光滑了好多!
4. 二值化:让目标更突出
二值化就是把图像变成只有黑和白两种颜色,让目标和背景分开。比如我们想提取苹果的轮廓,就可以用阈值分割:
level = graythresh(filtered_img); % 自动计算阈值
binary_img = imbinarize(filtered_img, level); % 二值化
imshow(binary_img);
title('二值化图像');
如果自动阈值效果不好,也可以手动调,比如imbinarize(filtered_img, 0.5)——0.5是阈值,大于它的像素变白,小于的变黑。
第三步:特征提取,告诉算法“看哪里”
预处理完了,接下来就是找特征——比如苹果是红色的、圆形的,这些都是特征。Matlab里有很多现成的函数帮你提取特征:
1. 边缘检测:抓轮廓
边缘是物体最明显的特征之一。Canny边缘检测算法是业界公认的好用:
edge_img = edge(filtered_img, 'Canny'); % Canny边缘检测
imshow(edge_img);
title('边缘检测结果');
你会看到苹果的轮廓清晰地显示出来,这就是算法要找的“重点”!
2. 形状特征:比如圆形度
怎么判断一个物体是不是圆形?可以计算它的圆形度(Circularity)。公式是:圆形度 = 4π×面积 / 周长²。圆形的圆形度接近1,其他形状会小一些。Matlab里可以用regionprops函数提取这些特征:
% 先找连通区域
stats = regionprops(binary_img, 'Area', 'Perimeter');
% 计算圆形度
for i = 1:length(stats)
area = stats(i).Area;
perimeter = stats(i).Perimeter;
if perimeter == 0 % 避免除以0
circularity = 0;
else
circularity = 4*pi*area/(perimeter^2);
end
fprintf('第%d个区域的圆形度:%.2f\n', i, circularity);
end
比如硬币的圆形度大概在0.9以上,而方形物体可能只有0.6左右——这样就能区分开了!
3. 颜色特征:比如RGB均值
如果要区分苹果和橙子,颜色特征就很有用。Matlab里可以直接提取每个通道的均值:
% 提取RGB通道
red_channel = img(:,:,1);
green_channel = img(:,:,2);
blue_channel = img(:,:,3);
% 计算均值
red_mean = mean(red_channel(:));
green_mean = mean(green_channel(:));
blue_mean = mean(blue_channel(:));
fprintf('红色通道均值:%.2f\n绿色通道均值:%.2f\n蓝色通道均值:%.2f\n', red_mean, green_mean, blue_mean);
苹果的红色通道均值肯定比橙子高,这样就能快速区分啦!
第四步:第一个识别案例——找图片里的圆形物体
说了这么多,咱们来做个实际的小项目:识别图片里的圆形物体(比如硬币)。步骤如下:
-
读入并预处理图像:
img = imread('coins.jpg'); gray_img = rgb2gray(img); filtered_img = imgaussfilt(gray_img, 1.5); binary_img = imbinarize(filtered_img, graythresh(filtered_img)); % 反转二值图像(因为硬币是亮的,背景是暗的) binary_img = ~binary_img; -
提取连通区域并计算圆形度:
stats = regionprops(binary_img, 'Area', 'Perimeter', 'Centroid'); % 筛选圆形度大于0.8的区域 circular_objects = []; for i = 1:length(stats) area = stats(i).Area; perimeter = stats(i).Perimeter; if perimeter ==0 continue; end circularity = 4*pi*area/(perimeter^2); if circularity >0.8 circular_objects = [circular_objects, i]; end end -
标记识别结果:
figure; imshow(img); hold on; for i = circular_objects centroid = stats(i).Centroid; plot(centroid(1), centroid(2), 'r*', 'MarkerSize',15); text(centroid(1)+10, centroid(2), sprintf('圆形度:%.2f', 4*pi*stats(i).Area/(stats(i).Perimeter^2)), 'Color','red'); end hold off; title('识别结果');
运行完这段代码,你会看到图片里的圆形硬币被红色星号标记出来,旁边还显示圆形度——是不是超有成就感!
第五步:进阶小技巧——用机器学习做分类
如果要识别更多类型的物体,比如区分猫、狗、汽车,光靠手工提取特征就不够了。Matlab的机器学习工具箱(Statistics and Machine Learning Toolbox) 可以帮你快速搭建分类模型,比如SVM(支持向量机)或者KNN(K近邻)。
举个例子,用KNN分类苹果和橙子:
- 准备数据集:收集一些苹果和橙子的图片,提取它们的颜色特征(RGB均值)作为特征向量,标签1代表苹果,2代表橙子。
- 训练KNN模型:
% 假设features是特征矩阵(每行一个样本,3列是RGB均值),labels是标签 knn_model = fitcknn(features, labels, 'NumNeighbors',3); - 预测新样本:
% 提取新图片的颜色特征 new_img = imread('new_fruit.jpg'); new_red = mean(new_img(:,:,1)); new_green = mean(new_img(:,:,2)); new_blue = mean(new_img(:,:,3)); new_feature = [new_red, new_green, new_blue]; % 预测 prediction = predict(knn_model, new_feature); if prediction ==1 fprintf('这是苹果!\n'); else fprintf('这是橙子!\n'); end
是不是很简单?Matlab把所有复杂的算法都封装好了,你只需要专注于数据和特征就行。
总结:Matlab图像识别的优势和后续学习方向
用Matlab做图像识别,最大的优势就是快——不用自己写底层算法,直接调用函数就能完成大部分工作,特别适合新手入门。而且Matlab的文档超级详细,每个函数都有示例代码,遇到问题查文档就够了。
如果你想深入学习,可以试试这些方向:
- 深度学习:Matlab的深度学习工具箱(Deep Learning Toolbox)支持CNN(卷积神经网络),可以做更复杂的识别任务(比如人脸识别)。
- 实时图像识别:用Matlab的摄像头接口(
webcam函数),可以实时处理摄像头画面。 - 优化特征提取:比如用HOG特征(方向梯度直方图)做行人检测,效果比手工特征更好。
最后给大家一个小建议:多练手! 找一些有趣的数据集(比如Kaggle上的水果数据集),自己动手做几个项目——比看十篇教程都有用。你会发现,图像识别并没有想象中那么难,Matlab就是你最好的帮手!
好啦,今天的分享就到这里。希望这篇文章能帮你开启Matlab图像识别的大门,下次见!
浙公网安备 33010602011771号