在matlab中如何将灰度值为24位的转化为8?

4年前 (2021-04-21)阅读931回复0
无技歌女
无技歌女
  • 管理员
  • 发消息
  • 注册排名139
  • 经验值185
  • 级别管理员
  • 主题37
  • 回复0
楼主

  我使用的是Visual c++6。0技术内幕里提供的类CDib来操作位图,最好提供可以两个独立的函数来分辨别实现着俩个功能。他们可以作为CDib类的成员函数来使用。类似下面的这个就可以,我用了下面的这个,但是下面这个不好用,处理后的图象有许多问题,不能实现灰度化。

此函数实现由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灰度位图的颜色表和实际位图的空间

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;

//构造一个颜色表

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

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

//从位图数据计算得到Y值,写入新图中

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? 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息