相当于 Magick++ 中的随机噪声
equivalent of random noise in Magick++
我在网上找到了很多关于使用 ImageMagick 的命令行函数创建随机噪声图像的文档,但一直无法弄清楚如何在 Magick++ 中重现它。
ImageMagick 有 +noise 方法 Random:
convert -size 100x100 xc: +noise Random random.png
我希望能够将像素设置为颜色("random"),例如:
sought.extent(Geometry(640,416), Color("random"), CenterGravity);
在 canvas 随机噪声中嵌入较小的图像。当然,对于 Color,随机不是可接受的参数,但我想知道是否存在等效项?理想的情况是,如果还可以限制颜色范围——例如仅 12 位 (#000-#FFF)。
方法 Magick::Image::addNoise()
是一个很好的起点,但如果您真的想要 random/random。使用 -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;
}
由 Mark Setchell 编辑
虽然我不喜欢编辑其他人的帖子,但我想添加一些内容太大而无法发表评论的内容,而不是竞争性答案,所以这是我知道的唯一方法。请从这部分开始ignore/delete/dissociate!
如果 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;
}
我在网上找到了很多关于使用 ImageMagick 的命令行函数创建随机噪声图像的文档,但一直无法弄清楚如何在 Magick++ 中重现它。
ImageMagick 有 +noise 方法 Random:
convert -size 100x100 xc: +noise Random random.png
我希望能够将像素设置为颜色("random"),例如:
sought.extent(Geometry(640,416), Color("random"), CenterGravity);
在 canvas 随机噪声中嵌入较小的图像。当然,对于 Color,随机不是可接受的参数,但我想知道是否存在等效项?理想的情况是,如果还可以限制颜色范围——例如仅 12 位 (#000-#FFF)。
方法 Magick::Image::addNoise()
是一个很好的起点,但如果您真的想要 random/random。使用 -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;
}
由 Mark Setchell 编辑
虽然我不喜欢编辑其他人的帖子,但我想添加一些内容太大而无法发表评论的内容,而不是竞争性答案,所以这是我知道的唯一方法。请从这部分开始ignore/delete/dissociate!
如果 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;
}