1
我试图找到下在下面的函数在CImg乘法并用CIMG添加图像在C++
C = B * L +(1-B)S
当C,L和S是所有相同大小的RGB图像(并且B是单通道灰度遮罩)
我无法弄清楚如何遍历像素。我见过这样的代码:
cimg_forXYZ(S,x,y,z) {... }
但是我从来没有看过以前的语法类型,它可能是一个宏吗?
欢迎任何建议。
我试图找到下在下面的函数在CImg乘法并用CIMG添加图像在C++
C = B * L +(1-B)S
当C,L和S是所有相同大小的RGB图像(并且B是单通道灰度遮罩)
我无法弄清楚如何遍历像素。我见过这样的代码:
cimg_forXYZ(S,x,y,z) {... }
但是我从来没有看过以前的语法类型,它可能是一个宏吗?
欢迎任何建议。
如果你看看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标题;它很优雅。您将免费获得许多功能。
谢谢,这解决了一些事情。仍然我似乎得到不正确/不一致的结果..嗯,也许我应该发表另一个问题 – zenna 2009-08-21 20:00:30
由于位深度问题可能会发生不正确或不一致的结果。例如,乘法可能很容易对浮游图像以外的任何东西做出奇怪和不好的事情(例如,如果不小心,字节图像会很容易溢出)。 – mmr 2009-08-24 15:37:06