社区
图形处理/算法
帖子详情
将彩色图变为灰度图。谢谢。
mmtang3
2003-03-20 09:45:49
一个256色的bmp,要将其变为灰度图。
图像中每一个像素应该是在调色板中索引值(不知是不是)
要灰度化的话,必须先取出基R,G,B分量,再乘以一定的系数才行,是吗?
如果是,只能在调色板中得到是吗?
如果得到灰度后,是不是得从新创建一个新的调色板呢?谢谢。
是不是只要在调色板中修改颜色即可?
希望大家指点。
...全文
322
14
打赏
收藏
将彩色图变为灰度图。谢谢。
一个256色的bmp,要将其变为灰度图。 图像中每一个像素应该是在调色板中索引值(不知是不是) 要灰度化的话,必须先取出基R,G,B分量,再乘以一定的系数才行,是吗? 如果是,只能在调色板中得到是吗? 如果得到灰度后,是不是得从新创建一个新的调色板呢?谢谢。 是不是只要在调色板中修改颜色即可? 希望大家指点。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
关注!!!
灰度
图
转化为
彩色
图
像(MATLAB实现)
在
图
像处理领域,
灰度
图
和
彩色
图
像各有其特点和应用。
灰度
图
像通常只包含一个亮度通道,每个像素只有一个值表示亮度,而
彩色
图
像则包含三个或更多通道,如红绿蓝(RGB)三原色,每个颜色通道都有一个值来决定像素的...
将
彩色
图
片变成
灰度
图
将
彩色
图
片变成
灰度
图
labview将RGB
图
像转为
灰度
图
像
用于处理labview二值化
图
像的颜色,是二值化的
图
像从红黑
变为
黑白
灰度转
彩色
灰度
图
转
彩色
图
是将
灰度
图
像转换为
彩色
图
像的过程。在计算机视觉和
图
像处理领域中,这是一个非常重要的技术。
灰度
图
像是一种单通道
图
像,只包含灰度信息,而
彩色
图
像则包含红、绿、蓝三个颜色通道的信息。 Matlab是...
Java将
彩色
图
像转换为
灰度
图
Java将
彩色
图
像转换为
灰度
图
,本程序利用缓冲区
图
像实例了
图
像的灰化处理,效果如上
图
所示,当单击“Gray Image”按钮后,显示了灰化处理后的
图
像;当再单击“Reset”按钮后,显示源
图
像。具体来说是利用java.awt....
图形处理/算法
19,471
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章