Matlab⾃动获取图⽚中已经框好的所有矩形的左上⾓坐标和宽
⾼
整体效果如下:
坐标信息和矩形宽⾼放在txt⽂件中:
整体思路如下:
1:因为图中的矩形框是⽤不同颜⾊框出来的,我们可以把每⼀个颜⾊的所有矩形框提取出来,变成⼆值图像(只有⿊⾊和⽩ ⾊)。求出此颜⾊的每个矩形的信息。
2:如果按颜⾊分出来的矩形框只有⼀个,就可以⽤[x,y]=find(BW==1); (BW:为提出来的⼆值图像 find(BW==1):寻找⼆值 图像中⽩⾊的区域(1为⽩⾊,0为⿊⾊))把x,y的坐标都求出来,此时min(x),min(y)Matlab可以⾃动求出。
3:如果按颜⾊分出来的矩形有多个,此时就不知道每个矩形的最⼩最⼤的xy值了。
⽤ L = bwlabel(colorb); (bwlabel:标识所有⿊⾊背景下⽩⾊连通区域 (连通区域:封闭的区域) colorb:⼆值图⽚)
num = max(max(L)); (计算有多少个连通区域)
这两句语句,把此时图⽚的中的每个矩形变成⼀个⼀个的单独矩形了,此时⽤循环⽤此语句
[x,y] = find(L == i); (i代表第⼏个连通区)
英文转换4:建⽴⼀个矩阵存放这些信息,在把这些信息放到txt⽂件中(如果不建⽴矩阵,存放到txt⽂件中的内容将都会在第⼀⾏第⼀ 列中
分步讲解:
主函数:
rgb=imread('61.jpg'); % 读取图⽚
figure,imshow(rgb); %显⽰图⽚ figure:弹出窗⼝
r = rgb(:,:,1); %提取彩⾊图像的红⾊分量。
g = rgb(:,:,2); %提取彩⾊图像的绿⾊分量。
b = rgb(:,:,3); %提取彩⾊图像的蓝⾊分量。
2:
符合红⾊,蓝⾊,绿⾊,橘红⾊和紫⾊的rgb值挑选出来赋给变量red,blue,green,orange,purple 3
red=r>=175&g<36&b<36;
blue=r<=60&g<135&b>70;
green=(20>r)&(g>80)&(g<100)&(b>20)&(b<=35);
orange=(r>200)&(g<118)&(g>36)&b<50;
purple=(175>r)&(r>97)&g<35&(b>52)&(b<=67);
3:
把每⼀个颜⾊放到⼀个数组中,为了⽅便循环调⽤shibie()函数(后⾯讲解)减少代码的冗余。
a{1}=red; 此时取到的就是⼆值图像
a{2}=blue;
a{3}=green;
a{4}=orange;
a{5}=purple;
4:
循环调⽤shibe()函数
yz=300; %作为bwareaopen函数的参数
for i=1:5
if i==1
str='red';
elif i==2
str='blue';
老友记剧本
elif i==3
str='green';
elif i==4网课的好处和坏处
str='orange';
elif i==5
str='purple';
end
shibie(a{i},yz,str)
end
⼦函数:
1:
function [ ] = shibie(color,yz,str)
colorb = bwareaopen(color,yz); %删除⼆值图像BW中⾯积⼩于P对
象 去除杂点!yz:300(主函数传进的参数)就是把⼆值图像color中像素⽐
300⼩的都删除了
如果⼀个颜⾊中有好多矩形,但是这些矩形有重叠的⽤颜⾊把他们分开后,有的矩形显⽰不完整,可能会出现中间有间断的情况,此时进⾏连通区域划分时候会不准,所以在此之前要对图中的矩形进⾏扩充线条(膨胀)
connect_size = 8;
= strel('disk',connect_size);
colorb = imdilate(colorb,);
figure;imshow(colorb);
title('扩充线条');
3:
使图⽚进⾏连通区域的划分
L = bwlabel(colorb);
num = max(max(L));
4:
创建⼀个cell数组(cell数组可以装数字和字符 都可以的)
B=cell(num,5);
flange5:
循环计每个颜⾊中连通区域中矩形的坐标
for i = 1:num
[x,y] = find(L == i);
minx=min(y);
maxx=max(y);
miny=min(x);
maxy=max(x);
Width=maxx-minx;
Hight=maxy-miny;
B{i,1}=str;
B{i,2}=minx;
B{i,3}=miny;
B{i,4}=Width;
B{i,5}=Hight;
end
6:
把每个连通区域中矩形坐标信息放在txt⽂件中
fid=fopen('','a');
[m,n]=size(B);
兄弟英语for h=1:1:m
fprintf(fid,'%s%d:\t ',B{h,1},h);
for j=2:1:n
if j==n
fprintf(fid,'%g\r\n',B{h,j});
el
fprintf(fid,'%g\t',B{h,j});
end
end
end
整体代码:
主函数
rgb=imread('61.jpg'); % 读取图⽚
figure,imshow(rgb); %显⽰图⽚ figure:弹出窗⼝
r = rgb(:,:,1); %提取彩⾊图像的红⾊分量。
g = rgb(:,:,2); %提取彩⾊图像的绿⾊分量。
b = rgb(:,:,3); %提取彩⾊图像的蓝⾊分量。
六级论坛
red=r>=175&g<36&b<36;
blue=r<=60&g<135&b>70;
green=(20>r)&(g>80)&(g<100)&(b>20)&(b<=35);
orange=(r>200)&(g<118)&(g>36)&b<50;
purple=(175>r)&(r>97)&g<35&(b>52)&(b<=67);
a{1}=red;
a{2}=blue;
a{3}=green;
a{4}=orange;
a{5}=purple;
后期制作英文figure;
morpheyz=300; %作为bwareaopen函数的参数
for i=1:5
if i==1
str='red';
elif i==2
str='blue';
elif i==3
str='green';
elif i==4
str='orange';
elif i==5
str='purple';
end
shibie(a{i},yz,str)
end
⼦函数function [ ] = shibie(color,yz,str) figure() imshow(color); colorb = bwareaopen(color,yz); %删除⼆值图像BW中⾯积⼩于P对象 connect_size = 8; = strel('disk',connect_size); colorb = imdilate(colorb,); figure;imshow(colorb); title('扩充线条'); L = bwlabel(colorb); num = max(max(L));
B=cell(num,5);
for i = 1:num
[x,y] = find(L == i);
minx=min(y);
maxx=max(y);
miny=min(x);
maxy=max(x);
Width=maxx-minx;
Hight=maxy-miny;
B{i,1}=str;
omrtB{i,2}=minx;
B{i,3}=miny;
B{i,4}=Width;
B{i,5}=Hight;
英语四级考试试卷
end