简易实现机场货框贴条位置的提取(Matlab)

任务:给定一张图片,图片中为某机场货框(没做过飞机不知道怎么描述)两侧贴有红绿蓝颜色的贴条,写程序实现对两侧贴条位置的读取。

(本任务为计算机视觉老师给的,用最简易的方法写了一下,没用什么高深的算法,写的很菜...)

原图:


步骤:

1.首先是对图像进行读取,并进行超像素分割。

i=47;
img_dir = dir('./条形码/*.jpg');
name=strcat('./条形码/',img_dir(i).name);
I=imread(name);
% mode=fspecial('gaussian', 2, 0.1);
% I=imfilter(I,mode,'replicate');  
[label,num]=superpixels(I,1950);

2.统计每个超像素点的R平均RGB和坐标,代码和另一个文章(求显著性)的方法相同。

3.分别对超像素分割后的图像进行R/G/B通道下的过滤,即只保留R/G/B颜色的超像素点,图中红绿蓝条颜色的范围可由Photoshop的吸管工具获取,然后根据获取的大致范围划出三个通道的取色范围。

R通道:

thre=78;
%R过滤  R的地方为红 其他地方为黑
im_r=zeros(m,n,3);
for i=1:num
    if supmean(i,3)>=255-thre&&supmean(i,4)<=2*thre&&supmean(i,5)<=2*thre %分别对应红绿蓝三个颜色的范围
        supmean_r(i,3)=255;
    else
        supmean_r(i,3)=0;
    end
    supmean_r(i,4)=0;
    supmean_r(i,5)=0;
end
for i=1:m
    for j=1:n
        im_r(i,j,1)=uint8(supmean_r(label(i,j),3));
        im_r(i,j,2)=uint8(supmean_r(label(i,j),4));
        im_r(i,j,3)=uint8(supmean_r(label(i,j),5));
    end
end        
im_r=uint8(cat(3,im_r(:,:,1),im_r(:,:,2),im_r(:,:,3)));
imshow(im_r);
figure,

4. 对于RGB三个通道分别筛选的结果,进行三层循环比较:三个不同的超像素点的位置是否存在线性关系,并且距离是否满足给定的条件,如果都满足,并且这三个点均为着色,则在新的图片中对应的坐标分别着色(新图片默认值都是[0 0 0]).



本代码中,所有数值的范围很重要,所以我做的效果也很差,有些地方也没处理好。

完整代码:

%可调节的参数:
%1.期望超像素个数
%2.RGB过滤时颜色范围
%3.判断线性关系阈值line_thre
%4.线段长度范围
i=47;%读取这个文件夹中的第47个图片
img_dir = dir('./条形码/*.jpg');
name=strcat('./条形码/',img_dir(i).name);
I=imread(name);
% mode=fspecial('gaussian', 2, 0.1);
% I=imfilter(I,mode,'replicate');  
[label,num]=superpixels(I,1950);
[m n]=size(label);
supmean=uint64(zeros(num,5));
labelnum=zeros(num);
for i=1:m
    for j=1:n
        supmean(label(i,j),1)=supmean(label(i,j),1)+i;
        supmean(label(i,j),2)=supmean(label(i,j),2)+j;
        supmean(label(i,j),3)=(supmean(label(i,j),3)+uint64(I(i,j,1)));
        supmean(label(i,j),4)=(supmean(label(i,j),4)+uint64(I(i,j,2)));
        supmean(label(i,j),5)=(supmean(label(i,j),5)+uint64(I(i,j,3)));
        labelnum(label(i,j))=labelnum(label(i,j))+1;
    end
end
for i=1:num
    supmean(i,1)=uint16(supmean(i,1)./labelnum(i));
    supmean(i,2)=uint16(supmean(i,2)./labelnum(i));
    supmean(i,3)=uint16(supmean(i,3)./labelnum(i));
    supmean(i,4)=uint16(supmean(i,4)./labelnum(i));
    supmean(i,5)=uint16(supmean(i,5)./labelnum(i));
end
supmean_r=supmean;
supmean_g=supmean;
supmean_b=supmean;
IM=zeros(m,n,3);
for i=1:m
    for j=1:n
        IM(i,j,1)=uint8(supmean(label(i,j),3));
        IM(i,j,2)=uint8(supmean(label(i,j),4));
        IM(i,j,3)=uint8(supmean(label(i,j),5));
    end
end
supim=uint8(cat(3,IM(:,:,1),IM(:,:,2),IM(:,:,3)));
imshow(supim);
figure,

%根据ps对图中的条形进行取色 
%红色rgb通道 220-255 0-100 0-100
%绿色rgb通道 70-120 220-255 100-200
%蓝色rgb通道 60-150 160-255 220-255 
%ps真好用  嘻嘻嘻
%mmp 大部分时间都在调整阈值参数上了

thre=78;
%R过滤  R的地方为红 其他地方为黑
im_r=zeros(m,n,3);
for i=1:num
    if supmean(i,3)>=255-thre&&supmean(i,4)<=2*thre&&supmean(i,5)<=2*thre
        supmean_r(i,3)=255;
    else
        supmean_r(i,3)=0;
    end
    supmean_r(i,4)=0;
    supmean_r(i,5)=0;
end
for i=1:m
    for j=1:n
        im_r(i,j,1)=uint8(supmean_r(label(i,j),3));
        im_r(i,j,2)=uint8(supmean_r(label(i,j),4));
        im_r(i,j,3)=uint8(supmean_r(label(i,j),5));
    end
end        
im_r=uint8(cat(3,im_r(:,:,1),im_r(:,:,2),im_r(:,:,3)));
imshow(im_r);
figure,
%G过滤
im_g=zeros(m,n,3);
for i=1:num
    if supmean(i,4)>=255-thre&&supmean(i,5)<=120+thre&&supmean(i,3)<=100+thre&&supmean(i,3)>=100-thre&&supmean(i,5)>=200-thre
        supmean_g(i,4)=255;
    else
        supmean_g(i,4)=0;
    end
    supmean_g(i,3)=0;
    supmean_g(i,5)=0;
end
for i=1:m
    for j=1:n
        im_g(i,j,1)=uint8(supmean_g(label(i,j),3));
        im_g(i,j,2)=uint8(supmean_g(label(i,j),4));
        im_g(i,j,3)=uint8(supmean_g(label(i,j),5));
    end
end        
im_g=uint8(cat(3,im_g(:,:,1),im_g(:,:,2),im_g(:,:,3)));
imshow(im_g);
figure,
%B过滤
im_b=zeros(m,n,3);
for i=1:num
    if supmean(i,5)>=255-thre&&supmean(i,4)>=255-2*thre&&supmean(i,3)<=100+thre&&supmean(i,3)>=100-thre
        supmean_b(i,5)=255;
    else
        supmean_b(i,5)=0;
    end
    supmean_b(i,4)=0;
    supmean_b(i,3)=0;
end
for i=1:m
    for j=1:n
        im_b(i,j,1)=uint8(supmean_b(label(i,j),3));
        im_b(i,j,2)=uint8(supmean_b(label(i,j),4));
        im_b(i,j,3)=uint8(supmean_b(label(i,j),5));
    end
end        
im_b=uint8(cat(3,im_b(:,:,1),im_b(:,:,2),im_b(:,:,3)));
imshow(im_b);
figure,


%比较三次过滤所得的的超像素的RGB是否成线性关系 若存在线性关系 则保留
%判断三点是否共线
%a+b=c+theta
%a b c 三条边的长度  theta为及其小的数字
%判断条件 :  if a+b>=c && a+b<=c+thre 
% c:蓝红距离 a:红绿距离 c:蓝绿距离
supmean_all=supmean; %初始化全黑
for i=1:num
    for j=3:5
    supmean_all(i,j)=0;
    end
end
im_all=zeros(m,n,3);
line_thre=40;%线性阈值
min_thre=0;%红绿/绿蓝距离最小阈值
max_thre=100;%红绿/绿蓝距离最大阈值
a=0;
b=0;
c=0;
for r=1:num
    if supmean_r(r,3)==255 %遍历r过滤的所有红色超像素
        if supmean_r(r,2)<=n*0.2 || supmean_r(r,2)>=n*0.8
            for g=1:num
                if supmean_g(g,4)==255 &&g~=r %遍历g过滤的所有绿色超像素
                    if supmean_g(g,2)<=n*0.2 || supmean_g(g,2)>=n*0.8
                        a=sqrt(double((supmean_r(r,1)-supmean_g(g,1))^2+(supmean_r(r,2)-supmean_g(g,2))^2));
                        if a>min_thre && a<=max_thre %如果红绿长度符合给定阈值
                            for bl=1:num
                                if supmean_b(bl,5)==255  &&bl~=r && bl~=g  %遍历bl过滤的所有蓝色超像素
                                    if supmean_b(bl,2)<=n*0.2 || supmean_b(bl,2)>=n*0.8
                                        b=sqrt(double((supmean_b(bl,1)-supmean_g(g,1))^2+(supmean_b(bl,2)-supmean_g(g,2))^2));
                                        c=sqrt(double((supmean_r(r,1)-supmean_b(bl,1))^2+(supmean_r(r,2)-supmean_b(bl,2))^2));
                                        if b>min_thre &&b<=max_thre && c>min_thre &&b<=2*max_thre
                                            if a+b>=c &&a+b<=c+line_thre %如果abc存在线性关系
                                                if  supmean_all(r,3)==0 && supmean_all(r,4)==0&&supmean_all(r,5)==0 &&supmean_all(g,3)==0 && supmean_all(g,4)==0&&supmean_all(g,5)==0&&supmean_all(bl,3)==0 && supmean_all(bl,4)==0&&supmean_all(bl,5)==0
                                                    %如果这三个超像素点均未着色,则分别着色
                                                    supmean_all(r,3)=255;
                                                    supmean_all(g,4)=255;
                                                    supmean_all(bl,5)=255;
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end
end
for i=1:m
    for j=1:n
        im_all(i,j,1)=uint8(supmean_all(label(i,j),3));
        im_all(i,j,2)=uint8(supmean_all(label(i,j),4));
        im_all(i,j,3)=uint8(supmean_all(label(i,j),5));
    end
end        
im_all=uint8(cat(3,im_all(:,:,1),im_all(:,:,2),im_all(:,:,3)));
imshow(im_all);               

最后的结果:


大约就这么凑活着吧,除了冗长的代码也没啥太大的参考价值,溜了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值