Распознавание образов в Python. Часть V — обработка изображений

Предыдущая статья — Распознавание образов в Python. Часть IV — используем Mathplotlib для вывода изображений.

Теперь мы готовы рассматривать вопросы обработки изображений.

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

Давайте посмотрим на изображение, которое мы хотим обработать.

Давайте откроем в нашем коде вместо dot.png другое изображение: "i = Image.open('images/numbers/y0.4.png')".

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

i = Image.open('images/numbers/y0.4.png')

iar = np.asarray(i)


plt.imshow(iar)
print(iar)
plt.show()	   

Мы увидим следующее изображение:

Теперь ряд данных выглядит следующим образом:

 [[255 242   0 255]
  [255 242   0 255]
  [ 63  72 204 255]
  [ 63  72 204 255]
  [ 63  72 204 255]
  [ 63  72 204 255]
  [255 242   0 255]
  [255 242   0 255]]

Сейчас давайте взглянем на другую версию изображения ноля, открыв файл следующим образом: «i = Image.open('images/numbers/0.4.png')«.

Это будет тот же ноль, но в других цветах. Вот так это выгляит:

Ряд данных для этого изображения будет иметь следующий вид:

[[255 255 255 255]
  [  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  [255 255 255 255]]

Несложно заметить, что в этих данных есть только значения 0 и 255. Для анализа данных это очень хорошо. Мы хотим по возможности упростить все до 0 и 255, и мы можем это сделать путем обрабоки изображений с использованием пороговых значений.

Мы можем это сделать даже с изображениями, которые намеренно созданы таким образом, чтобы их было сложно распознавать. Например, возьмем "i = Image.open('images/numbers/y0.5.png')".

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

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

Следующая статья — Распознавание образов в Python. Часть VI — функция обработки изображений.