我用彩色线阵ccd获取的RGB值,因为数值不均匀,很难找到颜色块之间的差别,所以想把彩色图像转换为黑白,然后通过灰度值分割,把每个颜色分离出来,请问怎么做?还有图像RGB值不均匀,怎么变成均匀的?谢谢
 

解决方案 »

  1.   

    void   CDibView::OnMenuchange()   file://图像转换实现函数   
      {   
       //   TODO:   Add   your   command   handler   code   here   
       HANDLE   data1handle;   
       LPBITMAPINFOHEADER   lpBi;   
       BITMAPINFO   *m_pBMI;   
       CDibDoc   *pDoc=GetDocument();   
       HDIB   hdib;   
       unsigned   char   *hData;   
       unsigned   char   *data;   
       hdib=pDoc->GetHDIB();//得到位图数据的句柄,其中包含图像信息头   
       BeginWaitCursor();   
       lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);   
       hData=(unsigned   char*)FindDIBBits((LPSTR)lpBi);   
       m_pBMI=new   BITMAPINFO;//生成彩色图像的信息头   
       m_pBMI->bmiHeader.biBitCount=24;   
       m_pBMI->bmiHeader.biClrImportant=0;   
       m_pBMI->bmiHeader.biClrUsed=0;   
       m_pBMI->bmiHeader.biCompression=BI_RGB;   
       m_pBMI->bmiHeader.biHeight=lpBi->biHeight;   
       m_pBMI->bmiHeader.biWidth=lpBi->biWidth;   
       m_pBMI->bmiHeader.biPlanes=1;   
       m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);   
       m_pBMI->bmiHeader.biXPelsPerMeter=0;   
       m_pBMI->bmiHeader.biYPelsPerMeter=0;   
       m_pBMI->bmiHeader.biSizeImage=WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3;   
       file://data=hData;   
       int   R,G,B,i,j;   
       data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3);   
       file://生成存储彩色图象数据的缓冲区   
       data=(unsigned   char*)GlobalLock((HGLOBAL)data1handle);   
       for(i=0;ibiHeight;i++)//实现灰度到彩色变换   
        for(j=0;jbiWidth*8);j++)   
        {   
         if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=64)   
         {R=0;   
          G=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));   
          B=255;   
         }   
         if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>64     
          &&   *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=128)   
          {R=0;   
           G=255;   
           B=(int)4*(128-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));   
          }   
         if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>128     
           &&   *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=192)   
           {R=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)-128);   
            G=255;   
            B=0;   
           }   
         if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>192     
           &&   *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=255)   
           {R=255;   
            G=(int)4*(255-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));   
            B=0;   
           }   
         file://将生成的R、G、B分量存入目标缓冲区   
         *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3)=B;   
         *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+1)=G;   
         *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+2)=R;   
        }     
        GlobalUnlock((HGLOBAL)hdib);   
        GlobalUnlock(data1handle);   
        EndWaitCursor();   
        CClientDC   pDC(this);   
        file://显示真彩色图像   
        StretchDIBits(pDC.GetSafeHdc(),0,0,lpBi->biWidth,lpBi->biHeight,0,0,   
               lpBi->biWidth,   lpBi->biHeight,data,m_pBMI,DIB_RGB_COLORS,   
               SRCCOPY);   
        delete   m_pBMI;   
      }
      

  2.   

    http://topic.csdn.net/t/20060308/01/4599542.html
      

  3.   

    0.3R+0.59G+0.11B计算的结果就是 rgb基本同一个值.
      

  4.   

    要将RGB映射为灰度值表,要均匀的显示可能需要插值计算一下
      

  5.   

    见下贴5#
    http://topic.csdn.net/u/20090826/21/b57b0630-48bf-4e19-b14b-b2fd9634eb44.html
      

  6.   

    //三通道的RGB数据rgb_src化为三通道相同值的灰度数据gray_dst for(i=0;i<height;i++)
     for(j=0;j<width;j++)
     {
     gray_dst[3*(i*width+j)+0]=0.299*rgb_src[i*width+j].Red+
                  0.587*rgb_src[i*width+j].Green+
                  0.114*rgb_src[i*width+j].Blue;
     
     
     gray_dst[3*(i*width+j)+1]=0.299*rgb_src[i*width+j].Red+
                  0.587*rgb_src[i*width+j].Green+
                  0.114*rgb_src[i*width+j].Blue;

     gray_dst[3*(i*width+j)+2]=0.299*rgb_src[i*width+j].Red+
                  0.587*rgb_src[i*width+j].Green+
                  0.114*rgb_src[i*width+j].Blue;
     
     }
      

  7.   

    24位真彩色RGB值灰度化为8位的黑白图像
    转换公式为:B*0.114+G*0.587+R*0.299