【问题标题】:Multiplying and adding images with CImg In C++在 C++ 中使用 CImg 相乘和相加图像
【发布时间】:2009-08-21 17:10:32
【问题描述】:

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

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

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

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

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

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

欢迎提出任何建议。

【问题讨论】:

    标签: c++ templates image-processing macros cimg


    【解决方案1】:

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

    【讨论】:

    • 谢谢,解决了一些问题。仍然我似乎得到不正确/不一致的结果.. 嗯也许我应该发布另一个问题
    • 不正确或不一致的结果可能会由于位深度问题而发生。例如,除了浮动图像之外,乘法很容易对您造成奇怪和不好的事情(即,如果您不小心,字节图像很容易溢出)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多