你好请问你有matlab车牌识别的字符模板吗

你好请问你有matlab车牌识别的字符模板吗,第1张

车牌字符识别模板

篇一:车牌识别的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源程序,就是把图片里单色背景下存在的障碍物提取出来,输出左转或右转来实现避障功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10165797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存