我已经将jpg图象转换成了RBG值的矩阵,我想区分两个图象,并对他们进行分类.即两张图象对应象素点相减的总和,得到redrbg,greenrbg,bluerbg3个值.我分类的主要思想是把前面3个值除以图片象素总和,得到一个0--1地小数,若在0--0.1之间为1类,0.1--0.2之间为2类.........总共为10个类.但是相除时如何体现两张图片的差异呢?我的两种方法觉得都不好:
1.(redrbg+greenrbg+bluerbg)/3*象素总和       {乘以3是因为对r,g,b3个形式}
2.redrbg/象素总和+reenrbg/象素总和+bluerbg/象素总和
请问高手有什么更好的方法,是不是要用到16进制表示的方法:000000--FFFFFF才行?
分不够还可以再加!急求

解决方案 »

  1.   

    1.区分2个图象直接比较Image1.Picture.Bitmap.Canvas.Pixels[x][y]就可以了
    2。至于你说的类我看不明白,就是分出来了以后,你能说说这个类到底在表示什么含义?
    你处理的是不是同一张图片,而色彩的包和度不同?
      

  2.   

    不是同一张照片,我在做一个实时监控系统,需要视频流进行帧与帧之间的区别,其中要用到分类这个概念,为了下一步视频分段做基础,其中的概念可能三言两语说不清。我只是想知道如何达到我所需要的目的。不知道是不是对大家深奥了点,其实很简单,只是不好表达罢了!用Image1.Picture.Bitmap.Canvas.Pixels[x][y]也可以,不过无法满足实时的要求,速度太慢了!
    我是通过类来体现两个相邻帧的区别大小,区别越大就越靠近1。我愿意出高分解决这个问题!谢谢大家快点给我解决吧!要我做什么力所能及的都可以!
      

  3.   

    http://expert.csdn.net/Expert/topic/1472/1472467.xml?temp=.5871698
    http://expert.csdn.net/Expert/topic/1472/1472478.xml?temp=.9072382
    建议你先拜读这2个帖子,再回来看看你这个问题.
    用ScanLine应该比用Pixel快了许多,你要做的无非就是在红,绿,蓝那里添加你想要做什么
    至于你做的方法我实在看不明白,算法自己想好了.Image1.Picture.Bitmap.PixelFormats=pf24bit
    procedure Grayscale(const Bitmap:TBitmap);
    var 
      X: Integer; 
      Y: Integer; 
      PRGB: pRGBTriple;
      Gray: Byte;
    begin
      for Y := 0 to (Bitmap.Height - 1) do
      begin
        PRGB := Bitmap.ScanLine[Y];
        for X := 0 to (Bitmap.Width - 1) do
        begin 
          //PRGB^.rgbtRed:=Gray;         
         // PRGB^.rgbtGreen:=Gray;           /添加你的代码
           //PRGB^.rgbtBlue:=Gray;
          Inc(PRGB);
        end;
      end;
    end;
      

  4.   

    是不是也要用到一个权值问题?我代码是这样的
    var
     red,green,blue:real;
     imgrgb0,imgrgbx:TRGBArray;
    begin
     red:=0; green:=0;  blue:=0;
     if adotable1.number=1 then
       rgbchange(ImgRGB0)
     else begin
            rgbchange(ImgRGBx);
            n:=0;
            for i:=0 to image1.Picture.Height-1 do
              for j:=0 to image1.Picture.Width-1 do
                 begin
                    red:=ImgRGBx[n].rgbtRed-ImgRGB0[n].rgbtRed+red;
                    green:=ImgRGBx[n].rgbtGreen-ImgRGB0[n].rgbtGreen+green;
                    blue:=ImgRGBx[n].rgbtBlue-ImgRGB0[n].rgbtBlue+blue;
                    inc(n);
                 end;
    .......................未写完!
    设3个权值a,b,c。那么两帧间差异为:Dk=(a*red + b*blue + c*green)/256*height*width
    其中heigh 和width表示图片长宽。
    不知这样行否?
      

  5.   

    阿!不会把!这个思想是别人已经实现了的!不过他进行图片比较时是通过向量相减,而我转化成了各个象素依次相减,有什么不妥呢?你有什么更好的方法!给个思想咯!不要光说不行,又不给个建议。上面应该改为
    red:=abs(ImgRGBx[n].rgbtRed-ImgRGB0[n].rgbtRed)+red;
    green:=Iabs(mgRGBx[n].rgbtGreen-ImgRGB0[n].rgbtGreen)+green;
    blue:=abs(ImgRGBx[n].rgbtBlue-ImgRGB0[n].rgbtBlue)+blue;
    上面的rgbchange我没有显示代码!