matlab 16位灰度值转8位,在matlab中如何将灰度值为24位的转化为8?
我使用的是Visual c++6。0技術(shù)內(nèi)幕里提供的類CDib來操作位圖,最好提供可以兩個獨立的函數(shù)來分辨別實現(xiàn)著倆個功能。他們可以作為CDib類的成員函數(shù)來使用。類似下面的這個就可以,我用了下面的這個,但是下面這個不好用,處理后的圖象有許多問題,不能實現(xiàn)灰度化。
/*
此函數(shù)實現(xiàn)由24位的bmp到256色灰度圖的轉(zhuǎn)換
*/
CDib& CDib::RgbToGray()
{
//判斷dibFile是有效的24位真彩色位圖
if(m_lpBMIH->biBitCount==24 && m_nColorTableEntries==0 && m_lpBMIH->biCompression==BI_RGB)//是真彩色位圖
{//先只處理擴展的Windows DIB
if((m_lpBMIH)->biSize==40){
m_nColorTableEntries=256;//修改數(shù)據(jù)成員
m_lpBMIH->biBitCount=8;
DWORD RowLength=4*(((m_lpBMIH->biWidth)*(m_lpBMIH->biBitCount)+31)/32);
m_dwSizeImage=RowLength*(m_lpBMIH->biHeight);
//分配一段保存256灰度位圖的顏色表和實際位圖的空間
DWORD NewBufSize=(DWORD)(256*sizeof(RGBQUAD)+RowLength*(m_lpBMIH->biHeight));
HGLOBAL hNewPalette=::GlobalAlloc(GHND,NewBufSize);
LPVOID lpvNewColorTable=::GlobalLock(hNewPalette);
LPBYTE lpNewImage=(LPBYTE)lpvNewColorTable+256*sizeof(RGBQUAD);
LPRGBQUAD lpvColorTable=(LPRGBQUAD)lpvNewColorTable;
//構(gòu)造一個顏色表
for(int i=0;ibiHeight;j++)
{
for (long k=0;kbiWidth;k++)
{
//從位圖數(shù)據(jù)計算得到Y(jié)值,寫入新圖中
Blue=(unsigned char)(*lpOldImage++);
Green=(unsigned char)(*lpOldImage++);
Red=(unsigned char)(*lpOldImage++);
Y=(float)(Red*0。
299+Green*0。587+Blue*0。
114);
Gray=(BYTE)Y;
*(lpNewImage++)=Gray;
}
}
memcpy(m_lpImage,lpvNewColorTable,NewBufSize);
m_lpvColorTable=m_lpImage;
m_lpImage=(LPBYTE)m_lpvColorTable+256*sizeof(RGBQUAD);
::GlobalUnlock(hNewPalette);
::GlobalFree(hNewPalette);
}
else
{
AfxMessageBox("不是擴展的windows位圖");
}
}
else
{
AfxMessageBox("不是有效的真彩色位圖!");
}
MakePalette();
return *this;
}。
全部
總結(jié)
以上是生活随笔為你收集整理的matlab 16位灰度值转8位,在matlab中如何将灰度值为24位的转化为8?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 增长量计算n+1原则_我是如何快速做资料
- 下一篇: 学计算机学体育生闺女,古力:生个女儿一定