1

我在网上找到了很多关于使用 ImageMagick 的命令行函数来创建随机噪声图像的文档,但还没有弄清楚如何在 Magick++ 中重现它。

ImageMagick 有 +noise 方法 Random:

convert -size 100x100 xc: +noise Random random.png

我希望能够将像素设置为 Color("random"),例如:

sought.extent(Geometry(640,416), Color("random"), CenterGravity);

将较小的图像嵌入到随机噪声的画布中。当然,随机不是 Color 可接受的参数,但我想知道是否存在等价物?理想的情况是,如果还可以限制颜色范围 - 例如仅 12 位 (#000-#FFF)。

4

1 回答 1

5

该方法Magick::Image::addNoise()是一个很好的起点,但如果你真的想要随机/随机。使用-fx "rand()".

#include <Magick++.h>

int main(int argc, const char ** argv) {

    Magick::InitializeMagick(*argv);
    Magick::Image image("100x100", "gray50");

    image.fx("rand()");
    image.write("noise.jpg");

    return 0;
}

噪音

马克·塞切尔编辑

就像我不喜欢编辑其他人的帖子一样,我想添加一些太大而无法发表评论而不是竞争答案的东西,所以这是我知道的唯一方法。请随意忽略/删除/分离此部分!

如果 OP 想要对应于 12 位值的数字,我在命令行上做了一个小实验,看看我如何强制它:

convert -size 10000x1 xc:gray -fx "(rand*4096)/quantumrange" -depth 16 -compress none pgm:- | sed '1,3d' | tr " " "\n" | sort -n

这会生成一个 1000 像素的图像,并强制输出为未压缩的 PGM 文件,您可以在其中看到值。然后我对它们进行排序以查看生成的最大值是什么,它是 4096。所以,我认为-fx我是建议 ( (rand*4096)/quantumrange) 可能有助于生成 12 位值。

额外更新

对于使用随机颜色映射区域,FX 表达式可能看起来像...

(i<100 & j<480) ? rand() : u

i&j或 x/y 偏移量,并且是u原始图像。一个有趣的选项,但遍历所有像素会很慢。一个更快的选择是创建一个随机的彩色图像实例并用于Magick::Image.composite将图像放在另一个图像之上。

#include <Magick++.h>

using namespace Magick;

int main(int argc, const char ** argv) {
  InitializeMagick(*argv);

  Image wizard("wizard:");
  Image rand_img("100x100", "gray50");
  rand_img.fx("rand()");

  wizard.composite(rand_img, 225, 225);

  wizard.write("wizards_make_magick.png");

  return 0;

}

巫师确实会变魔术

于 2015-06-18T18:48:21.053 回答