Статьи

Обработка изображений с использованием Python

В газетной статье 1911 года, в которой обсуждались вопросы журналистики и гласности и цитировался редактор газеты Тесс Фландерс, появилось следующее выражение:

Используйте картинку. Это стоит тысячи слов.

Аналогичная фраза также появилась в газете 1913 года для Автосалона Piqua:

Один взгляд стоит тысячи слов.

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

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

Мы можем получить фотографии через различные устройства сбора. Например, изображения меланомы (рак кожи) получают с помощью дерматоскопа. Мы фотографируем себя или своих друзей с помощью цифровой камеры или смартфона. Однако иногда мы замечаем некоторые проблемы на наших снимках, например, размытие, которое может быть связано с используемым устройством сбора данных.

Но что делать в этом случае? Вам отправили несколько медицинских изображений для анализа, и у вас нет выбора для повторного получения таких изображений. Даже если вы восстановите изображение, разрешение, которое вы видите, не изменится, равно как и любые другие проблемы, с которыми вы столкнулись. Обработка изображений вступает в игру в таких ситуациях.

Мне понравилось, как термин « обработка изображений» был определен в Оксфордских словарях :

Анализ и манипулирование оцифрованным изображением, особенно с целью улучшения его качества.

«Оцифрованное изображение» здесь относится к тому факту, что изображение считается цифровым , то есть оно обрабатывается компьютером.

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

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

scikit-image — это библиотека обработки изображений, которая реализует алгоритмы и утилиты для использования в исследовательских, образовательных и промышленных приложениях. Он выпущен под либеральной Модифицированной лицензией BSD с открытым исходным кодом, предоставляет хорошо документированный API на языке программирования Python и разработан активной международной командой сотрудников.

Первое, что нам нужно сделать, это установить scikit-image . Инструкции по установке библиотеки можно найти на странице загрузки , и в этом уроке я покажу вам, как установить библиотеку на компьютер Mac OS X, поскольку именно это я сейчас использую при написании этого урока.

Поскольку scikit-image является внешней библиотекой, первое, что нам нужно сделать, это установить эту библиотеку. Для этого я буду использовать pip (который основан на Википедии):

Система управления пакетами, используемая для установки и управления программными пакетами, написанными на Python. Многие пакеты можно найти в индексе пакетов Python (PyPI) .

Вы можете выполнить шаги, указанные в Руководстве пользователя по Python Packaging, для установки pip , но если у вас Python 2.7.9 и выше или Python 3.4 и выше, у вас уже есть pip !

Теперь можно просто установить scikit-image , набрав следующую команду (в терминале Mac OS X):

pip install -U scikit-image

Теперь у нас установлена ​​библиотека, и она готова к интересной обработке изображений!

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

бабуин

Иногда нам нужно знать размеры изображения (подробнее об этом в разделе фильтрации). Чтобы проверить размеры нашего изображения, мы можем использовать метод guess_spatial_dimensions() следующим образом:

1
2
3
4
from skimage import io, color
img = io.imread(‘baboon.png’)
dimensions = color.guess_spatial_dimensions(img)
print dimensions

Результат вышеприведенного скрипта равен 3 , что означает, что у нас есть изображение, состоящее из трех пространственных измерений.

Из приведенного выше раздела мы заметили, что наше изображение является трехмерным массивом изображений (в формате RGBA с формой (.., .., 4) ). Как я узнал, что это в формате RGBA? Вы можете просто сделать следующее:

1
2
3
4
import skimage.io as io
from skimage.color import rgb2gray
img = io.imread(‘baboon.png’)
print img.shape

В этом случае вы получите такой вывод: (512, 512, 4) .

В этом разделе мы хотели бы преобразовать исходное цветное изображение baboon.png в 2D-изображение в оттенках серого (черно-белое). Это можно просто сделать с помощью следующего скрипта:

1
2
3
4
import skimage.io as io
from skimage.color import rgb2gray
img = io.imread(‘baboon.png’)
img_grayscale = rgb2gray(img)

Давайте продолжим и сохраним новое изображение (в градациях серого) в файл. Это можно сделать с помощью функции imsave() следующим образом (обратите внимание, что новое изображение находится в файле baboon-gs.png ):

io.imsave('baboon-gs.png',img_grayscale)

Чтобы проверить размеры изображения, мы можем использовать скрипт из предыдущего раздела, в этом случае вы получите 2 возвращенных значения. Или вы можете использовать img_grayscale.shape , что приведет к 512x512 . Итак, теперь у нас есть 2D-изображение.

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

1
2
show_grayscale = io.imshow(img_grayscale)
io.show()

Результат выглядит так:

Изображение павиана в оттенках серого

При обработке изображений выполняется фильтрация для улучшения качества изображения. В общем, фильтрация включает в себя следующие операции: улучшение границ, повышение резкости и сглаживание.

В этом разделе я покажу вам, как мы можем применить фильтр Собеля к нашему изображению, и посмотрим, как будет выглядеть вывод после выполнения такой операции. Я собираюсь использовать пример, показанный на первой странице веб-сайта scikit-image , но примененный к нашему изображению.

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

1
2
3
4
5
from skimage import data, io, filters
img = io.imread(‘baboon.png’)
edges = filters.sobel(img)
io.imshow(edges)
io.show()

Если вы запустили скрипт, вы заметили какие-либо проблемы? Да, мы не смогли применить операцию, так как изображение должно быть 2D-изображением. Таким образом, вместо использования baboon.png нам нужно использовать наше 2D-изображение, baboon-gs.png . Вывод этой операции выглядит следующим образом:

Изображение бабуина с применением фильтра Собеля

Существует много операций обработки изображений, и библиотека Python scikit-image предоставляет нам много интересных операций, которые мы можем выполнять над нашими изображениями. Вы можете увидеть больше операций по обработке изображений с помощью этой библиотеки на веб-сайте scikit-image .

Изучите Python с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.