基于matlab的颜⾊识别与提取_机器视觉综合实训有得
⼀、课程任务设计要求抹眼霜的正确方法
(1)在编写摄像头采集图像程序,能够对图像进⾏采集、保存处理;
(2)对采集图像进⾏预处理,RGB 到 YCBCR 的⾊彩空间转换,⽤各个通道的阈值对图像进⾏⼆值化;形态学处理:腐蚀、膨胀、孔洞填充,连通区域提取,识别出指定的颜⾊区域;
(3)能够识别到多个颜⾊并进⾏分割;
(4)设计 GUI 界⾯,能够通过界⾯进⾏图像采集、识别、输出信息。
⼆、实现
1.对图像的采集与保存处理
obj=videoinput('winvideo',2,'RGB24_800x600');%设备采集图像输⼊,适配器名称,图像格式
src =getlectedsource(obj);
src.ColorEnable ='off';
frame =getsnapshot(obj);
imshow(frame);%显⽰图⽚frame
mkdir('D:\image\1');%创建保存的路径
imwrite(frame,'D:\image\1\snap6.jpg','jpg');
(1)videoinput函数
⽤于获取采集到的视频
吸血鬼日记第一季下载
OBJ = videoinput(adaptorname,deviceID,format)
adaptorname:适配器名称
deviceID:设备ID
format:视频格式
命令⾏输⼊imaqhwinfo可获取相机的适配器名称,输⼊
win_info = imaqhwinfo(‘winvideo’) %适配器名称随上步查询结果变动
可查询设备ID(通常如果是笔记本的话会出现两个ID,通常相机的设备ID是2)输⼊win_info.DeviceInfo.SupportedFormats可查询相机⽀持的编码格式
(2)getsnapshot函数英文 翻译
⽤于在视频中捕捉得到⼀个图⽚
on the town
(3)imshow函数
⽤于显⽰图⽚,通常与figure搭配使⽤
例:figure,imshow(I)%创建⼀个新的窗⼝显⽰图⽚
(4)mkdir函数
⽤于创建⼀个新的⽂件夹,绝对路径和相对路径都可
(5)imwrite函数
⽤于保存图⽚
imwrite(a,filename,format)
a:图⽚名称
filename:保存路径unwitting
format:保存的格式
2.对采集图像进⾏预处理,RGB 到 YCBCR 的⾊彩空间转换,⽤各个通道的阈值对图像进⾏⼆值化
flag =imread('D:\image\1\snap6.jpg');
YCBCR =rgb2ycbcr(flag);%转换到YCBCR空间
%⽤各个通道的阈值对其进⾏⼆值化处理
Y_MIN =0; Y_MAX =256;
Cb_MIN =100; Cb_MAX =127;
expo是什么意思Cr_MIN =138; Cr_MAX =170;
threshold=roicolor(YCBCR(:,:,1),Y_MIN,Y_MAX)&roicolor(YCBCR(:,:,2),Cb_MIN,Cb_MAX)&roicolor(YCBCR(:,:,3),Cr_MIN,Cr_MAX);
(1)imread函数
⽤于读⼊将被处理的图⽚
obj=imread(filename.fmt);
(2)rgb2ycbcr函数
2其实就是to,该函数⽤于将RGB图⽚转换为YCBCR图⽚
那为什么要转换为YCbCr图⽚呢?
⽤于压缩图⽚!因为⼈的眼睛对YCbCr⾊彩空间编码的视频中的Y分量更加敏感,⽽Cb和Cr的微⼩变化不会引起视觉的不同。因此我们可以通过对Cb和Cr分⼦进⾏采样来减⼩图像的数据量,使得图像对于储存需求和传输带宽的要求⼤⼤降低,从⽽达到在完成图像压缩的同时也保证视觉上⼏乎没有损失。
其中,Y(Luminance):明亮度和浓度
Cb(Chrominance-Blue):颜⾊中的蓝⾊浓度偏移量
Cr(Chrominance-Red):颜⾊中的红⾊浓度偏移量
(3)roicolor函数
根据各个通道的阈值进⾏⼆值化
3.形态学处理:腐蚀、膨胀、孔洞填充,连通区域提取
%进⾏形态学处理:腐蚀、膨胀、孔洞填充
erodeElement =strel('square',3);
dilateElement=strel('square',8);
threshold =imerode(threshold,erodeElement);%腐蚀
threshold=imdilate(threshold, dilateElement);%膨胀
threshold=imfill(threshold,'holes');%填充
%连通区域的选取
gray_img =rgb2gray(flag);
T =graythresh(gray_img);%得到⼀个阈值神探夏洛克第四季
bw_img =im2bw(gray_img, T);%转化为⼆值图像
img_reg =regionprops(bw_img,'area','boundingbox');
areas =[img_reg.Area];%各个区域的像素总数
rects =cat(1, img_reg.BoundingBox);%各部分的最⼩矩形
figure(1),
imshow(bw_img);
people
for i =1:size(rects,1)%获取⾏数
rectangle('position',rects(i,:),'EdgeColor','r');
end
(1)regionprops函数
即⽤来度量图像区域属性的函数,其属性包括:
Area,EquivDiameter,MajorAxisLength,BoundingBox,EulerNumber,MinorAxisLength,Centroid,Extent,Orientation,ConvexArea,Extrema,PixelIdxList,ConvexHull,FilledArea,PixelList,ConvexImage,FilledImage,Solidity,Eccentricity ,Image
img_reg = regionprops(bw_img, ‘area’, ‘boundingbox’);%只计算area和boundingbox两个属性
img_reg = regionprops(bw_img, ‘basic’);%计算area,boundingbox,centroid三个属性
img_reg = regionprops(bw_img, ‘all’);%计算全部属性
(2)cat函数
>> A =[12;34];
>> B =[56;78];
>> A
A =
12
34
>> B
B =
56
78
>>cat(1, A, B)%按列连接(列数相同)
ans =
12
34
56
78
>>cat(2, A, B)%按⾏连接(⾏数相同)
ans =
1256
3478
>>cat(3, A, B)%合成效果如下图
ans(:,:,1)=
12
34
ans(:,:,2)=
56
78
(3)figure函数
figure; %创建⼀个新的窗⼝
figure(2);%窗⼝的命名为2,且窗⼝的命名不可以是0
figure(‘name’,‘show’);%窗⼝命名为show
(4)size函数
⽤于获取矩阵的⾏数和列数
<1>s=size(A); %返回⼀个⾏向量,该⾏向量的第⼀个元素是矩阵的⾏数,第⼆个元素是矩阵的列数
<2>[r,c]=size(A); %size函数将矩阵的⾏数返回到第⼀个输出变量r,将矩阵的列数返回到第⼆个输出变量c
<3>size(A,n); %返回矩阵的⾏数或列数
例:raw=size(A,1); %返回的时矩阵A的⾏数
japanegirlswet 16col=size(A,2); %返回的时矩阵A的列数
deprecated(4)rectangle函数
⽤于创建⼆维矩阵对象
rectangle(‘Position’,[x y w h]) %从点(x,y)开始绘制⼀个宽w⾼h的矩形
rectangle(‘Position’,[x y w h],‘Curvature’,[a,b]) %x⽅向上的曲率为a,y⽅向上的曲率为b rectangle(‘position’,…
[1,1,5,5],‘curvature’[1,1],‘edgecolor’,‘r’,‘facecolor’,‘g’);