IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> FPGA实现车牌识别 四.MATLAB车牌字符分割 -> 正文阅读

[人工智能]FPGA实现车牌识别 四.MATLAB车牌字符分割

FPGA实现车牌识别 四.MATLAB车牌字符分割

笔者大二学了数电,结合之前学习的一些机器学习的基础知识,决定用FPGA实现一个车牌识别系统,由于能力有限可能更新进度较慢,希望理解。这是第四部分的内容MATLAB车牌字符分割


前言

这一篇文章依旧是FPGA实现前的算法验证。在上一篇文章中,已经得到了车牌的四个角落上的坐标,在这一篇文章将根据坐标将车牌从原图像中分割出来,在从车牌图像中分割出每一个字符。

一、车牌分割

这一步是根据四个坐标点从原始图像中分割出车牌
请添加图片描述
这里向内多切了几个像素,以去除部分字符外的蓝色边缘

二、字符分割

1.二值化

这里需要区分的是蓝色的背景与白色的字符,在这里我们可以采用红色通道分离两者。
得到红色通道的图像:
请添加图片描述
选取合适阈值,将其二值化得到图像:
请添加图片描述

2.水平方向投影

请添加图片描述
可以看到图像左右两侧存在数值较低的区域对应车牌区域最上方与最下方的空白区域
请添加图片描述
可以看出图像明显存在七个低谷,因此可将其分为八个字符

3.字符提取

分别对水平方向与竖直方向的投影结果设定阈值,当阈值超过阈值代表在字符范围内,以此找到每个字符的上下边界与左右边界。
提取得到的字符为
请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述

三、完整代码

function [img_out,exist] = cutting(img_in,x1,x2,y1,y2)
    char_x1 = [];
    char_x2 = [];
    char_y1 = 0;
    char_y2 = 0;

    
    x_size = x2-x1+1-10;
    y_size = y2-y1+1-10;
    plate = zeros(y_size,x_size,3);
    for i = y1+5:y2-5
        for j = x1+5:x2-5
            plate(i-y1+1,j-x1+1,:) = img_in(i,j,:);
        end
    end
    plate = uint8(plate);
    %figure(4)
    %image(plate);
    %imwrite(plate,'17.bmp');
    r = plate(:,:,1);%红色通道

    img_r(:,:,1) = r;
    img_r(:,:,2) = 0;
    img_r(:,:,3) = 0;
    %figure(5)
    %image(img_r); 
    %imwrite(img_r,'18.bmp');
    
    %对红色通道进行二值化
    for i = 1:y_size
        for j = 1:x_size
            if(r(i,j)>100)
                r_bz(i,j) = 255;
            else
                r_bz(i,j) = 0;
            end
        end
    end   
    img_bz(:,:,1) = r_bz;
    img_bz(:,:,2) = r_bz;
    img_bz(:,:,3) = r_bz;
    img_bz = uint8(img_bz);
    %figure(6)
    %image(img_r_bz);
    %imwrite(img_r_bz,'19.bmp');
    
    %垂直投影
    %水平投影
    cnt_x = zeros(1,x_size);  
    cnt_y = zeros(1,y_size);
    for i = 1:y_size
        for j = 1:x_size
            if(r_bz(i,j) == 255)
                cnt_y(i) = cnt_y(i)+1;
            end
        end
    end
    figure(1);
    plot(cnt_y);
    
    
    %水平方向
    cnt_img = 0;
    edge_flag = 0;%0时下一个边界为上边界,为1时下一个边界为下边界
    y_threshold = 30;%大于该阈值时认为在字符内部
    for i = 1:y_size
        
        if((cnt_img == 1)&&(edge_flag == 0))%找到所有字符是退出
            break;
        end
        
        if((i==1))
            if(cnt_y(1)>=y_threshold)%如果第一个字符从上边界开始
                cnt_img = 1;
                char_y1 = 1;
                edge_flag = 1;
            end
        
        elseif((i == y_size)&&(edge_flag == 1))%如果最后一个字符到下边界结束
            char_y2 = i;
            edge_flag = 0;
        
            
        elseif((cnt_y(i-1)<=y_threshold)&&(cnt_y(i)>y_threshold)&&(edge_flag==0))
            cnt_img = cnt_img+1;
            char_y1 = i;
            edge_flag=1;
        
        elseif((cnt_y(i-1)>=y_threshold)&&(cnt_y(i)<y_threshold)&&(edge_flag==1))
            char_y2 = i;
            edge_flag = 0;
        end
    end
    
    for i = char_y1:char_y2
        for j = 1:x_size
            img_y_finish(i-char_y1+1,j,:) = img_bz(i,j,:);
        end
    end
    y_size = char_y2-char_y1+1;
    image(img_y_finish);
    for i = 1:y_size
        for j = 1:x_size
            if(img_y_finish(i,j,1) == 255)
                cnt_x(j) = cnt_x(j)+1;
            end
        end
    end
    figure(2);
    plot(cnt_x);
    %x方向
    cnt_img = 0;
    edge_flag = 0;%0时下一个边界为左边界,为1时下一个边界为右边界
    x_threshold = 5;%大于该阈值时认为在字符内部
    for i = 1:x_size
        %找到所有字符是退出
        if((cnt_img == 8)&&(edge_flag == 0))
            break;
        end
        
        if(i==1)
            if(cnt_x(1)>=x_threshold)%如果第一个字符从左边界开始
                cnt_img = 1;
                char_x1(1) = 1;
                edge_flag = 1;
            end
        
        elseif((i == x_size)&&(edge_flag == 1))%如果最后一个字符到右边界结束
            char_x2(cnt_img) = i;
            edge_flag = 0;
            
        elseif((cnt_x(i-1)<=x_threshold)&&(cnt_x(i)>x_threshold)&&(edge_flag==0))%为左边界时
            cnt_img = cnt_img+1;  
            char_x1(cnt_img) = i;
            edge_flag=1;

        elseif((cnt_x(i-1)>=x_threshold)&&(cnt_x(i)<x_threshold)&&(edge_flag==1))%为右边界时
            char_x2(cnt_img) = i;
            edge_flag = 0;
        end
    end
    
    if(cnt_img == 8 )
        exist = 1;
    else
        exist =0;
        img_out = 0;
        return;
    end
    


    for i = 1:8
        for k = char_x1(i) : char_x2(i)
            img_out(:,k-char_x1(i)+1,:,i) = img_y_finish(:,k,:);  
        end
        imwrite(img_out(:,:,:,i),['char',num2str(i),'.bmp']);
    end
        
    
    
end



总结

这里已经完成了每个字符的分割,在下一篇文章中将使用简单的神经网网络对字符进行识别。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:25:17  更:2021-08-10 13:27:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:32:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码