数字图像处理——形态学2

1.标记联通区域,给图中加上小红星,效果如图:
原图:

在这里插入图片描述
效果图:
在这里插入图片描述

image=imread('arrow.jpg');
bw=im2bw(image);
[bw_label,n]=bwlabel(bw);  %bwlabel用来标记联通区域,bw_label跟bw的大小一样,从上到下,从左至右,从1开始依次标记连通分量
figure,imshow(bw);
%figure,imshow(bw_label,[]);  归一化操作,原本为逻辑图:零为零,非零当做一,变成八位图后,映射到0-255之间相应的值,由于不会存在小数,故可能会丢失数据。
%colormap hot;伪彩色,给灰度图加颜色。有多个属性值。
for i=1:n
    [r,c]=find(bw_label==i);
    mc=mean(c);%找到该联通区域中所有不为0的点的坐标后,求其均值,可以得到其重心所在的位置。
    mr=mean(r);
    hold on;%让前面的imshow等一下
    plot(mc,mr,'r*');%绘制红色的*
end

2.数硬币个数:

在这里插入图片描述
分析:
1.思路与上一个一样,但是在标记连通分量前需要填充小坑洞。

bw=imfill(bw,'holes');

2.显示硬币个数的代码:

s=strcat('共有',num2str(n),'个硬币');
display(s);

3.数图中多少个文字
在这里插入图片描述

分析:图中是中文文字,应该用竖线膨胀,使得文字的每个部分连接在一起。因为文字膨胀后,两个文字可能会连在一起,所以会有一点误差。
关键代码如下:

bw=~im2bw(image);
 
bw_close=imclose(bw,strel('disk',1));%闭运算,先膨胀再腐蚀,作用:消除小的空洞,并填补轮廓线中的断裂。
figure,imshow(bw_close);

bw_dilate=imdilate(bw_close,strel('line',10,90));
figure,imshow(bw_dilate);

[bw_label,n]=bwlabel(bw_dilate);  %bwlabel用来标记联通区域,bw_label跟bw的大小一样,从上到下,从左至右,从1开始依次标记连通分量
figure,imshow(bw);

4.用下图体会顶帽操作和底帽操作的作用。
在这里插入图片描述
顶帽操作:相当于原图减去开运算,使白色边界更清晰,通常用于去背景。
底帽操作:相当于闭运算减去原图。
实验代码如下,ge和gf显示出来的效果是一样的。

clear,clc,close all;
f=imread('lemon.jpg');
figure,imshow(f);
g=rgb2gray(f);%转为灰度图
figure,imshow(g);

se=strel('disk',10);
g_close=imclose(g,se);
figure,imshow(g_close-g);
g_open=imopen(g,se);
ge=cat(2,g,g-g_open,g_close-g);
figure,imshow(ge);

tophat=imtophat(g,se);
bothat=imbothat(g,se);
gf=cat(2,g,tophat,bothat);
figure,imshow(gf);

5.如图的计算器,要得到第二张图效果。
在这里插入图片描述
在这里插入图片描述
分析:首先要得到取反的灰度图,然后用顶帽操作去背景,得到背景为黑色的图像,再腐蚀掉文字得到图像后重建,得到只有边框的图像,最后用顶帽操作之后的图像减去只有边框的图像即可得到效果图。

clear,clc,close all;
f=imread('c.jpg');
figure,imshow(f);
g=255-rgb2gray(f);%转为灰度图
figure,imshow(g);

se=strel('disk',4);
g_tophat=imtophat(g,se);
figure,imshow(g_tophat);

g_erode=imerode(g_tophat,strel('line',20,0));
figure,imshow(g_erode);

g_re=imreconstruct(g_erode,g_tophat);
figure,imshow(g_tophat-g_re);






猜你喜欢

转载自blog.csdn.net/qq_41536360/article/details/89020210