在matlab中如何將灰度值為24位的轉化為8?

4年前 (2021-04-21)閱讀927回復0
無(wú)技歌女
無(wú)技歌女
  • 管理員
  • 發(fā)消息
  • 注冊排名139
  • 經(jīng)驗值185
  • 級別管理員
  • 主題37
  • 回復0
樓主

??我使用的是Visual c++6。0技術(shù)內幕里提供的類(lèi)CDib來(lái)操作位圖,最好提供可以?xún)蓚€(gè)獨立的函數來(lái)分辨別實(shí)現著(zhù)倆個(gè)功能。他們可以作為CDib類(lèi)的成員函數來(lái)使用。類(lèi)似下面的這個(gè)就可以,我用了下面的這個(gè),但是下面這個(gè)不好用,處理后的圖象有許多問(wèn)題,不能實(shí)現灰度化。

此函數實(shí)現由24位的bmp到256色灰度圖的轉換

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;//修改數據成員

m_lpBMIH->biBitCount=8;

DWORD RowLength=4*(((m_lpBMIH->biWidth)*(m_lpBMIH->biBitCount)+31)/32);

m_dwSizeImage=RowLength*(m_lpBMIH->biHeight);

//分配一段保存256灰度位圖的顏色表和實(shí)際位圖的空間

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è)顏色表

for(int i=0;ibiHeight;j++)

for (long k=0;kbiWidth;k++)

//從位圖數據計算得到Y值,寫(xiě)入新圖中

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;

0
0
收藏0
回帖

在matlab中如何將灰度值為24位的轉化為8? 期待您的回復!

取消
載入表情清單……
載入顏色清單……
插入網(wǎng)絡(luò )圖片

取消確定

圖片上傳中
編輯器信息
提示信息