将彩色图变为灰度图。谢谢。

mmtang3 2003-03-20 09:45:49
一个256色的bmp,要将其变为灰度图。
图像中每一个像素应该是在调色板中索引值(不知是不是)
要灰度化的话,必须先取出基R,G,B分量,再乘以一定的系数才行,是吗?
如果是,只能在调色板中得到是吗?
如果得到灰度后,是不是得从新创建一个新的调色板呢?谢谢。
是不是只要在调色板中修改颜色即可?
希望大家指点。
...全文
318 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bit_blue_wind 2003-03-22
  • 打赏
  • 举报
回复
我的是VF_RGB16_DITHERED的,就是R5,G6,B5,dithered的。
gbstar2021 2003-03-22
  • 打赏
  • 举报
回复
16 位的图像个是比较复杂, 有 rgb565 和 rgb555

要具体判断
bit_blue_wind 2003-03-22
  • 打赏
  • 举报
回复
可以说的具体一点吗?
wuxq 2003-03-22
  • 打赏
  • 举报
回复
To Bit_Blue_Wind(在水一方):
r,g,b各5bit,需要左移3位为8bit。
bit_blue_wind 2003-03-22
  • 打赏
  • 举报
回复
unsigned long mm=0;
for(unsigned long i=0;i<m_Height * m_Width;i+=1)
{
int r,g,b;
BYTE target;
WORD source=*(VideoBuffer+i);
r=(source&0xf800)>>11;
g=(source&0x07e0)>>5;
b=source&0x001f;
target = ceil(0.30 * r + 0.59 * g + 0.11 * b);
mm += 1;
*(BmpBuffer + mm) = target;//RGB(target,target,target);
}
以上是我的将16位的彩色图象转化位8位灰度图象的程序,为什么转化出来的图象很暗呢?希望大家指教!
gbstar2021 2003-03-21
  • 打赏
  • 举报
回复
修改调色版中的颜色,(两种不同的计算灰度值的算法)

r=g=b=(r+g+b)/3 或者 r=g=b=(0.30r+0.59g+0.11b)


goldenfaith 2003-03-21
  • 打赏
  • 举报
回复
对于24会真彩色图像,因为没有调色板,所以要自己建立调色板,然后写数据区0.30r+0.59g+0.11b
binbin 2003-03-21
  • 打赏
  • 举报
回复
对于真彩图,还需要建立调色板吗?直接对每个象素做r=g=b=(r+b+g)/3
wuchuncai 2003-03-21
  • 打赏
  • 举报
回复
1.根据每个点的值,查找到调色板,算好各点的灰度值(0.30r+0.59g+0.11b)
2.调整调色板,使之为(0,0,0),(1,1,1)...(255,255,255)。
wrcluomo 2003-03-21
  • 打赏
  • 举报
回复
//(14)各色位图转换成8位灰度图$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void defLianBiao::TurnToGrey(LPSTR lpDib)
{

LPSTR lpNewDIBBits;// 指向DIB灰度图图像开始处象素的指针
unsigned char * ired;
unsigned char * igreen;
unsigned char * iblack;
long i,j;// 循环变量
unsigned char * lpdest;
//lpdest=(unsigned char *)::malloc(lHeight*lWidth);
lpdest= new unsigned char [lHeight*lWidth];
int n=0;
int PictureBits;
PictureBits=DIBBits(lpDib)/8;
if (PictureBits==0)//||PictureBits<=1)//不处理非整数字节的图像格式
{
AfxMessageBox("不支持该图像的数据格式");
return;
}
RGBQUAD *lpRGBquad;
lpRGBquad=(RGBQUAD *)&lpDib[sizeof(BITMAPINFOHEADER)];//位图信息头后面为调色板
unsigned char* lpSrc;
n=0;
if(PictureBits==1)//256色彩色位图
for(j=0;j<lHeight;j++)
for(i=0;i<lWidth;i++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * j + i;
ired= &lpRGBquad[*lpSrc].rgbRed;
igreen =& lpRGBquad[*lpSrc].rgbGreen;
iblack = &lpRGBquad[*lpSrc].rgbBlue;
lpdest[n] =(unsigned char)(0.299*(*ired)+0.587*(*igreen)+0.114*(*iblack));
n++;
}
else//24/32位彩色位图
{

lLineBytes=WIDTHBYTES(lWidth * 8*PictureBits);
for (j=0;j<lHeight;j++)
for(i=0,n=0;i<PictureBits*lWidth;i+=PictureBits,n++)
{

ired= (unsigned char*)lpDIBBits + lLineBytes *j+i+2;
igreen = (unsigned char*)lpDIBBits+lLineBytes *j+i+1;
iblack = (unsigned char*)lpDIBBits +lLineBytes *j+i;
lpdest[j*lWidth+n] =(unsigned char)(0.299*(*ired)+0.587*(*igreen)+0.114*(*iblack));

}
}
LPBITMAPINFOHEADER lpBI;//位图信息头
// 读取BITMAPINFO结构,初始化指针
lpBI = (LPBITMAPINFOHEADER)lpDib;//[sizeof(BITMAPFILEHEADER)];
lpBI->biBitCount=8;
//设置256色灰度调色板
for (i = 0; i < 256; i++)
{
lpRGBquad[i].rgbRed =(unsigned char)i;// 读取红色分量
lpRGBquad[i].rgbGreen =(unsigned char)i;// 读取绿色分量
lpRGBquad[i].rgbBlue = (unsigned char)i;// 读取红色分量
lpRGBquad[i].rgbReserved = 0;// 保留位
}
lpNewDIBBits= ::FindDIBBits(lpDib);// 找到DIB图像象素起始位置
lLineBytes=WIDTHBYTES(lWidth * 8);
for(j=0;j<lHeight;j++)
for(i=0;i<lWidth;i++)
{


lpSrc=(unsigned char*)lpNewDIBBits+lLineBytes*j+i;
*lpSrc=lpdest[j*lWidth+i];
}
//::free((void *)lpdest);
delete lpdest;
}
//(14)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ilikestrawberry 2003-03-21
  • 打赏
  • 举报
回复
下面介绍的算法能够比较好地实现真彩图到256色图的转换。它的思想是:准备一个长度为4096的数组,代表4096种颜色。对图中的每一个象素,取R、G、B的最高四位,拼成一个12位的整数,对应的数组元素加1。全部统计完后,就得到了这4096种颜色的使用频率。其中,可能有一些颜色一次也没用到,即对应的数组元素为零(假设不为零的数组元素共有PalCounts个)。将这些为零的数组元素清除出去,使得前PalCounts个元素都不为零。将这PalCounts个数按从大到小的顺序排列(这里我们使用起泡排序)。这样,前256种颜色就是用的最多的颜色,它们将作为调色板上的256种颜色。对于剩下的PalCounts-256种颜色并不是简单地丢弃,而是用前256种颜色中的一种来代替,代替的原则是找有最小平方误差的那个。再次对图中的每一个象素,取R、G、B的最高四位,拼成一个12位的整数,如果对应值在前256种颜色中,则直接将该索引值填入位图数据中,如果是在后PalCounts-256种颜色中,则用代替色的索引值填入位图数据中。
用户 昵称 2003-03-21
  • 打赏
  • 举报
回复
LPBYTE lpGrayBit=(LPBYTE)lpGray;
if(IS_WIN30_DIB(lpBit))
{
lpGrayBit+=pHeader->biSize+256*sizeof(RGBQUAD);//将指针移到新建的灰度图像的数据区
lpBit+=sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);//这个移到原来图像的数据区
}
else
{
lpGrayBit+=pHeader->biSize+256*sizeof(RGBTRIPLE);
lpBit+=sizeof(BITMAPINFOHEADER)+256*sizeof(RGBTRIPLE);
}
int nCountBit=pHeader->biBitCount;

if(nCountBit>8)//if biBitCount great eight then translate
{
int nRGB=(nWide*nCountBit+31)/32*4-nWide*nCountBit/8;
int nGrey=(nWide*8+31)/32*4-nWide;
for(i=0;i<nHeight;i++)
{
for(j=0;j<nWide;j++)
*lpGrayBit++=(*lpBit++)*0.299+(*lpBit++)*0.587+(*lpBit++)*0.114;
lpGrayBit+=nGrey;
lpBit+=nRGB;
}
::GlobalUnlock((HGLOBAL)hDib);
::GlobalFree((HGLOBAL)hDib);
hDib = hGreyDIB;
::GlobalUnlock((HGLOBAL)hGreyDIB);
}

注意调色板
qing_li73 2003-03-21
  • 打赏
  • 举报
回复
u can do the projection yourself, anyway, it must have a loss of expression
SatanLi1982 2003-03-20
  • 打赏
  • 举报
回复
关注!!!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧