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结构(信息头和颜色表),显示的图象是灰白的,我想变成黑白的,请问怎么用,初学不太会调色板的应用.被注释的是我用的调色板代码段,不过图象显示跟没用没区别,大家帮忙解决下.
解决方案 »
- vc2003 环境,如何使DLL总的窗口实现XP风格呢
- 回答问题捡分了
- 高分!!!在线等,关于域验证
- 我想实现这样的功能,就是能获得别的进程中的数据,这具进程中是有一个TDBGrid(Delphi)控件,我想得到它的格子中数据
- 我编了一图书管理系统现在在数据从文本中读去时遇到问题。
- ~一元打操作符怎样使用的,&的功能又怎样的.请各位大侠指点!
- MyCSDN - CSDN论坛库0.5(beta) 可下载CSDN所有贴子~~
- 如何写CDatabase连接SQRSERVER的连接字符串!急!!!
- 多终端编号:通过 ip 还是 网卡地址 来编号 ?
- 对话框的标题怎么改变呀
- 怎样得到CDialog的初始位置和大小?急
- LPCSTR 和 char * 的问题
{
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;
(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,即为黑色。
那么你的图像经过这个处理后就变成黑白的了,
祝你成功~~~
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算子处理没用过调色板
{
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;
}
调色板,按上面初始化,阈值你自己定