【发布时间】:2009-08-21 17:10:32
【问题描述】:
我试图在CImg的以下函数中找到C
C=B*L+(1-B)S
其中C、L和S都是相同大小的RGB图像(B是单通道灰度蒙版)
我不知道如何循环像素。我见过这样的代码:
cimg_forXYZ(S,x,y,z) {... }
但我以前从未见过这种语法,它会是一个宏吗?
欢迎提出任何建议。
【问题讨论】:
标签: c++ templates image-processing macros cimg
我试图在CImg的以下函数中找到C
C=B*L+(1-B)S
其中C、L和S都是相同大小的RGB图像(B是单通道灰度蒙版)
我不知道如何循环像素。我见过这样的代码:
cimg_forXYZ(S,x,y,z) {... }
但我以前从未见过这种语法,它会是一个宏吗?
欢迎提出任何建议。
【问题讨论】:
标签: c++ templates image-processing macros cimg
如果您查看 CImg 标头,您会发现该代码实际上是一个宏,可以分解为:
#define cimg_forXY(img,x,y) cimg_forY(img,y) cimg_forX(img,x)
#define cimg_forX(img,x) for (int x=0; x<(int)((img).width); ++x)
#define cimg_forY(img,y) for (int y=0; y<(int)((img).height); ++y)
#define cimg_forZ(img,z) for (int z=0; z<(int)((img).depth); ++z)
#define cimg_forXYZ(img,x,y,z) cimg_forZ(img,z) cimg_forXY(img,x,y)
这意味着您将有以下循环:
for (int z=0; z<(int)((img).depth); ++z)
for (int y=0; y<(int)((img).height); ++y)
for (int x=0; x<(int)((img).width); ++x) {
}
所以,现在,您可能想要做的是引用 x、y 和 z 坐标,或者更好的是,在您逐步执行时引用指向数据的指针,例如
cimg_library::CImg<float> image;
//assign, etc
float* ptr = image->ptr();
cimg_forXYZ(S, x, y, z){
*ptr = *ptr + 10;
++ptr;
}
我鼓励您阅读 CImg 标头;它很优雅。您将“免费”获得许多功能。
【讨论】: