matlab通过提取车牌颜色定位车牌的一个程序。不明白原理
该程序首先把rgb图像转化为XYZ空间,然后在XYZ空间进行一些阈值找到黄色的底色车牌,这是从国外的车牌识别程序,但不明白那些阈值为什么要那么设,用的是什么原理?
还有一个疑问就是,这个程序对于输入的车牌有时候找到的是车牌的底,有时候是车牌的数字。一个是黄色,一个是白色。真不知道怎么找的。
function [y_image] = extract_yellow_region(image);
% extract_yellow_region: Determines the yellow regions in the picture using
% the CIE-XYZ color system, and returns a black and white picture which is
% set on the yellow regions only.
% Define the lines in CIE-XYZ space, use to determine yellow color
lower_A = 0.87; lower_B = 0.04;
upper_A = 1.5 ; upper_B = -0.125;
% Convert 8-bit format of org_pic pixels to double format
pic = double(image)+1;
pic = pic.*1.6;
% Conversion from RGB709 to CIE-XYZ
x = ( pic(:,:,1).*0.412453 + pic(:,:,2).*0.35758 + pic(:,:,3).* 0.180423);
y = ( pic(:,:,1).*0.212671 + pic(:,:,2).*0.715160 + pic(:,:,3).* 0.072169);
z = ( pic(:,:,1).*0.019334 + pic(:,:,2).*0.119193 + pic(:,:,3).*0.950227);
sum = x + y + z;
x_bar = x./sum;
y_bar = y./sum;
% Define yellow color in CIE-XYZ space
x_sum_conds = ( ((x_bar > 0.34) & (sum > 400) & (sum < 500) ) | ((x_bar > 0.37) & (sum > 200) & (sum < 500)) );
xy_conds = ( (y_bar > 0.35) & (y_bar < 0.5) & (y_bar > (lower_A*x_bar + lower_B)) & (y_bar < (upper_A*x_bar + upper_B)) );
y_image = (x_sum_conds & xy_conds);
return;
[解决办法]
我估计这段代码是用来做黑白图(图里面每个像素只有0或者1来表示)用的。是用来确定黄色区域。你去http://en.wikipedia.org/wiki/CIE_1931_color_space可以看到一个CIE三色空间的图,从里面那些那些数据就可以了解代码里面确定黄色区域的阀值。
[解决办法]
这厮两个颜色空间的转换
首先表示颜色有很多方法,RGB,HSV,等等,他们之间可以互相转换,因为他们都是可以表示整个颜色空间的,只是在坐标方向,精度上有所不同
至于他们间的转化公式就不用太深入研究了,都是弄好的,基本上就是颜色空间的坐标转换问题
这个程序就是利用在CIE空间下黄色容易判定来做的,他给定的黄色范围也是个经验性的值,
你看下CIE的颜色图,你可以自己定义黄色的范围,然后把范围改成你认为的 或换成其他颜色的,如蓝色
[解决办法]
% Conversion from RGB709 to CIE-XYZ
--->这里不是RGB,而是RGB709,即sRGB,所以转换系数也与RGB不同,查看下面的连接中
http://stuff.mit.edu/afs/athena/software/scm_v5d9/slib/colorspc.scm
sRGB的转换系数与RGB的转换系数不同
(define RGB709:from-matrix
'(( 0.412453 0.357580 0.180423 )
( 0.212671 0.715160 0.072169 )
( 0.019334 0.119193 0.950227 )))
顶楼的是否因此而无法准确确定在RGB图像中的黄色位置?使用sRGB图像再试试看吧。或者将系数改为RGB的再看看。