车牌字符识别模板
篇一:车牌识别的matlab程序(程序,讲解,模板)
clc
clear close all
I=imread('chepaijpg');
subplot(3,2,1);imshow(I), title('原始图像');
I_gray=rgb2gray(I);
subplot(3,2,2),imshow(I_gray),title('灰度图像');
%======================形态学预处理 ====================== I_edge=edge(I_gray,'sobel');
subplot(3,2,3),imshow(I_edge),title('边缘检测后图像'); se=[1;1;1];
I_erode=imerode(I_edge,se);
subplot(3,2,4),imshow(I_erode),title('腐蚀后边缘图像');
se=strel('rectangle',[25,25]);
I_close=imclose(I_erode,se);%图像闭合、填充图像 subplot(3,2,5),imshow(I_close),title('填充后图像');
I_final=bwareaopen(I_close,2000); %去除聚团灰度值小于2000的部分 subplot(3,2,6),imshow(I_final),title('形态滤波后图像');
%==========================车牌分割 ============================= I_new=zeros(size(I_final,1),size(I_final,2)); location_of_1=[];
for i=1:size(I_final,1) %寻找二值图像中白的点的位置 for j=1:size(I_final,2)
if I_final(i,j)==1;
newlocation=[i,j];
location_of_1=[location_of_1;newlocation];end end end
mini=inf;maxi=0;
for i=1:size(location_of_1,1)
%寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置 temp=location_of_1(i,1)+location_of_1(i,2); if temp
if tempmaximaxi=temp;b=i;
end
end
first_point=location_of_1(a,:); %和最小的点为车牌的左上角 last_point=location_of_1(b,:);%和最大的点为车牌的右下角 x1=first_point(1)+4; %坐标值修正 x2=last_point(1)-4; y1=first_point(2)+4;
y2=last_point(2)-4; I_plate=I(x1:x2,y1:y2);
I_plate=OTSU(I_plate); %以OTSU算法对分割出的车牌进行自适应二值化处理
I_plate=bwareaopen(I_plate,50);
figure,imshow(I_plate),title('车牌提取') %画出最终车牌
%=========================字符分割============================ X=[]; %用来存放水平分割线的横坐标 flag=0;
for j=1:size(I_plate,2)
sum_y=sum(I_plate(:,j));
if logical(sum_y)~=flag%列和有变化时,记录下此列X=[X j];
flag=logical(sum_y); end end
figure
for n=1:7
char=I_plate(:,X(2n-1):X(2n)-1); %进行粗分割
for i=1:size(char,1)%这两个for循环对分割字符的上下进行裁剪if sum(char(i,:))~=0 top=i; breakend end
for i=1:size(char,1)
if sum(char(size(char,1)-i,:))~=0 bottom=size(char,1)-i; breakend en
OTSU的中心思想是阈值T应使目标与背景两类的类间方差最大。
//用类间方差最大思想计算阈值
int Threshold(int hist) //compute the threshold
{
float u0, u1;
float w0, w1;
int count0;
int t, maxT;
float devi, maxDevi = 0; //方差及最大方差
int i;
int sum = 0;
for (i = 0; i < 256; i++)
{
sum = sum + hist[i];
}
for (t = 0; t < 255; t++)
{
u0 = 0; count0 = 0;
//阈值为t时,c0组的均值及产生的概率
for (i = 0; i <= t; i++)
{
u0 += i hist[i]; count0 += hist[i];
}
u0 = u0 / count0; w0 = (float)count0/sum;
//阈值为t时,c1组的均值及产生的概率
u1 = 0;
for (i = t + 1; i < 256; i++)
{
u1 += i hist[i];
}
u1 = u1 / (sum - count0); w1 = 1 - w0;
//两类间方差
devi = w0 w1 (u1 - u0) (u1 - u0);
//记录最大的方差及最佳位置
if (devi > maxDevi)
{
maxDevi = devi;
maxT = t;
}
}
return maxT;
}
//二值化处理
void OTSU(IplImage src, IplImage dst)
{
int i = 0, j = 0;
int wide = src->widthStep;
int high = src->height;
int hist[256] = {0};
int t;
unsigned char p, q;
for (j = 0; j < high; j ++)
{
p = (unsigned char )(src->imageData + j wide);
for (i = 0; i < wide; i++)
{
hist[p[i]]++; //统计直方图
}
}
t = Threshold(hist);
for (j = 0; j < high; j ++)
{
q = (unsigned char )(dst->imageData + j wide);
p = (unsigned char )(src->imageData + j wide);
for (i = 0; i < wide; i++)
{
q[i] = p[i] >= t 255 : 0;
}
}
}
OTSU算法对不均匀光照的不能产生很好的效果。 另外一个Kittler算法,是一种快速的全局阈值法。它的效果不比OTSU差多少,但速度快好多倍,如果可以应用在图像质量不错的环境。
它的中心思想是,计算整幅图像的梯度灰度的平均值,以此平均值做为阈值。
//kittler算法
for (i=1;i<high-1;i++)
{
plineadd=src->imageData+iwide;
pNextLine=src->imageData+(i+1)wide;
pPreLine=src->imageData+(i-1)wide;
for(j=1;j<wide-1;j++)
{
//求水平或垂直方向的最大梯度
Grads=MAX(abs((uchar)pPreLine[j]-(uchar)pNextLine[j]),abs((uchar)plineadd[j-1]-(uchar)plineadd[j+1])); //max(xGrads,yGrads)
sumGrads += Grads;
//梯度与当前点灰度的积
sumGrayGrads += Grads((uchar)plineadd[j]);
}
}
threshold=sumGrayGrads/sumGrads;
// printf(%d\n,threshold);
for(i=0;i<high;i++)
{
plineadd=src->imageData+iwide;
pTempLine=kittler->imageData+iwide;
for(j=0;j<wide;j++)
{
pTempLine[j]=(uchar)plineadd[j]>threshold255:0;
}
}
各个位平面(0-1二值图像)还是对图像进行二值化得到0-1图像
如果是提取位平面,那语句bitget(A,i)即可,其中A表示某个灰度图像,i表示第i位,一般可取0-8任一值。
例:
A=fix(rand(4)255)
A =
207 161 244 244
230 24 246 123
32 71 40 204
232 139 247 36
>> bitget(A,1)
ans =
1 1 0 0
0 0 0 1
0 1 0 0
0 1 1 0
如果是图像二值化,则可以简单的使用otsu算法
p=unit8(A); %强制类型转换为无符号8位
t=graythresh(p);%求阈值
bw=im2bw(p,t); %二值化
t =
05863
bw =
1 1 1 1
1 0 1 0
0 0 0 1
1 0 1 0
如果只想生成一个任意的m x n的 0-1矩阵,则直接使用
A=round(rand(m,n)) 即可
用matlab图像处理确定激光光斑的中心的详细过程和算法
个不难的:
- 图像预处理,自动阀值方法二值化,然后滤掉噪声点,得到比较干净的圆形光斑离散点集;
- 用以下这个程序拟合出离散点的圆,并找出圆心。
其中第一步的自动阀值可以用otsu函数(otsu method,大津法),其余都很基础;第二步的程序如果看不懂,可以进一步看看参考资料连接。
function [xc,yc,R,a] = circfit(x,y)
%
% [xc yx R] = circfit(x,y)
%
% fits a circle in x,y plane in a more accurate
% (less prone to ill condition )
% procedure than circfit2 but using more memory
% x,y are column vector where (x(i),y(i)) is a measured point
%
% result is center point (yc,xc) and radius R
% an optional output is the vector of coeficient a
% describing the circle's equation
%
% x^2+y^2+a(1)x+a(2)y+a(3)=0
%
% By: Izhak bucher 25/oct /1991,
x=x(:); y=y(:);
a=[x y ones(size(x))]\[-(x^2+y^2)];
xc = -5a(1);
yc = -5a(2);
R = sqrt((a(1)^2+a(2)^2)/4-a(3));
参考资料:
以上就是关于你好请问你有matlab车牌识别的字符模板吗全部的内容,包括:你好请问你有matlab车牌识别的字符模板吗、图像二值化的算法比较、谁能写一段matlab源程序,就是把图片里单色背景下存在的障碍物提取出来,输出左转或右转来实现避障功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)