在 C++ 中使用 CImg 相乘和相加图像

发布于 2024-08-02 18:04:29 字数 293 浏览 3 评论 0原文

中的以下函数中找到 C,

我试图在 CImg C=B*L+(1-B)S

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

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

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

但我以前从未见过这种语法,它可能是一个宏吗?

欢迎任何建议。

I am trying to find C in the following function in CImg

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

Where C, L and S are all RGB images of the same size (and B is a single channel grayscale matte)

I cannot figure out how to loop over the pixels. I've seen code like:

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

But I have never see than kind of syntax before, could it be a macro?

Any suggestions are welcome.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凉月流沐 2024-08-09 18:04:29

如果你查看 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 标头一样;非常优雅。您将“免费”获得很多功能。

If you look into the CImg header, you'll see that that code is, in fact, a macro that thunks down into:

#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)

Which means that you will have the following loops:

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) {

}

So, now, what you probably want to do is reference either the x, y, and z coordinates, or better, the pointer into the data as you step through, like

cimg_library::CImg<float> image;
//assign, etc
float* ptr = image->ptr();
cimg_forXYZ(S, x, y, z){
    *ptr = *ptr + 10;
    ++ptr;
}

I encourage you to read the CImg header; it's quite elegant. You'll get a lot of functionality 'for free'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文