1

我试图在CImg的以下函数中找到 C

C=B*L+(1-B)S

其中C、L、S都是相同大小的RGB图像(而B是单通道灰度蒙版)

我不知道如何循环像素。我见过这样的代码:

cimg_forXYZ(S,x,y,z) {... }

但是我以前从来没有见过这样的语法,它会是一个宏吗?

欢迎任何建议。

4

1 回答 1

4

如果您查看 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 标题;它很优雅。您将“免费”获得许多功能。

于 2009-08-21T17:17:04.963 回答