【matlab代码练习18】车牌图像倾斜校正算法的MATLAB实现

       车牌校正是车牌定位和字符分割的一个重要处理过程。经过车牌定位后所获取的车牌图像不可避免地存在某种程度的倾斜,这种倾斜不仅会给下一步字符分割带来困难,最终对车牌识别的正确率造成影响。本部分主要讲车牌图像倾斜校正算法的MATLAB实现,包括Hough变换法和Radon变换法等。

1. 基于Hough变换的车牌图像倾斜校正算法

      利用Hough变换检测车牌的边框,确定边框直线的倾斜角度,根据倾斜角度旋转,获得校正后的图像。具体步骤如下:

  • 图像预处理。读取图像,转换为灰度图像,去除离散噪声点。
  • 利用边缘检测,对图像中的水平线进行强化处理。
  • 基于Hough变换检测车牌图像的边框,获取倾斜角度。
  • 根据倾斜角度,对车牌图像进行倾斜校正。
% 利用hough变换实现车牌图像的倾斜校正
close all; clear all; clc;
I = imread('车牌1.jpg');  % read image into workspace
figure;
subplot(131), imshow(I); 
I1 = rgb2gray(I);  % 将原始图像转换为灰度图像
I2 = wiener2(I1, [5, 5]);  % 对灰度图像进行维纳滤波
I3 = edge(I2, 'canny');  % 边缘检测
subplot(132), imshow(I3); 
[m, n] = size(I3);  % compute the size of the image
rho = round(sqrt(m^2 + n^2)); % 获取ρ的最大值,此处rho=282
theta = 180; % 获取θ的最大值
r = zeros(rho, theta);  % 产生初值为0的计数矩阵
for i = 1 : m
   for j = 1 : n
      if I3(i,j) == 1  % I3是边缘检测得到的图像
          for k = 1 : theta
             ru = round(abs(i*cosd(k) + j*sind(k)));
             r(ru+1, k) = r(ru+1, k) + 1; % 对矩阵计数 
          end
      end
   end
end
r_max = r(1,1); 
for i = 1 : rho
   for j = 1 : theta
       if r(i,j) > r_max
          r_max = r(i,j); 
          c = j; % 把矩阵元素最大值所对应的列坐标送给c
       end
   end
end
if c <= 90
   rot_theta = -c;  % 确定旋转角度
else
    rot_theta = 180 - c; 
end
I4 = imrotate(I1, rot_theta, 'crop');  % 对图像进行旋转,校正图像
subplot(133), imshow(I4);
set(0, 'defaultFigurePosition', [100, 100, 1200, 450]); % 修改图像位置的默认设置
set(0, 'defaultFigureColor', [1, 1, 1]); % 修改图像背景颜色的设置

2. 基于Radon变换的车牌图像倾斜校正算法的实现

      将车牌图像朝各个方向投影,进而通过分析各方向的投影特性确定车牌的倾斜角度。具体的实现步骤如下:

  • 图像预处理。读取图像,转换为灰度图,去除离散噪声点。
  • 利用边缘检测,对图像中水平线进行强化处理。
  • 计算图像的Radon变换,获取倾斜角度。
  • 根据倾斜角度,对车牌图像进行倾斜校正。
close all; clear all; clc; 
I = imread('车牌1.jpg'); 
subplot(131), imshow(I);
I1 = rgb2gray(I); 
I2 = wiener2(I1, [5, 5]); 
I3 = edge(I2, 'canny'); 
subplot(132), imshow(I3); 
theta = 0 : 179;
r = radon(I3, theta); 
[m, n] = size(r); 
c = 1; 
for i = 1 : m
   for j = 1 : n
      if r(1,1) < r(i,j)
         r(1,1) = r(i,j);
         c = j;
      end
   end
end
rot_theta = 90 - c; 
I5 = imrotate(I, rot_theta, 'crop');
subplot(133), imshow(I5); 

猜你喜欢

转载自blog.csdn.net/qq_15971883/article/details/80537133