我试图在CImg的以下函数中找到 C
C=B*L+(1-B)S
其中C、L、S都是相同大小的RGB图像(而B是单通道灰度蒙版)
我不知道如何循环像素。我见过这样的代码:
cimg_forXYZ(S,x,y,z) {... }
但是我以前从来没有见过这样的语法,它会是一个宏吗?
欢迎任何建议。
我试图在CImg的以下函数中找到 C
C=B*L+(1-B)S
其中C、L、S都是相同大小的RGB图像(而B是单通道灰度蒙版)
我不知道如何循环像素。我见过这样的代码:
cimg_forXYZ(S,x,y,z) {... }
但是我以前从来没有见过这样的语法,它会是一个宏吗?
欢迎任何建议。
如果您查看 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 标题;它很优雅。您将“免费”获得许多功能。