【问题标题】:How to achieve a BW negative in ruby-vips如何在 ruby​​-vips 中实现 BW 负值
【发布时间】:2018-07-19 20:00:10
【问题描述】:

我有一个带有不规则形状对象轮廓的 png,我想将其变成蒙版。我需要用黑色填充内部,然后交换黑色和白色。它是 8 位灰度,只有 0 和 255 的值。

我不能填充外部,而让内部保持白色,因为轮廓本身必须包含在正区域中。 (假设已经定义了黑色、白色和红色的数组值。)

    mask =  Vips::Image.new_from_file(fl)
    mask = mask.draw_flood(black, center_x, center_y, :equal => true) * -1

这将返回全黑光栅。嘘!这可行,但丑陋且效率低下。

    mask = mask.draw_flood(black, center_x, center_y, :equal => true)
    mask = mask.draw_flood(red, 0, 0, :equal => true)
    mask = mask.draw_flood(white, center_x, center_y, :equal => true)
    mask = mask.draw_flood(black, 0, 0, :equal => true)

有人知道更优雅的解决方案吗?感谢您的指导。

【问题讨论】:

    标签: ruby vips


    【解决方案1】:

    你明白了,是 * -1 搞砸了你。这将制作每个像素 * -1 的浮动图像(显然),因此您的白色区域将变为 -255。当您再次保存为 PNG 时,图像将被转换回 uint8,底片将被切掉,您只会看到零。

    你确实想要255 - x,但是Ruby不会让你在二进制图像运算符的左边有一个数字,所以你需要写x * -1 + 255

    你可以做得更好:ruby-vips 有#invert,它计算 (image-format-max - image-pixel) 并且不改变数字格式。在这种情况下,这意味着 (255 - x) 并保持为 uint8。

    所以这个:

    x = Vips::Image.new_from_file "flood1.png"
    x = x.draw_flood 0, 256, 256, equal: true
    x = x.invert
    x.write_to_file "x.png"
    

    做这个:

    (边缘都是扭曲的——你的例子在我得到它的时候已经消除了锯齿,抱歉)

    【讨论】:

    • 非常感谢,user894763!这就像一个魅力。在这个项目中,我使用了 convert、Imagemagick、rmagick、vips 和 java,包括 raw 和 Graph2D。直到两周前,我对它们中的任何一个都一无所知,而且需要阅读大量文档。很多的挑选和选择,就像一个自助餐厅。如果他们的栅格类可以互操作,那不是很好吗?
    • 哇,这真是一大堆软件。 libvips 是最好的,显然,呵呵。我做医学成像,而且这些软件包通常甚至不能在文件格式级别进行互操作:( DICOM 的风格与扫描仪制造商一样多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2010-09-09
    相关资源
    最近更新 更多