1,bwlabel();
Matlab中bwlabel函数的使用 标记原则:
从上到下
从左到右
从后到前
通俗讲,是将不互相联通的区域。进行分别赋值!
**plot(mc,mr,'r*');%展示照片,前面是坐标,后面是颜色“r”,以及进行标记的图形!这个先是列,再是行。**
实例:
clear,clc,close all;
f=imread('arrow.jpg');
bw=im2bw(f);figure,imshow(bw);
[l,n]=bwlabel(bw);%就是上面的函数
figure,imshow(l,[]);
for i=1:n
[r,c]=find(l==i);%这个是小写的L。不是数字1!
mr=mean(r);mc=mean(c);%寻找平均值,为下一步标记做准备!
hold on;%让上面的照片保留住!就是在上面那个图片进行标记!
plot(mc,mr,'r*');%展示照片,前面是坐标,后面是颜色“r”,以及进行标记的图形!这个先是列,再是行。
end
如果把“hold on”去掉的话,就会变成这样:
运行实例:
颜色是逐渐变化的。因为数值是从1到6的。
顶帽操作,底帽操作:
(操作,灰度图进行操作!)
生成灰度图,灰度图有多个不同数值。二值图无法进行顶帽操作,底帽操作。
都是改变中心区域。
关于:cat()
ge=cat(2,g,g_close,g_open);
figure,imshow(ge);
ge=cat(1,g,g_close,g_open);
figure,imshow(ge);
imfill():填充坑洞,
bw=imfill(bw,‘holes’);
与膨胀的区别,不用担心出现连接。左边是顶帽操作,右边是底帽操作!
计算器操作:
原图:
思路:
1. 转换灰度图取反
2. 顶帽操作去背景
3. 使用横线进行腐蚀
4. 在顶帽图上重建
代码:
clear,clc,close all;
f=imread('c.jpg');
g=255-rgb2gray(f);
imshow(g);
%转换灰度图取反
se=strel('disk',5);
g_tophat=imtophat(g,se);
figure,imshow(g_tophat);
%顶帽操作去背景
g_top_erode=imerode(g_tophat,strel('line',20,0));
figure,imshow(g_top_erode);
%使用横线进行腐蚀
g_re=imreconstruct(g_top_erode,g_tophat);
figure,imshow(g_re);
%在顶帽图上重建
result=g_tophat-g_re;
figure,imshow(result);
上机作业:
代码:
clc,clear,close all;
f=imread('key.jpg');
g=rgb2gray(f);
figure,imshow(g);
%生成灰度图,灰度图有多个不同数值。二值图无法进行顶帽操作,底帽操作。
se=strel('disk',2);
tophat=imtophat(g,se);
figure,imshow(tophat);
%顶帽操作去除背景
bw=im2bw(tophat);
se1=strel('line',15,0);
se2=strel('line',17,90);
%利用线条进行膨胀,
bw_im=imdilate(bw,se1);
bw_im2=imdilate(bw_im,se2);
figure,imshow(bw_im2);
%上面展示腐蚀过后的图片。
[l,n]=bwlabel(bw_im2);
for i=1:n
[r,c]=find(l==i);
mr=mean(r);mc=mean(c);
hold on;
plot(mc,mr,'r*');
end
%计算数值
figure,imshow(bw_im2);
s=strcat('共有',num2str(n),'个键');
display(s);
%结束