Статьи

Рубин по медицине: работа с медицинскими изображениями

первая помощь длинная тень значок, символ вектор первая помощь длинная тень значок, символ вектор

Как исследователь в области анализа медицинских изображений, я не могу переоценить важность изображений. Информация, которую эти изображения показывают о теле, как внутреннем ( то есть МРТ), так и внешнем ( то есть дерматоскопия), является чрезвычайно ценной. Я поражаюсь, когда замечаю опухоль, четко показанную на изображении. Иногда изображение нуждается в некоторой обработке, но в конце дня медицинское изображение стало источником этой информации.

Опухоли — не единственный предмет, который можно увидеть на медицинских изображениях. Другие проблемы, такие как переломы костей, диагностируются с помощью изображений. Анализ медицинских изображений является неотъемлемой частью медицины, и многие конференции и журналы специально ориентированы на этот тип области.

В этой серии я сосредоточился на применении языка программирования Ruby к медицинской сфере. В этой статье я покажу вам, как мы можем использовать Ruby для просмотра и кодирования медицинских изображений.

Без дальнейших церемоний, давайте начнем.

Програмное обеспечение

Tk

Прежде чем идти слишком далеко по пути, важно дать краткий обзор Tk , который является важной концепцией для нашей работы в этой статье.

Tk — это бесплатный кроссплатформенный инструментарий виджетов с открытым исходным кодом, который используется для создания графических пользовательских интерфейсов (GUI) на разных языках программирования, включая Ruby. Другими словами, он предоставляет нам GUI-виджеты, такие как текст , кнопка , метка и т. Д., Которые нам нужны при создании настольного приложения. Tk является частью стандартной библиотеки Ruby.

ImageMagick

ImageMagick — это библиотека и набор инструментов командной строки, которые предоставляют возможность манипулировать различными форматами изображений.

RMagick

RMagick — это интерфейс между Ruby и ImageMagick. RMagick абстрагирует различные предоставляемые ImageMagick операции, чтобы их можно было использовать в программе Ruby

Настройка среды

Теперь, когда мы прошли основные концепции, давайте продолжим и настроим среду. Нам нужно установить инструменты, представленные выше: Tk , ImageMagick и RMagick .

Установить тк

В настоящее время я работаю над Mac OS X, поэтому инструкции будут основаны на этой ОС. Не волнуйтесь, если вы работаете с другой ОС, вы можете найти инструкции по установке Tk здесь .

В Mac OS X ActiveTcl — самый простой способ получить Tk. ActiveTcl включает в себя Tcl, Tk и другие библиотеки. Вы можете скачать его прямо здесь . Следуйте инструкциям мастера установки, и все готово!

Установите ImageMagick

Установить ImageMagick просто. Различные дистрибутивы для разных ОС можно найти здесь . Я буду использовать Homebrew для установки ImageMigick. Вы можете установить Homebrew на свой компьютер, введя следующую команду в своем терминале (без знака $

 
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Теперь, чтобы установить ImageMagick, просто введите следующую команду в своем терминале (без знака $

 
$ brew install imagemagick

Установить RMagick

Чтобы установить RMagick, вам просто нужно ввести следующую команду в своем терминале (при условии, что у вас установлен Ruby):

 
$ gem install rmagick

Просмотр медицинского изображения

Изображение, которое мы будем пытаться просмотреть с помощью Ruby, приведено ниже:

brain

Идите вперед и сохраните его на свой жесткий диск как brain.jpg

Первое, что нам нужно сделать, это прочитать изображение. Класс TkPhotoImage используется для этого:

 
require 'tk'
img = TkPhotoImage.new
img.file = 'brain.jpg'

В Tk используется иерархия виджетов. Другими словами, виджеты могут быть включены в другие виджеты. Основной виджет в Tk является rootTkRoot . Думайте о TkRoot Чтобы создать это главное окно в Ruby, сделайте следующее:

 
root = TkRoot.new(title 'view image')

Создавая главное окно, нам теперь нужен подходящий виджет для отображения изображения. TkLabel подойдет для этой задачи, поскольку позволит нам создать новую метку, которая будет использоваться для отображения нашего изображения. Чтобы включить метку в корень, мы делаем следующее:

 
label = TkLabel.new(root)

Теперь, чтобы отобразить изображение в метке, мы пишем:

 
label.image = img

Перед обработкой элемента управления Tkheightwidth Давайте сделаем его равным высоте и ширине нашего изображения. Итак, мы можем сделать следующее:

 
label.place(height: img.height, width: img.width)

Наконец все готово и на месте. Чтобы позволить Tk отображать виджеты, нам нужно вызвать Tk.mainloop Вот последний сценарий:

 
require 'tk'
img = TkPhotoImage.new
img.file = 'brain.jpg'
root = TkRoot.new {title 'view image'}
label = TkLabel.new(root) 
label.image = img
label.place(height: img.height, width: img.width)
Tk.mainloop

Проблемы и ошибки

Прежде чем я покажу вам результаты, я хочу рассмотреть некоторые проблемы, с которыми вы можете столкнуться при работе с Tk.

GIF выпуск

Вы можете спросить, почему мы установили ImageMagickRMagick

Как вы можете видеть здесь , стандартный Tk поддерживает только формат изображения gifjpg В этом случае в игру вступают ImageMagick и RMagick. Используя RMagick, мы можем преобразовать изображение jpggif

RMagick реализован в модуле Magick

 
require 'RMagick'
include Magick

Чтобы выполнить преобразование из jpggif

 
img = ImageList.new('brain.jpg')
img.write('brain.gif')

Итак, вы будете читать brain.gifbrain.jpg Стоит отметить, что вы также можете использовать инструменты командной строки ImageMagick для этой задачи.

не могу загрузить такой файл — tk (LoadError)

Одна из вещей, которые вы можете увидеть при запуске программы, это ошибка, которая появляется из инструкции require 'tk'

 
cannot load such file -- tk (LoadError)
 что только происходит, если вы используете RVM .  Исходя из этого поста , проблема может быть решена следующим образом:

  • Убедитесь, что у вас установлен Tcl (см. Выше « Install Tk
  • Выполните следующую команду в своем терминале (это обновление ruby ​​до текущей версии 2.2.3 с поддержкой Tk в Mac OS X):
 
rvm reinstall 2.2.3 --enable-shared --enable-pthread --with-tk --with-tcl

не могу загрузить такой файл — RMagick (LoadError)

Другая ошибка, с которой вы можете столкнуться в результате выполнения require 'RMagick'

 
cannot load such file -- RMagick (LoadError)

Чтобы решить эту проблему, просто запустите:

 
$ gem install rmagick

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

output

Рубин на медицине: Base 64 Кодирование и декодирование

Скажем, ваш сценарий должен был передать это изображение по сети, как в электронном письме. Вы можете удивиться, когда поймете, что в вашем файле есть странные символы на другой стороне! Это может объясняться тем, что вы пытались отправить файл в необработанном формате битов и байтов, а используемый носитель был предназначен для потоковой передачи текста.

Но не волнуйтесь, на самом деле есть инструмент, позволяющий избежать такой проблемы. Это кодировка Base64 . Я покажу вам, как легко использовать Ruby to Base64 для кодирования и декодирования медицинских изображений.

Что такое Base64?

Base64 — это способ, которым 8-битные двоичные данные кодируются в формате, который может быть представлен в 7-битном формате. Это делается с использованием только символов A-Za-z0-9+/= Используя это кодирование, три 8-битных байта преобразуются в четыре 7-битных байта.

Зачем использовать Base64?

Base64 очень важен для представления двоичных данных, где он позволяет представлять двоичные данные таким образом, который выглядит и действует как обычный текст. Это делает данные более надежными для хранения в базах данных, отправки по электронной почте или использования в текстовых форматах, таких как XML. Base64 в основном используется для представления данных в строковом формате ASCII .

Base64 кодирование

Кодирование Base64 — это процесс преобразования двоичных данных в ограниченный набор символов из 64 символов. Как показано в первом разделе, это символы A-Za-z0-9+/ Он использует A-Za-z0-9+/+/

Данные, закодированные в Base64, оказываются длиннее исходных данных, так что на каждые 3 байта двоичных данных имеется по крайней мере 4 байта данных, закодированных в Base64. Иногда вы можете увидеть странное сообщение, подобное показанному ниже, которое, скорее всего, возникает при просмотре необработанного электронного письма с вложением. Вы действительно видите кодировку Base64 в действии! (если вы заметили «=», вы можете сделать вывод, что это кодировка Base64, так как знак равенства используется для заполнения в процессе кодирования):

 
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix
2KfYqiDYp9mE2K/Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG
INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5
2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ
hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ
gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK
INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K/Yp9mE2LHYrdmF2YYNCg==
--089e0141aa264e929a0514593016
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix 2KfYqiDYp9mE2K / Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5 2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K / Yp9mE2LHYrdmF2YYNCg == --089e0141aa264e929a0514593016 Content-Type: text / html; кодировка = UTF-8 Content-Transfer-Encoding: base64

Base64 выполняется с помощью следующих шагов:

  • Текст для кодирования преобразуется в его эквиваленты ASCII ( то есть a: 97, b: 98 и т . Д. ). Посмотрите на таблицу ASCII здесь .
  • Десятичные значения, полученные на предыдущем шаге, преобразуются в их двоичные эквиваленты ( т.е. 97: 01100001).
  • Все двоичные эквиваленты объединяются, получая большой набор двоичных чисел.
  • Большой набор двоичных чисел разделен на равные секции, причем каждая секция содержит только 6 битов.
  • Равные наборы из 6 бит преобразуются в их десятичные эквиваленты.
  • Десятичные эквиваленты окончательно преобразуются в их значения Base64 ( т.е. 4: E). Десятичные значения и их алфавит Base64 можно найти здесь .

Base64 декодирование

Декодирование Base64 выполняется путем обращения шагов, описанных в предыдущем разделе:

  • Каждый символ в строке заменяется своим десятичным значением Base64.
  • Полученные десятичные значения преобразуются в их двоичные эквиваленты.
  • Первые два бита двоичных чисел усекаются из каждого полученного двоичного числа, и наборы из 6 битов объединяются, образуя одну большую строку двоичных цифр.
  • Большая строка двоичных цифр, полученная на предыдущем шаге, разбивается на группы по 8 битов.
  • 8-битные двоичные числа преобразуются в их десятичные эквиваленты.
  • Полученные десятичные значения в конечном итоге преобразуются в их эквивалент ASCII.

Кодирование изображения

Достаточно теории, и давайте перейдем к некоторому кодированию на Ruby. Я буду использовать изображение мозга из первой части этой статьи. Первое, что нам нужно сделать, чтобы использовать Base64 в Ruby, это включить модуль base64 , который является частью стандартной библиотеки:

 require base64

Для того, чтобы кодировать изображение, просто используйте функцию encode64(bin) . Документация Ruby для этой функции гласит:

>> Возвращает версию bin в кодировке Base64. Этот метод соответствует RFC 2045. Переводы строк добавляются к каждые 60 кодированных символов.

Таким образом, мы можем сделать следующее для кодирования Base64 нашего изображения:

 
require 'base64'

#open the image file and treat it as a binary file

image = File.open('brain.jpg').binmode
image_read = image.read
image_64_encode = Base64.encode64(image_read)

Если вы хотите увидеть выходные данные процесса кодирования, введите следующее:

 puts image_64_encode

Декодирование изображения

Чтобы декодировать изображение с помощью Ruby, просто используйте decode64(str) Документация Ruby для этой функции:

>> Возвращает Base64-декодированную версию str. Этот метод соответствует RFC 2045. Символы вне основного алфавита игнорируются.

Чтобы декодировать изображение, закодированное в предыдущем разделе, сделайте следующее:

 Base64.decode64(image_64_encode)

В целом

Давайте поместим скрипт Ruby, который Base64 кодирует и декодирует изображение вместе. Сценарий Ruby, который делает это, выглядит примерно так:

 
require 'base64'
image = File.open('brain.jpg').binmode
image_read = image.read
image_64_encode = Base64.encode64(image_read)
image_64_decode = Base64.decode64(image_64_encode)

#create a writable image and write the decoding result

image_result = File.open('brain_decode.jpg', 'w')
image_result.write(image_64_decode)

Открыв изображение brain_decode.jpgbrain.jpg

Вывод

Ruby — это язык, разработанный для того, чтобы сделать программистов счастливыми. Он предлагает множество инструментов, которые помогут нам в нашей повседневной работе. Цель этой статьи и серии — научить некоторым основам Ruby, рассматривая область, которая встречается немного реже при обсуждении Ruby. Я надеюсь, что вы сегодня узнали кое-что о том, как использовать Tk и как кодировать и декодировать изображения в Ruby. Надеюсь, изображение вашего мозга стало немного больше. 🙂