【问题标题】:equivalent of random noise in Magick++相当于 Magick++ 中的随机噪声
【发布时间】:2015-06-18 15:12:00
【问题描述】:

我在网上找到了很多关于使用 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),则理想情况是。

【问题讨论】:

    标签: c++ image random imagemagick magick++


    【解决方案1】:

    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;
    
    }
    

    【讨论】:

    • 谢谢,这正是我想要的。是否可以使用这些函数中的任何一个来随机化画布的一部分,还是我需要创建更小的图像并覆盖它们?
    • @Mark Setchell,已将答案标记为社区,请随时将您的发现重新加工成更“答案”驱动的响应(竖起大拇指)
    • @JonathanBasile “画布的一部分”是什么意思。就像随机交换图像区域内的像素一样?
    • 例如,假设我有一个 640 x 480 的画布,想要从左上角开始填充一个 100 像素宽和 480 高的区域,使用随机颜色。
    • 谢谢你,马克 - 我刚刚注意到你的补充。我一定会好好利用的。
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多