车牌校正是车牌定位和字符分割的一个重要处理过程。经过车牌定位后所获取的车牌图像不可避免地存在某种程度的倾斜,这种倾斜不仅会给下一步字符分割带来困难,最终对车牌识别的正确率造成影响。本部分主要讲车牌图像倾斜校正算法的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);