typedef  struct  
{  
BITMAPINFO bmi;  
RGBQUAD pal[255];  
} GRAYBMI; ExtractCannyEdgeHist(pGrayData, bm.bmWidth, bm.bmHeight, TRUE);//canny算子处理/************************************************************************
      // 指向逻辑调色板的指针
LPLOGPALETTE lpPal;
// 逻辑调色板的句柄
HANDLE hLogPal;
BOOL bResult = FALSE;
CPalette * pPal = new CPalette;

DWORD dwNumColors;
switch(bmi.bmi.bmiHeader.biBitCount)
{
case 1:
dwNumColors = 2; break;
case 4:
dwNumColors = 16; break;
case 8:
dwNumColors = 256; break;
case 16:
dwNumColors =65536; break;
default:
dwNumColors = 0;
}
if(dwNumColors != 0)
{
hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
+ sizeof(PALETTEENTRY)
* dwNumColors);
if(hLogPal == NULL)
{
AfxMessageBox("内存不足! ");
return;
}
lpPal = (LPLOGPALETTE)::GlobalLock((HGLOBAL)hLogPal);
// 设置版本号
lpPal->palVersion = 0x300;
// 设置颜色数目
lpPal->palNumEntries = (WORD)dwNumColors;
        
for(i=0;i<(signed)dwNumColors;i++)
{
lpPal->palPalEntry[i].peRed = bmi.bmi.bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen = bmi.bmi.bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue = bmi.bmi.bmiColors[i].rgbBlue;
lpPal->palPalEntry[i].peFlags = 0;                       //保留位
}
// 按照逻辑调色板创建调色板,并返回指针
bResult = pPal->CreatePalette(lpPal);

::GlobalUnlock((HGLOBAL) hLogPal);
::GlobalFree((HGLOBAL) hLogPal);
}
**************************************************************************/ CStatic *pStatic = (CStatic*)AfxGetMainWnd()->GetDlgItem(IDC_VIDEOANNY);  
CDC *pDC = pStatic->GetDC();

CRect rect; 
pStatic->GetClientRect(&rect);  //pDC->SelectPalette(pPal,FALSE);
//pDC->RealizePalette();

SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR); 
StretchDIBits(pDC->GetSafeHdc(),0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(),
rect.Height(), pGrayData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCCOPY);  pStatic->ReleaseDC(pDC);
上面显示的是灰度图象经过canny算子处理后的图象,pGrayData为数据,bmi结构(信息头和颜色表),显示的图象是灰白的,我想变成黑白的,请问怎么用,初学不太会调色板的应用.被注释的是我用的调色板代码段,不过图象显示跟没用没区别,大家帮忙解决下.

解决方案 »

  1.   

    for(i=0;i <(signed)dwNumColors;i++) 

    lpPal->palPalEntry[i].peRed = bmi.bmi.bmiColors[i].rgbRed; 
    lpPal->palPalEntry[i].peGreen = bmi.bmi.bmiColors[i].rgbGreen; 
    lpPal->palPalEntry[i].peBlue = bmi.bmi.bmiColors[i].rgbBlue; 
    lpPal->palPalEntry[i].peFlags = 0;                      //保留位 

    修改上面的代码,根据你的分界点阈值,设定 lpPal->palPalEntry[i].peRed  = lpPal->palPalEntry[i].peGreen = lpPal->palPalEntry[i].peBlue = 0;或者 
     
    lpPal->palPalEntry[i].peRed  = lpPal->palPalEntry[i].peGreen = lpPal->palPalEntry[i].peBlue = 255;
      

  2.   

    你可以经图像二值化处理,处理方法网上很多的,自己可以设置阈值,或者用自适应求取阈值方法也行,比如otsu算法就比较常用:
    (1)根据图像的灰度直方图选择阈值的初值为T ; 
    (2)利用阈值T将图像分割成两个区域R1和R2 ; 
    (3)分别计算出区域R1和R2 的均值u1和u2 ; 
    (4)求出新的阈值T=(u1+u2)/2 ; 
    (5)重复(2)~(4),直到均值u1和u2恒定不变,这时所得到的T 就是二值化处理所需求的阈值。
    求得阈值T后可以用T将图像的数据分成两部分:灰度大于或等于阈值的像素其灰度值为255,即为白色,否则这些像素点灰度值被设置为0,即为黑色。
    那么你的图像经过这个处理后就变成黑白的了,
    祝你成功~~~
      

  3.   

    1楼的我试过了,没改变,不过我显示图象没用调色板的,只是canny算子后是白灰图象,线条是白的,其他是灰的,我想把不是线条的变成黑的,我下过一个程序做参考,好象它显示的没有经图像二值化处理,我跟踪和查找了他图像二值化的程序,没有用,不知怎么的直接变黑白色的
      

  4.   

    汗,只在24图转灰度的时候用了这个,pal对应的是上面的结构体
         for(i=0; i<256; i++)     
    {     
       bmi.pal[i].rgbBlue=(unsigned char)i;   
      bmi.pal[i].rgbGreen=(unsigned char)i;   
      bmi.pal[i].rgbRed=(unsigned char)i;   
      bmi.pal[i].rgbReserved=0;   
    } ilovedrv ,这样的结构体里的算调色板吗?如果不算,那我从24位转8位灰度的后再anny算子处理没用过调色板
      

  5.   

    ilovedrv 大哥,看了我的回复后给个思路什么的,要下班了,可能不能及时回帖了
      

  6.   

    显示窗口的,就是你要输出二值图像的那个窗口threshold = 100;for(i=0; i <threshold ; i++)    
    {    
      bmi.pal[i].rgbBlue=0 ;  
      bmi.pal[i].rgbGreen=0;  
      bmi.pal[i].rgbRed=0;  
      bmi.pal[i].rgbReserved=0;  
    } for(i=threshold ; i <256; i++)    
    {    
      bmi.pal[i].rgbBlue=255 ;  
      bmi.pal[i].rgbGreen=255;  
      bmi.pal[i].rgbRed=255;  
      bmi.pal[i].rgbReserved=0;  

    调色板,按上面初始化,阈值你自己定
      

  7.   

    我是将24位图转灰度后进行canny算子运算,最后处理出来的效果就是一个白色线条和灰色的图象,线条都是那些比如说人的大概线条衣服啊那样的, 我想把灰色的那个变黑色,数据应该没问题,我想应该是调色板我没弄好,应该算单色吧,如果单色应该怎么设置调色板呢?
      

  8.   

    阈值?这个是指调色板0~255种颜色我来确定黑白的临界吗 比如你上面的threshold ?