zoukankan      html  css  js  c++  java
  • 关于道路标志牌的标记和数字标记

    主要内容为对道路上的限速标志的标识牌进行框取以及对标识牌中的数字进行框取

    原图如下所示:

    需要对上图中的红色框进行标记,以及将上图中的数字进行框取出来。

    诸多过程图不加赘述,有需要可自行运行下下述代码,了解相关算法步骤:

    close all
    %读入一张图片
    source = imread('test2.jpg');
    figure(1);imshow(source),title('Source Image');
    %图像中的RGB通道
    red = source(:,:,1);
    green = source(:,:,2);
    blue = source(:,:,3);
    
    %原图只保留R通道
    final = red - blue - green;
    figure(2);imshow(final),title('After R portion Extraction');
    
    %将图像转化为2进制图像
    binary_image = imbinarize(final);
    figure(3);imshow(binary_image),title('After converting to Binary Image');
    
    %去噪,剔除小噪点
    noiseless_image = bwareaopen(binary_image, 400);
    figure(4);imshow(noiseless_image),title('After removing smaller areas');
    
    %4通道分析
    connected = bwlabel(noiseless_image, 4);    
    Major_axis = regionprops(connected, 'MajorAxisLength');
    Minor_axis = regionprops(connected, 'MinorAxisLength');
    
    %没有连接的部分
    uniques = unique(connected);
    count = max(uniques);
    output = connected; 
    
    %删除不是作为标牌的图像部分
    for i = 1:count
        fill_numerator = Major_axis(i).MajorAxisLength;
        fill_denominator = Minor_axis(i).MinorAxisLength;
        fill_ratio = fill_numerator/fill_denominator;
        %避免除以零
        if (Minor_axis(i).MinorAxisLength==0)
            output(connected==i) = 0;
        %填充标准
        elseif (fill_ratio > 1.6)
            output(connected==i) = 0;
        end
    end
    figure(5);imshow(output);title('Removing filling ratio > 1.6');
    
    %确定消除面积小的区域
    BW2 = bwareaopen(output, 500);
    %figure(6);subplot(1,3,2),
    %imshow(BW2),title('Eliminating the segments other than signage');
    
    %映射连接组件映像上的现有区域
    output(BW2 == 0) = 0;
    figure(7);
    imshow(output),title('Segmented Image');
    %从源图像裁剪分段
    input = output;
    values = unique(input(input~=0));
    count = numel(values);
    Area = zeros(count,1);
    [row,col] = size(input);
    %对于所有已识别的细分
    for indexing = 1:count
    
    top_i = 0;
    top_j = 0;
    bottom_i = 0;
    bottom_j = 0;
    flag = 0;
    %识别该段从北方开始的位置( - 顶部)
    for i = 1:row
        for j = 1:col
        if(input(i,j) == values(indexing))
            top_i = i;
            top_j = j;
            flag = 1;
            break
        end
        end
        if(flag == 1)
            break
        end
    end
    flag = 0;
    
    %识别,段在南方( - 底部)结束
    for i = row:-1:1
        for j = 1:col
        if(input(i,j) == values(indexing))
            bottom_i = i;
            bottom_j = j;
            flag = 1;
            break
        end
        end
        if(flag == 1)
            break
        end
    end
    
    flag = 0;
    
    %识别,段从哪里到达东边(-right)
    for i = col:-1:1
        for j = 1:row
        if(input(j,i) == values(indexing))
            right_i = j;
            right_j = i;
            flag = 1;
            break
        end
        end
        if(flag == 1)
            break
        end
    end
    
    flag = 0;
    
    %识别段开始于西部的位置(-left)
    for j = 1:col
        for i = 1:row
        if(input(i,j) == values(indexing))
            left_i = i;
            left_j = j;
            flag = 1;
            break
        end
        end
        if(flag == 1)
            break
        end
    end
    
    %平方计算的边界 - 形成正方形
    
    square_right_row_top = top_i - 5;
    square_right_col_top = right_j + 5;
    
    square_left_row_top = square_right_row_top;
    square_left_col_top = left_j - 5;
    
    square_left_row_bottom = bottom_i + 5;
    square_left_col_bottom = square_left_col_top;
    
    square_right_row_bottom = square_left_row_bottom;
    square_right_col_bottom = square_right_col_top;
    
    %在原始图像上绘制已识别的形状
    width = square_right_col_top - square_left_col_top;
    height = square_left_row_bottom - square_left_row_top;
    
    Area(indexing) = width * height;
    
    if(Area(indexing) > 2000)
    figure(8)
    imshow(source)
    rectangle('Position',[square_left_col_top,square_left_row_top,width,height],'LineWidth',5,'EdgeColor','r'),title('Identified Signage Information');
    %分析裁剪的图像
    %从源中提取段
    cropped_Image = source(square_left_row_top:square_right_row_bottom,square_left_col_top:square_right_col_bottom,:);
    figure(9)
    imshow(cropped_Image),title('Extracted Image');
    %% %数字提取
    i=source;
    figure(10)
    imshow(i),title('Extracted Image');
    rectangle('Position',[square_left_col_top,square_left_row_top,width,height],'LineWidth',5,'EdgeColor','r'),title('Identified Signage Information');
    I_h=rgb2hsv(i);
    for i=square_left_row_top:(height+square_left_row_top)
        for j=square_left_col_top:(width+square_left_col_top)
            h=I_h(i,j,1);
            s=I_h(i,j,2);
            v=I_h(i,j,3);
            %通过将h通道颜色值特定范围内饱和度设为0,保留范围外颜色值
            if 0<h && h<0.833 
            %if 130<h && h<170 && 45<s&&s<85&&v>20&&v<30
                I_h(i,j,2)=0;
                %I_h(i,j,1)=0;
                %I_h(i,j,3)=0;
            end
        end
    end
    I_r=hsv2rgb(I_h);
    figure(11),imshow(I_r),title('11Image');
    i1=rgb2gray(I_r);
    i1=im2bw(i1,0.17);
    i1=medfilt2(i1, [7 7]);
    i1=~i1;
    figure(12),imshow(i1),title('11Image');
    se=strel('disk',10);
    marker=imerode(i1,se);
    figure(13),imshow(marker),title('11Image');
    f_obj=imreconstruct(marker,i1);
    figure(14),imshow(f_obj),title('imreconstruct_image')
    %%
    input_1=f_obj;
    values_1 = unique(input_1(input_1~=0));
    count_1 = numel(values_1);
    Area_1 = zeros(count_1,1);
    [row_1,col_1] = size(input_1);
    %对于所有已识别的细分
    for indexing_1 = 1:count_1
    
    top_i_1 = 0;
    top_j_1 = 0;
    bottom_i_1 = 0;
    bottom_j_1 = 0;
    flag_1 = 0;
    %识别该段从北方开始的位置( - 顶部)
    for i = 1:row_1
        for j = 1:col_1
        if(input_1(i,j) == values_1(indexing_1))
            top_i_1 = i;
            top_j_1 = j;
            flag_1 = 1;
            break
        end
        end
        if(flag_1 == 1)
            break
        end
    end
    flag_1 = 0;
    
    %识别,段在南方( - 底部)结束
    for i = row_1:-1:1
        for j = 1:col_1
        if(input_1(i,j) == values_1(indexing_1))
            bottom_i_1 = i;
            bottom_j_1 = j;
            flag_1 = 1;
            break
        end
        end
        if(flag_1 == 1)
            break
        end
    end
    
    flag_1 = 0;
    
    %识别,段从哪里到达东边(-right)
    for i = col_1:-1:1
        for j = 1:row_1
        if(input_1(j,i) == values_1(indexing_1))
            right_i_1 = j;
            right_j_1 = i;
            flag_1 = 1;
            break
        end
        end
        if(flag_1 == 1)
            break
        end
    end
    
    flag_1 = 0;
    
    %识别段开始于西部的位置(-left)
    for j = 1:col_1
        for i = 1:row_1
        if(input_1(i,j) == values_1(indexing_1))
            left_i_1 = i;
            left_j_1 = j;
            flag_1 = 1;
            break
        end
        end
        if(flag_1 == 1)
            break
        end
    end
    
    %平方计算的边界 - 形成正方形
    
    square_right_row_top_1 = top_i_1 - 5;
    square_right_col_top_1 = right_j_1 + 5;
    
    square_left_row_top_1 = square_right_row_top_1;
    square_left_col_top_1 = left_j_1 - 5;
    
    square_left_row_bottom_1 = bottom_i_1 + 5;
    square_left_col_bottom_1 = square_left_col_top_1;
    
    square_right_row_bottom_1 = square_left_row_bottom_1;
    square_right_col_bottom_1 = square_right_col_top_1;
    
    %在原始图像上绘制已识别的形状
    width_1 = square_right_col_top_1 - square_left_col_top_1;
    height_1 = square_left_row_bottom_1 - square_left_row_top_1;
    
    Area_1(indexing_1) = width_1 * height_1;
    
    if(Area_1(indexing_1) > 2000)
    figure(15)
    imshow(input_1)
    rectangle('Position',[square_left_col_top_1,square_left_row_top_1,width_1,height_1],'LineWidth',3,'EdgeColor','r'),title('Identified Signage Information');
    %分析裁剪的图像
    %%
    %二次识别图像数字
    input_2=input_1;
    se=strel('disk',5);
    input_2=imdilate(input_2,se);
    %figure(16)
    %imshow(input_2)
    %title('sss');
    L = bwlabel(input_2,8);
    stats = regionprops(input_2, 'basic');
    centroids = cat(1, stats.Centroid);
    figure('name','regionprops'),
    %绘制开操作之后的二值化图像
    imshow(input_2),title('centroids')  
    hold on
    %绘制重心
    %plot(centroids(:,1), centroids(:,2), 'b*'),
    %绘制感兴趣区域ROI
    for i=1:size(stats)
         rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','-','EdgeColor','r'),
    end
    figure(16)
    imshow(L)
    title('sss');
    %%
    %显示图像
    figure(17)
    imshow(source)
    rectangle('Position',[square_left_col_top,square_left_row_top,width,height],'LineWidth',3,'EdgeColor','r'),title('Identified Signage Information');
    rectangle('Position',[square_left_col_top_1,square_left_row_top_1,width_1,height_1],'LineWidth',3,'EdgeColor','r'),title('Identified Signage Information');
    for i=1:size(stats)
         rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','-','EdgeColor','r'),
    end
    end
    end
    
    %%
    %字符识别
    %text = ocr(cropped_Image);
    end
    end
    

     效果图如下所示:

     

  • 相关阅读:
    tcl中指定随机数种子
    redis的三种连接方式
    js代码统计table中某一列的值
    CRF从HMM的演进
    SVM中的一些问题
    bert损失函数
    SQL 注入笔记
    20200818 千锤百炼软工人第四十四天
    20200816 千锤百炼软工人第四十三天
    20200816 千锤百炼软工人第四十二天
  • 原文地址:https://www.cnblogs.com/zhuhongzhous/p/10307410.html
Copyright © 2011-2022 走看看