Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何从黑白图像中提取车牌_Matlab_Image Processing - Fatal编程技术网

Matlab 如何从黑白图像中提取车牌

Matlab 如何从黑白图像中提取车牌,matlab,image-processing,Matlab,Image Processing,我做了一个家庭作业,我必须从汽车图片中提取车牌。我不必识别车牌号码和字母(这是同事的工作)。我必须用Matlab来做。我已经做了车牌识别部分,但现在我不明白如何从图片中正确提取车牌部分 您可以在下面的图片中看到我到目前为止所做的工作: 现在我不知道如何裁剪白色部分,而且应该是这样的: 我的意思是,它应该旋转,使它达到水平位置 这是一个需要两个人完成的项目。第一个(me)必须只给第二个提供任何类型图像的车牌,第二个必须使用OCR。这是教授问的 我没有主意了。答案可能很简单,但我已经工作了一整天

我做了一个家庭作业,我必须从汽车图片中提取车牌。我不必识别车牌号码和字母(这是同事的工作)。我必须用Matlab来做。我已经做了车牌识别部分,但现在我不明白如何从图片中正确提取车牌部分

您可以在下面的图片中看到我到目前为止所做的工作:

现在我不知道如何裁剪白色部分,而且应该是这样的:

我的意思是,它应该旋转,使它达到水平位置

这是一个需要两个人完成的项目。第一个(me)必须只给第二个提供任何类型图像的车牌,第二个必须使用OCR。这是教授问的


我没有主意了。答案可能很简单,但我已经工作了一整天,我找不到解决方案。

如果您试图通过物理方式操纵图像,从任意数量的角度原始图像创建最终的展平表示,这可能不是继续的方法

如果您已经定义了识别板边界的逻辑,那么您应该能够捕捉该逻辑,然后通过OCR应用程序运行它。这将为您提供文本,然后您可以使用该文本创建平面图像

现在,如果您还必须从车牌中捕获任何图形,则需要跟踪所有可能的图形图像的数据库,然后编写比较/匹配例程,这样您就可以识别车牌图形,然后使用数据库中的“展开”版本创建展开的图像,然后将OCR文本输出到


例如,我只抓取了车牌,在images.google.com上搜索(使用他们的“按图像搜索”功能方面,我发现了很多可以用作模板的变量。

注意:变量使用不同的语言,但我相信代码本身是可读的。很抱歉,我现在没有时间处理它:(

现在这个算法不是最好的,但只是一个起点。我现在没有时间去研究它,但它肯定可以改进。例如,从底部的图像中可以看出,车牌位置填充得非常好,但在一些图片中,最后一行白色像素的长度与上面的不一样,所以一种解决方法是:在得到车牌的拐角之前,使所有白线的长度相同(与最长的线的长度相同)

BW=edge(rgb2gray(想象),“canny”);
%#霍夫变换
[htr]=hough(BW);
P=小时峰值(H,4,'阈值'),ceil(0.75*max(H(:)));
线=小时线(BW、T、R、P);
%剪变形金刚
斜率=顶点(直线点2)-顶点(直线点1);
斜率=斜率(:,2)。/斜率(:,1);
TFORM=maketform('affine',[1-斜率(1)0;0 1 0;0 0 1]);
imagine2=imtransform(imagine,TFORM);
%#显示重叠线条的图像,以及对齐/旋转的图像
轴(手柄、图像提塔)
imshow(imagine2);
imaginegree=rgb2gray(imagine2);
%-----------------------------------------------------------------
轴(手柄。ImagePrel1)
imshow(想象出口);
imagineFiltrata=medfilt2(imaginegree[3]);
轴(句柄.imaginefit)
imshow(imagineFiltrata);
SE=strel('圆盘',1);
GrayDil=不扩张(图像亮度,SE);
灰色=伊梅罗德(想象出口,东南);
gdiff=imsubtract(灰色,更灰色);
gdiff=mat2gray(gdiff);
gdiff=conv2(gdiff[11;11]);
gdiff=imadjust(gdiff[0.50.7],[01],0.1);
B=逻辑(gdiff);
er=imerode(B,strel('line',50,0));
out1=imsubtract(B,er);
ImagesBell=imfill(out1,'holes');
H=bwmorph(图像标签,'thin',1);
H=imerode(H,strel('line',3,90));
最终=BWAREOPEN(H,100);
Iprops=regionprops(最终,'BoundingBox','Image');
轴(手柄.图像标签)
imshow(最终);
ImageCurata=imclearborder(最终版本,18);
ImageCurata=BWAREOPEN(ImageCurata,200);
轴(手柄。图像标记)
imshow(imagineCuratata);
fileID=fopen('ImagineRezultata.txt','wb');
dlmwrite('ImagineRezultata.txt',imaginecurata);
fclose(“全部”);
ImageCurata2=ImageCurata;
[dimX,dimY]=大小(ImageCurata2);
%-----------------------------------------------------------------
%-----------车牌上充满了白色像素---------
PrimPixelAlbStanga=0;
PrimPixelAlbDreapta=0;
Flag=0;
对于i=1:dimX
对于j=1:dimY
如果标志==0
如果图像坐标2(i,j)=1
PrimPixelAlbStanga=j;
Flag=1;
结束
结束
如果标志==1
如果图像坐标2(i,j)=1
PrimPixelAlbDreapta=j;
结束
结束
结束
如果PrimPixelAlbStanga>0
对于k=PrimPixelAlbStanga:PrimPixelAlbDreapta
想象数据2(i,k)=1;
结束
结束
PrimPixelAlbStanga=0;
PrimPixelAlbDreapta=0;
Flag=0;
结束
%-----------------------------------------------------------------
%-----------------------------------------------------------------
%----------带有白色像素的较小线条将被删除--------
%----------这是为了消除所有较小的--------
%--------------例如,有时保留徽标------------
PrimPixelAlbStanga=0;
PrimPixelAlbDreapta=0;
Flag=0;
对于i=1:dimX
对于j=1:dimY
如果标志==0
如果图像坐标2(i,j)=1
PrimPixelAlbStanga=j;
Flag=1;
结束
结束
如果标志==1
如果图像坐标2(i,j)=1
PrimPixelAlbDreapta=j;
结束
结束
结束
如果PrimPixelBStanga
BW = edge(rgb2gray(imagine), 'canny');

    %# hough transform
    [H T R] = hough(BW);
    P  = houghpeaks(H, 4, 'threshold',ceil(0.75*max(H(:))));
    lines = houghlines(BW, T, R, P);

    % shearing transformata
    slopes = vertcat(lines.point2) - vertcat(lines.point1);
    slopes = slopes(:,2) ./ slopes(:,1);
    TFORM = maketform('affine', [1 -slopes(1) 0 ; 0 1 0 ; 0 0 1]);
    imagine2 = imtransform(imagine, TFORM);

    %# show image with lines overlayed, and the aligned/rotated image
    axes(handles.ImagineRotita)
    imshow(imagine2); 

    imagineGrey = rgb2gray(imagine2);

%-----------------------------------------------------------------

    axes(handles.ImaginePrel1)
    imshow(imagineGrey);

    imagineFiltrata = medfilt2(imagineGrey,[3 3]);
    axes(handles.ImagineFilt)
    imshow(imagineFiltrata);

    SE = strel('disk',1);
    GrayDil = imdilate(imagineGrey,SE);
    GrayEr = imerode(imagineGrey,SE);
    gdiff = imsubtract(GrayDil,GrayEr);
    gdiff = mat2gray(gdiff);
    gdiff = conv2(gdiff,[1 1;1 1]);
    gdiff = imadjust(gdiff,[0.5 0.7],[0 1],0.1);

    B = logical(gdiff);
    er = imerode(B,strel('line',50,0));
    out1 = imsubtract(B,er);

    imagineSobel = imfill(out1,'holes');

    H = bwmorph(imagineSobel,'thin',1);
    H = imerode(H,strel('line',3,90));

    final = bwareaopen(H,100);

    Iprops = regionprops(final,'BoundingBox','Image');

    axes(handles.ImagineSobel)
    imshow(final);

    imagineCuratata = imclearborder(final,18);
    imagineCuratata = bwareaopen(imagineCuratata,200);
    axes(handles.ImagineSobelEd)
    imshow(imagineCuratata);

    fileID = fopen('ImagineRezultata.txt','wb');
    dlmwrite('ImagineRezultata.txt',imagineCuratata);
    fclose('all');

    imagineCuratata2 = imagineCuratata;

    [dimX,dimY] = size(imagineCuratata2);

%-----------------------------------------------------------------
%-----------The licence plate is filled with white pixels---------
PrimPixelAlbStanga = 0;
PrimPixelAlbDreapta = 0;
Flag = 0;

for i = 1:dimX
    for j = 1:dimY
        if Flag == 0
            if imagineCuratata2(i,j) == 1
                PrimPixelAlbStanga = j;
                Flag = 1;
            end
        end
        if Flag == 1
            if imagineCuratata2(i,j) == 1
                PrimPixelAlbDreapta = j;
            end
        end
    end
    if PrimPixelAlbStanga > 0
        for k = PrimPixelAlbStanga:PrimPixelAlbDreapta
            imagineCuratata2(i,k) = 1;
        end
    end
    PrimPixelAlbStanga = 0;
    PrimPixelAlbDreapta = 0;
    Flag = 0;
end

%-----------------------------------------------------------------

%-----------------------------------------------------------------
%----------The smaller lines with white pixels are removed--------
%----------this is to eliminate all the smaller lines that--------
%--------------remained for example the logo sometimes------------

PrimPixelAlbStanga = 0;
PrimPixelAlbDreapta = 0;
Flag = 0;

for i = 1:dimX
    for j = 1:dimY
        if Flag == 0
            if imagineCuratata2(i,j) == 1
                PrimPixelAlbStanga = j;
                Flag = 1;
            end
        end
        if Flag == 1
            if imagineCuratata2(i,j) == 1
                PrimPixelAlbDreapta = j;
            end
        end
    end
    if PrimPixelAlbStanga > 0
        if (PrimPixelAlbDreapta - PrimPixelAlbStanga) < 40
            for k = PrimPixelAlbStanga:PrimPixelAlbDreapta
                imagineCuratata2(i,k) = 0;
            end
        end
    end
    PrimPixelAlbStanga = 0;
    PrimPixelAlbDreapta = 0;
    Flag = 0;
end

axes(handles.ImagineCropata)
imshow(imagineCuratata2);

%-----------------------------------------------------------------

%-----------------------------------------------------------------
%---------the corners of the licence plate are determined---------

imagineCuratata2 = bwareaopen(imagineCuratata2,500);

PrimaCoordX = 0;
PrimaCoordY = 0;
UltimaCoordX = 0;
UltimaCoordY = 0;
determinat = 0;

for i = 1:dimX
    for j = 1:dimY
        if imagineCuratata2(i,j) == 1
            if determinat == 0
                PrimaCoordX = j;
                PrimaCoordY = i;
                determinat = 1;
            else
                            UltimaCoordX = j;
                            UltimaCoordY = i;
            end            
        end
    end
end

PrimaCoordColX = 0;
PrimaCoordColY = 0;
UltimaCoordColX = 0;
UltimaCoordColY = 0;
determinatCol = 0;

for j = 1:dimY
    for i = 1:dimX
        if imagineCuratata2(i,j) == 1
            if determinatCol == 0
                PrimaCoordColX = j;
                PrimaCoordColY = i;
                determinatCol = 1;
            else                
                    UltimaCoordColX = j;
                    UltimaCoordColY = i;
            end            
        end
    end
end

    xmin = 0;
    ymin = 0;
    width = 0;
    height = 0;

    if PrimaCoordX < dimX/2
        xmin = PrimaCoordX;
        ymin = PrimaCoordY;
    else 
        xmin = PrimaCoordColX;
        ymin = PrimaCoordY;
    end

    xmin = xmin - xmin * 0.1;
    ymin = ymin * 1.1;

    if PrimaCoordX < dimX/2
        width = UltimaCoordX - PrimaCoordX;
        height = UltimaCoordY - PrimaCoordY;
    else
        width = UltimaCoordColX - PrimaCoordColX;
        height = UltimaCoordY - PrimaCoordY;
    end

    rect = [xmin ymin abs(width) abs(height)];

    RezultatCropat = imcrop(imagine2, rect);

    axes(handles.ImagineCropataSiFilt)
    imshow(RezultatCropat);

end