C#中的照明规范化

时间:2013-11-27 08:07:06

标签: c# image-processing normalization aforge emgucv

我想在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)所示”

非常感谢提前。

0 个答案:

没有答案