带背景车牌分割
目的:提取出以下图片中的车牌
结果示例:
思路:可以利用顶帽底帽操作去除背景,然后转换为二值图,通过腐蚀膨胀和去除小对象,去除无关区域,最后使用图像切割的方法,切割出车牌部分。(本例中用到的函数的详细讲解都已经在前面叙述,故在本例中不再详细赘述。)
步骤:
-
首先将图片转换为灰度图
该步代码:clear,clc,close all; f=imread('c5.jpg'); g=rgb2gray(f); figure,imshow(g);
-
将图片转换为二值图,但是观察二值图可以发现,在车的背景中有大面积白色,这非常影响我们对白色车牌部分的识别提取,因此我们可以选择在灰度图中使用顶帽操作实现白色背景的去除。
-
使用顶帽操作在灰度图中去除白色背景,可以看出,背景大面积的白色背景没有了,可以转换为二值图查看效果。
代码为:
clear,clc,close all; f=imread('c5.jpg'); g=rgb2gray(f); subplot(1,2,1),imshow(g); ghat=imtophat(g,strel('disk',7)); subplot(1,2,2),imshow(ghat);
-
将图片转换为二值图,利用默认参数转换为二值图,可以看出还是有较多的白色区域。通过观察灰度图可以看出,车牌是最亮的区域,而还有一部分区域是比较亮的,所以我们可以想到用 imbinarize 的参数来设置对二值图转换时候的转换标准。
修改代码得到如下:
可以看出,有较多的白色消失了。
代码为:clear,clc,close all; f=imread('c5.jpg'); g=rgb2gray(f); subplot(1,2,1),imshow(g); ghat=imtophat(g,strel('disk',7)); subplot(1,2,2),imshow(ghat); bw=imbinarize(ghat,0.4); figure,imshow(bw);
-
观察二值图,有许多较小白色区域,可以先用 bwareaopen 函数去除这些小对象
新增代码:bwao=bwareaopen(bw,27); figure,imshow(bwao);
-
我们用 edge 函数提取每一部分的边界,通过边界进行每一块连通区域的识别
新增代码:bwedge=edge(bwao); figure,imshow(bwedge);
-
观察边界图,可以发现车牌部分的竖直连通区域较多,可以使用实现进行腐蚀,去除多余部分
新增代码:bwerode=imerode(bwedge,strel('line',7,90)); figure,imshow(bwerode);
-
观察腐蚀后的图片,我们可以通过膨胀连接车牌区域的分散部分。
新增代码:bwfinal=imdilate(bwerode,strel('disk',29)); figure,imshow(bwfinal);
-
除去旁边的小对象,就可以得到车牌部分的区域
新增代码为:result=bwareaopen(bwfinal,15000); figure,imshow(result);
-
由于得到的区域较大,可以先通过腐蚀减少区域部分,再利用图像切割便可得到该区域。在图像切割时若要得到彩色图,要使用三个维度的参数切割。
本例代码:
clear,clc,close all;
f=imread('c5.jpg');
g=rgb2gray(f);
subplot(1,2,1),imshow(g);
ghat=imtophat(g,strel('disk',7));
subplot(1,2,2),imshow(ghat);
bw=imbinarize(ghat,0.4);
figure,imshow(bw);
bwao=bwareaopen(bw,27);
figure,imshow(bwao);
bwedge=edge(bwao);
figure,imshow(bwedge);
bwerode=imerode(bwedge,strel('line',7,90));
figure,imshow(bwerode);
bwfinal=imdilate(bwerode,strel('disk',29));
figure,imshow(bwfinal);
result=bwareaopen(bwfinal,15000);
figure,imshow(result);
resulterode=imerode(result,strel('disk',23));
[r,c]=find(resulterode);
cut=f(min(r):max(r),min(c):max(c),:);
figure,imshow(cut);