MATLAB实现颜色及颜色亮度,形状的识别(超简单)

最近做项目有要求,要在STM32F1上面实现颜色及基础图像的识别,所以用MATLAB做了个demo程序。

第一个需求是颜色识别,我在网上看的大部分都要将RGB空间转换成HSV/HSI空间来进行颜色识别,但是这样在F1这种最高主频只有72Mhz的单片机上跑实在是太慢了,所以就想直接在RGB空间进行颜色识别,这样的话就要分辨出R,G,B三个颜色分量对基本颜色的影响,所以我就写一个统计不同亮度下的红色来统计R,G,B三个颜色分量的影响。

第一步,制作素材,我用Windows自带的图片编辑软件制作了一个红色的色卡,共有16个不同亮度的红色,如上所示。

第二步,统计各种亮度的RGB三个分量

MATLAB代码如下:

clc;
clear;
Path="C:\Users\罗旭\Desktop\Color\mystepred.png";%图片路径
Source_img=imread(Path);%获取图片信息
[r,lie]=size(Source_img(:,:,2));%获取行列信息
read_l=20;%因为是自己制作的色卡,所以要选定某一行来读取信息,方便以后读取其它颜色的色卡
x=1:lie;
R_value=Source_img(read_l,:,1);%读取那一行的R分量
G_value=Source_img(read_l,:,2);%读取那一行的G分量
B_value=Source_img(read_l,:,3);%读取那一行的B分量
Gray_img=zeros(1,lie);%亮度信息
    for j=1:lie        
        Gray_img(read_l,j)=round(Source_img(read_l,j,1)*0.3+Source_img(read_l,j,2)*0.6+Source_img(read_l,j,3)*0.1);
        %用于观察灰度值是否可以在一定程度上表现亮度值
    end
figure(1);
subplot(2,2,1);
plot(x,R_value,"r-.");
title("R颜色分量");
subplot(2,2,2);
plot(x,G_value,"g-.");
title("G颜色分量");
subplot(2,2,3);
plot(x,B_value,"b-.");
title("B颜色分量");
subplot(2,2,4);
plot(x,Gray_img,"k-.");
title("颜色灰度分量");

统计出来的信息结果如下:

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第1张图片

我们可以清楚的看到在红色中R的比重明显比其他两个颜色的分量大很多,但是不是都遵循这种规则呢,实际上并不是,只有R,G,B三种颜色是这样的,而如黄色,它是由红色和绿色想叠加而成的,此时的R和G的比重是几乎相同的,如下所示:

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第2张图片

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第3张图片

 任何一种非三原色的颜色都要看它是由哪两种原色组成,判断的时候就要根据这两个原色的比重来判断,并且我们也可以清楚的看到灰度在一定程度上是可以反应颜色的亮度的,至此,我们完成了粗略的颜色及亮度信息的收集。

第二个需求就是实现基本形状的识别,这个让我废了一番精神,因为要在单片机上跑,没有各种的库可以用,于是去网上搜索形状识别的原理,由什么边缘检测,什么霍夫变换什么的,没有系统的学习过,看不懂这些,于是就只能自己想办法,最后得到了这样的一个办法,核心demo代码如下:

%这里的MY_Bit_img是一个二值化后的图像

sum_l=sum(MY_Bit_img);%求出每一列的和
max_l=max(sum_l);%求出每一列的和中的最大值
sum_r=sum(MY_Bit_img,2);%求出每一行的和
max_r=max(sum_r);%求出每一行的和中的最大值
area=sum(sum_l); %求出图形面积,一个像素点就是单位面积1
gui_pre=min(max_l,max_r)/max(max_l,max_r);%规则率,用于分辨(正方形,圆形)和(长方形,椭圆)
yuan_pre=((3*max_l*max_l)/(4*area)+gui_pre)/2;%圆面积计算公式,并于规则率加权,越接近于1越吻合
zheng_pre=((max_l^2)/area+gui_pre)/2;%正方形面积计算公式,并于规则率加权,越接近于1越吻合
tuo_pre=((3*max_l*max_r)/(4*area)+gui_pre)/2;%椭圆面积计算公式,并于规则率加权,越接近于1越吻合
chang_pre=((max_l*max_r)/area+gui_pre)/2;%长方形面积计算公式,并于规则率加权,越接近于1越吻合

测试素材是:

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第4张图片

经过上文的红色识别后的图像是:

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第5张图片

 形状识别的信息是:

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第6张图片

 按照识别结果来看这是一个椭圆啊,我很是不解,应该是个圆啊,直道后来我看了两个量

 

 

列的最大值和行的最大值并不一样,果然是一个椭圆啊。

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第7张图片

 

 看来我制作的正方形并不标准,无奈。

再看长方形

MATLAB实现颜色及颜色亮度,形状的识别(超简单)_第8张图片

 

 结果还可以接受。

 当然,这个缺点也是显而易见的,就是一张图片里面只允许有一个图形,当然解决办法也很简单,原理就是在一幅复杂的图像里面设置一个小的矩形框,让这个小的矩形框来遍历整幅图像,但是这个小的矩形框的大小要取决与你要寻找的形状的外围的大小,这样就能识别多个图形。

至此形状识别也已经完成了,接下来的任务就是将这些MATLAB代码转换成C语言写到单片机里面了。

你可能感兴趣的:(MATLAB图像处理识别)