相当于Magick ++中的随机噪声

Jon*_*ile 1 c++ random image imagemagick magick++

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

ImageMagick有+噪音方法随机:

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

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

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

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

emc*_*lle 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;
}
Run Code Online (Sandbox Code Playgroud)

噪声

由Mark Setchell编辑

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

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

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

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

其他更新

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

(i<100 & j<480) ? rand() : u
Run Code Online (Sandbox Code Playgroud)

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;

}
Run Code Online (Sandbox Code Playgroud)

巫师确实做了魔法