社区
图形处理/算法
帖子详情
如何对图像的色彩数进行转换
mycrazycracy
2009-07-23 12:52:18
讲24位转成256色,有相对简单的方法吗?
讲下原理就行了。以后还要把24位转成32位。
另外怎么看一幅图的是真彩还是伪色彩?通过什么方法查看?
...全文
152
8
打赏
收藏
如何对图像的色彩数进行转换
讲24位转成256色,有相对简单的方法吗? 讲下原理就行了。以后还要把24位转成32位。 另外怎么看一幅图的是真彩还是伪色彩?通过什么方法查看?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mycrazycracy
2009-07-30
打赏
举报
回复
恩,5楼真棒!, opencv学习中。。。谢各位
daxuewuli417
2009-07-29
打赏
举报
回复
用opencv吧。。。方便好用
FlySkyFree
2009-07-29
打赏
举报
回复
学习了
副组长
2009-07-28
打赏
举报
回复
24位转成256色是一个比较复杂的问题,大概思路是将24位真彩色图像统计其累积概率,找出前256种重要颜色,然后将其它256*256*256-256种样色就近归类到重要颜色里面,用这些重要颜色建立一个LUT(Look Up Table)根据它建立自己的调色板。
真彩还是伪色彩可以打开文件看文件头,BMP文件有详细的信息头BITMAPINFOHEADER。
gxsxq
2009-07-28
打赏
举报
回复
数字图像处理 这书上讲有彩色图像处理的,楼主可以自己借来看看
laviewpbt
2009-07-28
打赏
举报
回复
http://www.cnblogs.com/laviewpbt/archive/2009/07/20/1526954.html
真彩色图像转换为16位(高彩色)图像的实现及需要注意的事项。
diannaomingong
2009-07-28
打赏
举报
回复
对每个点SetRGB(x,y,(r/32)*32,(g/32)*32,(b/32)*32);
这样就是512色
aigood
2009-07-28
打赏
举报
回复
直接上代码
void CDdb::SaveAs256(const char *pszDibFileName, int x, int y, int nWidth, int nHeight)
{
ASSERT(pszDibFileName);
if(m_nBitCount <= 8)
{
Save(pszDibFileName, x, y, nWidth, nHeight);
return;
}
//首先进行参数合法性检测
if((x > m_nWidth - 1) || (y > nHeight - 1))
{
AfxMessageBox("Cross the border!");
return;
}
AfxGetApp()->BeginWaitCursor();
//被保存的最后有效宽度和高度:w , h.
LONG w = (LONG)min(nWidth, m_nWidth - x);
LONG h = (LONG)min(nHeight, m_nHeight - y);
//////////////////////////////////////////////////////
//第一步:将数据转化为24位DDB数据
//原DDB数据转换成24位后, 每行的大小和总的数据量
DWORD dwWidthBytes24 = ((w * 24 + 15) / 16) * 2;
DWORD dwBitsSize24 = dwWidthBytes24 * h;
//分配全局内存, 以存放经格式转换后的像素数据
//指向24位数据的指针
BYTE* pbyDdbBits24 = new BYTE[dwBitsSize24];
if(pbyDdbBits24 == NULL) return;
memset(pbyDdbBits24, 0, dwBitsSize24);
//指向24位像素数据的指针, 这些数据是由16, 24, 32位模式转化而来的.
GetDdbDataTo24(x, y, w, h, pbyDdbBits24);
//////////////////////////////////////////////////////
//第二步, 获取量化后的数据
//分配存储8位数据的内存
DWORD dwWidthBytes8 = ((w * 8 + 15) / 16) * 2;
DWORD dwBitsSize8 = dwWidthBytes8 * h;
//指向8位数据的指针
BYTE* pbyDdbBits8 = new BYTE[dwBitsSize8];
if (pbyDdbBits8 == NULL)return ;
memset(pbyDdbBits8, 0 , dwBitsSize8);
//////////////////////////////////////////////////////
//获取量化数据
CPalette* pPalette = new CPalette();
QuantizeColor(pbyDdbBits24, w, h, pbyDdbBits8, pPalette);
//////////////////////////////////////////////////////
//获取调色数据
RGBQUAD* pRGBQuad = new RGBQUAD[256];
if(pRGBQuad == NULL)return;
//初始化为0
memset(pRGBQuad, 0, 256 * sizeof(RGBQUAD));
PALETTEENTRY* pPE = new PALETTEENTRY[256];
if(pPE == NULL)return;
pPalette->GetPaletteEntries(0, 256, pPE);
for(int j = 0; j < 256; j++)
{
pRGBQuad[j].rgbRed = pPE[j].peRed;
pRGBQuad[j].rgbGreen = pPE[j].peGreen;
pRGBQuad[j].rgbBlue = pPE[j].peBlue;
}
delete[] pPE;
delete pPalette;
//////////////////////////////////////////////////////
//第三步, 填充与位图相关的结构
//宽度字节数
DWORD dwDibWidthBytes = ((w * 8 + 31) / 32) * 4;
//位图数据大小
DWORD dwDibBitsSize = dwDibWidthBytes * h;
//计算整个Dib文件的大小dwFileSize
DWORD dwFileSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ 256 * sizeof(RGBQUAD)
+ dwDibBitsSize;
//计算位图信息到位图数据间的偏移量(字节)
DWORD dwOffBits = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ 256 * sizeof(RGBQUAD);
//位图文件头结构和位图信息结构
BITMAPFILEHEADER bmFileHeader;
BITMAPINFOHEADER bmInfo;
//填充BITMAPFILEHEADER结构
bmFileHeader.bfType=0x4d42;
bmFileHeader.bfSize = dwFileSize;
bmFileHeader.bfReserved1 = 0;
bmFileHeader.bfReserved2 = 0;
bmFileHeader.bfOffBits = dwOffBits;
//填充BITMAPINFOHEADER结构
bmInfo.biSize = sizeof(BITMAPINFOHEADER);
bmInfo.biWidth = w;
bmInfo.biHeight = h;
bmInfo.biPlanes = 1;
bmInfo.biBitCount = 8;
bmInfo.biCompression = 0;
bmInfo.biSizeImage = 0;
bmInfo.biXPelsPerMeter = 0;
bmInfo.biYPelsPerMeter = 0;
bmInfo.biClrUsed = 0;
bmInfo.biClrImportant = 0;
//第四步, 写数据
//////////////////////////////////////////////////////
try
{
// 请创建自己的目录或获取当前目录:
CFile file((LPCTSTR )pszDibFileName, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive);
//写入文件头和位图信息
file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER));
file.Write((LPSTR)&bmInfo, sizeof(BITMAPINFOHEADER));
//写入数据
file.Write((LPSTR)pRGBQuad, 256 * sizeof(RGBQUAD));
delete[] pRGBQuad;
pRGBQuad = NULL;
//数据索引(行头)
DWORD dwBaseIndex = (DWORD)(h - 1) * dwWidthBytes8;
UINT nZero = dwDibWidthBytes - dwWidthBytes8;
BYTE abyZero[] = {0, 0};
for(int i = 0; i < h ; i++)
{
BYTE* pDibBits8 = pbyDdbBits8 + dwBaseIndex;
file.Write((LPSTR)pDibBits8, dwWidthBytes8);
if(nZero > 0)file.Write((LPSTR)abyZero, 2);
dwBaseIndex -= dwWidthBytes8;
}//end i
file.Close();
}//end try
catch(CFileException* e)
{
e->Delete();
}
if(pRGBQuad)delete[] pRGBQuad;
delete[] pbyDdbBits24;
delete[] pbyDdbBits8;
AfxGetApp()->EndWaitCursor();
}
matab
图像
专题精讲
课程内容主要包括入门MATLAB
图像
处理
图像
类型
转换
、
图像
处理
图像
的基本操作、MATLAB
图像
处理常用技巧、MATLAB
图像
处理关键技术、整
数
小波S变换对
图像
进行
分解和重构、直线识别拟合角平分线案例、对于模糊和加性噪声的
图像
进行
维纳滤波、对于运动模糊和加性噪声的彩色
图像
进行
维纳滤波和恢复、对于模糊和加性噪声的
图像
进行
约束最小二乘算法滤波和恢复、约束最小二乘算法对彩色模糊和加性噪声
图像
进行
恢复效果实验、Lucy迭代算法对模糊噪声
图像
进行
恢复、Lucy迭代算法对模糊噪声彩色
图像
进行
恢复、通过拉伸实现对比度增强、
图像
锐化实现对比度增强、伪彩色增强实现
图像
增强等。
openCV
图像
色彩
空间
转换
openCV
图像
色彩
空间
转换
Opencv_03
图像
色彩
空间
转换
文章目录一.
色彩
空间介绍① RGB/BGR
色彩
空间② 为什么Opencv中采用的是BGR③ HSV
色彩
空间二.
色彩
空间
转换
③ cvtColor()函
数
原型 一.
色彩
空间介绍 ① RGB/BGR
色彩
空间 计算机
色彩
显示器和彩色电视机显示
色彩
的原理一样,都是采用R,G,B相加混色的原理,通过发射出三种不同强度的电子束,使得屏幕内侧覆盖的红,吕蓝磷光材料发光而产生
色彩
.这种
色彩
的表示方法称为RGB
色彩
空间表示.在RGB颜色空间中,任意色光F都可以用RGB三色不同分量的相加混合而成: F = r[R] +
【个人笔记】02
图像
色彩
空间
转换
02
图像
色彩
空间
转换
【OpenCV 例程300篇】201.
图像
的颜色空间
转换
色彩
空间类型
转换
,是指将
图像
从一个
色彩
空间
转换
到另一个
色彩
空间。例如,在
进行
图像
的特征提取、距离计算时,往往先将
图像
从 RGB
色彩
空间
转换
为灰度
色彩
空间。 函
数
cv.cvtColor() 将
图像
从一个颜色空间
转换
为另一个颜色空间。 函
数
cv.cvtColor 提供了 150 多种颜色空间
转换
类型,本例程可以查询 OpenCV 所支持的颜色
转换
类型。......
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章