Как добиться негатива BW в ruby-vips

У меня есть 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)

Кто-нибудь знает более элегантное решение? Спасибо за любое руководство.


person Robert Schaaf    schedule 19.07.2018    source источник


Ответы (1)


Вы поняли, это * -1 вас сбивает с толку. Это сделает плавающее изображение с каждым пикселем * -1 (очевидно), поэтому ваши белые области станут -255. Когда вы снова сохраните как PNG, изображение будет преобразовано обратно в uint8, негативы будут обрезаны, и вы увидите только ноль.

Вы действительно хотите 255 - x, но Ruby не позволит вам иметь число слева от оператора двоичного изображения, поэтому вам нужно написать x * -1 + 255.

Вы можете пойти еще лучше: у ruby-vips есть #invert, который вычисляет (изображение-формат-макс - изображение-пиксель) и не меняет числовой формат. В данном случае это означает (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"

Делает это:

введите здесь описание изображения

(края все кривые - ваш пример был сглажен к тому времени, когда я его получил, извините)

person jcupitt    schedule 19.07.2018
comment
Большое спасибо, пользователь894763! Это сработало как шарм. В этом проекте я использовал convert, Imagemagick, rmagick, vips и java, как raw, так и Graph2D. Еще две недели назад я ничего не знал ни об одном из них, и мне нужно было просмотреть много документации. Много ковыряния и выбора, как в столовой. Разве не было бы здорово, если бы их растровые классы были совместимы? - person Robert Schaaf; 21.07.2018
comment
Ничего себе, это настоящий шведский стол программного обеспечения. libvips, очевидно, лучший, хе-хе. Я занимаюсь медицинской визуализацией, и эти пакеты часто даже не взаимодействуют на уровне формата файла :( У DICOM столько разновидностей, сколько производителей сканеров. - person jcupitt; 21.07.2018