魔鬼库:保存灰度图像在三个矩阵而不是一个
DevIL library: save gray scale image in three matrices instead one
我需要制作一个将RGB图像转换为灰度图像并将其保存为PGM格式的程序。我使用DevIL库,但是当我保存图像时,我总是获得灰度的3D图像(3个矩阵),但是,如果我在MATLAB中加载它,我有3个矩阵而不是一个。如何使用DevIL在我的输出文件中获得一个矩阵?
int main()
{
ilInit();
ilEnable(IL_ORIGIN_SET);
ilOriginFunc(IL_ORIGIN_UPPER_LEFT);
ilEnable(IL_FILE_OVERWRITE);
ILuint ImageName; // The image name to return.
ilGenImages(1, &ImageName);
ilBindImage(ImageName);
if(!ilLoadImage("/home/andrea/Scrivania/tests/siftDemoV4/et000.jpg"))
{ printf("err");
exit;
}
else
printf("caricatan");
ILuint width,height;
width = ilGetInteger(IL_IMAGE_WIDTH);
height = ilGetInteger(IL_IMAGE_HEIGHT);
double v[3]={0.2989360212937755001405548682669177651405334472656250000,0.5870430744511212495240215503145009279251098632812500000,0.1140209042551033058465748126764083281159400939941406250};
printf("%.55f %.55f %.55f",v[0],v[1],v[2]);
ILubyte *imgValue=ilGetData();
int i=0;
ILubyte imgNuova[width*height];
while( i < width*height)
{
imgNuova[i]=(char)round( ( (double)imgValue[3*i]*v[0])+ ( (double)imgValue[3*i+1]*v[1])+((double)imgValue[3*i+2]*v[2]));
i++;
}
ILuint ImageName2;
ilGenImages(2, &ImageName2);
ilBindImage(ImageName2);
ilTexImage(width, height, 1, 1, IL_LUMINANCE,
IL_UNSIGNED_BYTE, imgNuova);
iluFlipImage();
ilSave(IL_PNM,"/home/andrea/Scrivania/tests/siftDemoV4/et000new.pgm");
return 0;
}
不幸的是,由于PNM
导出中的错误,无论文件扩展名如何,DevIL都只能写入PPM
(Portable Pixmaps, 3通道RGB)文件。唯一的解决方案是使用不同的文件格式,支持单通道灰度图像,如PNG
。
Matlab应该也能够使用它。如果您绝对需要或想要PGM
格式的文件,则必须使用png2pnm
之类的转换器。
相关文章:
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 如何通过通用引用或std::forward将这三个c++模板函数合并为一个
- 从一个文件读取到三个并行阵列
- 访问三个不同的变量在C++中形成三个不同函数中的一个文件
- 将三个 QGraphicsRectItems 连接到一个对象中
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- 创建一个程序,要求用户输入两个数字,并有三个可能的答案.代码未编译.数字(作为int)
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 如何从另一个函数中访问一个功能,从C 中的第三个访问
- 将三个文本文件组合成一个文本文件,形成一个句子C++
- Boost Spirit Parser用三个字符串的矢量编译成一个结构,自适应不工作
- 编译三个文件以创建一个用于平均值的程序(取消注释?)
- 在OpenGL中为顶点、uvs和法线使用一个缓冲区是否比使用三个缓冲区性能更好
- 三个整数组成一个带空格的字符串;
- 如何按第一个,然后是第二个,然后是第三个对 2d 数组进行排序,..使用 C++ 的列
- 将动态数组的三个元素复制到另一个元素中
- 调用接受三个参数的函数出现问题,其中一个是 int const
- C++ 如何从一个整数值中获取三个单独的日期值(日、月、年)
- 找到两个阵列中最大的一个并存储 iN 第三个阵列