0

我有一个带有不规则形状对象轮廓的 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)

有谁知道更优雅的解决方案?感谢您的任何指导。

4

1 回答 1

0

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

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

您可以做得更好: ruby​​-vips has #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"

使这个:

在此处输入图像描述

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

于 2018-07-19T22:05:34.620 回答