2009-08-21 60 views
1

我试图找到下在下面的函数在CImg乘法并用CIMG添加图像在C++

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

当C,L和S是所有相同大小的RGB图像(并且B是单通道灰度遮罩)

我无法弄清楚如何遍历像素。我见过这样的代码:

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

但是我从来没有看过以前的语法类型,它可能是一个宏吗?

欢迎任何建议。

回答

4

如果你看看CIMG头,你会看到那个代码是,事实上,的thunk分解成宏:

#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标题;它很优雅。您将免费获得许多功能。

+0

谢谢,这解决了一些事情。仍然我似乎得到不正确/不一致的结果..嗯,也许我应该发表另一个问题 – zenna 2009-08-21 20:00:30

+0

由于位深度问题可能会发生不正确或不一致的结果。例如,乘法可能很容易对浮游图像以外的任何东西做出奇怪和不好的事情(例如,如果不小心,字节图像会很容易溢出)。 – mmr 2009-08-24 15:37:06