各位高手,我作了一个图像采集的东西,但是因为我的采集箱里面光线不标准,所以采集出来的图像颜色有偏差,我想在采集箱里面放一个三原色的色标,采集完图像后,根据色标的色差调节整个图像的颜色,达到还原的目的,哪位能告诉我这个色彩还原该怎么做呀?在此先行谢过!!!

解决方案 »

  1.   

    其是你要求的就是白平衡的算法, 白平衡经典的算法有Gray World , Prefect Reflect, 还有就是,你既然有三原色作为对照,那么你直接计算三原色在你取得的图像中的偏差,然后对目标图像进行校正就可以了.具体算法由于公司的原因不能在这里公布,你上google参考白平衡算法
      

  2.   

    楼上的大哥,能说得具体点吗,我在google上搜索了一下,没有找到有用的资料呀,或者可不可以帮我找点资料呀?拜托了!
      

  3.   

    xzhifei(饭桶超人(抵制日货)) :应该怎么还原呀,帮忙想想办法吧,小弟感激不尽呀!
      

  4.   

    定义三个原色率变量:
    Var
      B,R,G:Single;
    然后获得原色率Function IntToByte(i: Integer): Byte;
    Begin
      If i > 255 Then Result := 255
      Else If i < 0 Then Result := 0
      Else Result := i;
    End;
    type
      PRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array[0..32767] of TRGBTriple;
      function GetSLCOlor(pRGB: TRGBTriple): TColor;
      begin
        Result := RGB(pRGB.rgbtRed, pRGB.rgbtGreen, pRGB.rgbtBlue);
      end;
    var
      b, p: PRGBTripleArray;
      x, y: Integer;
      BaseColor: TColor;
    begin
      Bmp.PixelFormat := pf24Bit;
      for y := 0 to dBmp.Height - 1 do
      begin
        p := Bmp.scanline[y];
        for x := 0 to (Bmp.Width - 1) do
        begin
            b[x].rgbtBlue  :=IntToByte(Round(p[x].rgbtBlue*B));//通过原色率得到正确蓝色
            b[x].rgbtGreen:= IntToByte(Round(p[x].rgbtGreen*G));//通过原色率得到正确绿色
            b[x].rgbtRed:= IntToByte(Round(p[x].rgbtRed*R));//通过原色率得到正确红色
        end;
      end;end;
      

  5.   

    xzhifei(饭桶超人(抵制日货)):首先谢谢你的代码,前几天出差了,刚刚回来,看完代码后有几个问题想再请教一下:
    1:你所说的色彩还原率是怎么得到的,是不是用有偏差的三原色值除255得到的?
    2:程序每次运行到b[x].rgbtBlue  :=IntToByte(Round(p[x].rgbtBlue*B));//通过原色率得到正确蓝
      就出错了,这是怎么回事呀?
      

  6.   

    1:你所说的色彩还原率是怎么得到的,是不是用有偏差的三原色值除255得到的?这个你只能通过实验才能知道,道理大家都知道嘛,呵2:程序每次运行到b[x].rgbtBlue  :=IntToByte(Round(p[x].rgbtBlue*B));//通过原色率得到正确蓝
    把这行的dBmp改为Bmp试试:
    for y := 0 to dBmp.Height - 1 do
    此段代码不需要定义其它的BitMap对象