我想在C#中检测视频流中的眼睑眨眼,我正在使用this论文中提到的方法。
摘自论文:
因此,提出了一种解决这种照明变化问题的更快算法,如下所示:在RGB输入图像转换为L a b *图像后,通过应用a获取照明元件31×31中值滤波器到L图像,如图6(b)所示。通过应用中值滤波,可以近似输入图像的照明分量,不包括眼睛区域的详细形成,如图6(b)所示。
这里,中值滤波器的最佳尺寸根据眼睛检测精度在实验上凭经验确定。然后,获得反转的照明图像,如图6(c)所示。 通过将反转图像添加到原始L图像来补偿照明变化的影响。因此,获得了照明补偿的RGB图像,如图6(d)所示。
图。图7示出了使用所提出的照明归一化的二值化眼睛图像的结果。在这种二值化程序中,阈值是根据冈萨雷斯和伍兹(2002)的研究自动确定的。二值化结果如图所示 图7(b)比图5(b)和(c)所示的要好得多。
图。图8示出了在照射标准化之后的二值化眼睛图像的其他示例
修改
Fig.5 http://imageshack.com/a/img837/2086/w665.jpg
Fig.6 http://imageshack.com/a/img440/6157/kmo6.jpg
Fig.7 http://imageshack.com/a/img7/5584/rloq.jpg
对于色彩空间转换,我使用的是this链接的代码。
我的代码是:
void RGBtoXYZ(Bitmap bm, int row, int col, CIEXYZ[,] xyz)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
xyz[i, j] = ColorSpaceHelper.RGBtoXYZ(bm.GetPixel(j, i).R, bm.GetPixel(j, i).G, bm.GetPixel(j, i).B);
}
}
}
void XYZtoLAB(CIEXYZ[,] xyz, int row, int col, CIELab[,] lab)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
lab[i, j] = ColorSpaceHelper.XYZtoLab(xyz[i, j]);
}
}
}
void LABtoXYZ(CIEXYZ[,] xyz, int row, int col, CIELab[,] lab)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
xyz[i, j] = ColorSpaceHelper.LabtoXYZ(lab[i, j]);
}
}
}
void XYZtoRGB(Bitmap bm, int row, int col, CIEXYZ[,] xyz)
{
Devcorp.Controls.Design.RGB rgb;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
rgb = ColorSpaceHelper.XYZtoRGB(xyz[i, j]);
bm.SetPixel(j, i, Color.FromArgb(rgb.Red, rgb.Green, rgb.Blue));
}
}
}
void MedianLabImage(CIELab[,] lab, int row, int col, int filter_width)
{
double value = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
value = 0;
for (int r = 0; r < filter_width; r++)
{
for (int c = 0; c < filter_width; c++)
{
int image_r = Math.Min(Math.Max(i + r, 0), row - 1);
int image_c = Math.Min(Math.Max(j + c, 0), col - 1);
value += lab[image_r, image_c].L;
}
}
value /= (filter_width * filter_width - 1);
lab[i, j].L = value;
}
}
}
void MyFunction()
{
System.Drawing.Bitmap img = new System.Drawing.Bitmap(@"C:\Users\Haseeb\Desktop\Untitled.bmp");//@"C:\Users\Haseeb\Desktop\EyeBmp.bmp");
int imgRow, imgCol;
imgRow = img.Height;
imgCol = img.Width;
CIEXYZ[,] xyzImage = new CIEXYZ[imgRow, imgCol];
CIELab[,] labImage = new CIELab[imgRow, imgCol];
RGBtoXYZ(img, imgRow, imgCol, xyzImage);
XYZtoLAB(xyzImage, imgRow, imgCol, labImage);
MedianLabImage(labImage, imgRow, imgCol, 9);//My confusion starts after this
LABtoXYZ(xyzImage, imgRow, imgCol, labImage);
XYZtoRGB(img, imgRow, imgCol, xyzImage);
}
任何人都可以确认我这样做是正确的吗?我的主要问题是作者的意思是什么
“然后,获得反转的照明图像,如图6(c)所示。”
和
“通过将反转图像添加到原始L图像来补偿照明变化的影响。因此,获得了照明补偿的RGB图像,如图6(d)所示”
非常感谢提前。