Давайте мы напишем скрипт, который считывает изображение RGB и преобразует его в оттенки серого, что является основным этапом предварительной обработки в компьютерной графике. Для этого шага мы будем использовать OPENCV . Если у вас не установлен OpenCV, вы можете легко его установить в свою IDE при помощи pip:
pip install opencv-python
Для этого примера я загрузил 50 изображений автомобилей Formula One, сохраненных в data / formula_one, с файлами от 000000.jpg до 000049.jpg.
Сначала давайте создадим файл с расширением .py под названием gray.py и выполнить это в терминале. Программа прочитает изображения, преобразует их в оттенки серого и отобразит на нашем экране.
import cv2
import glob
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
for i in image_files:
img = cv2.imread(i)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_img_small = cv2.resize(gray_img, (960, 540))
cv2.imshow('Grayscale Image', gray_img_small)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ниже приведен пример результата:
Теперь, когда у нас получилось выполнить код, давайте посмотрим, как мы можем улучшить этот скрипт.
1. Подчеркните удобочитаемость кода на Python
Мой первый совет - не пишите скрипты для себя, даже если вы единственный, кто их использует. Вместо этого подумайте о себе в будущем – или, если вы пишете код на Python для кого-то другого, о человеке, который будет поддерживать код после вас. Другими словами, ваш код должен быть хорошо прокомментирован, читаем и понятен любому, кто посмотрит на ваш скрипт на Python. Если вы решили переработать свой код и сделать его высокооптимизированным в ущерб удобочитаемости, вы должны быть внимательны в своих комментариях.
Я не добавлял никаких комментариев в свой предыдущий пример, так что это может стать первым шагом к улучшению нашего скрипта на Python. Давайте используем комментарии, чтобы объяснить, что делает наш код:
import cv2
import glob
# Загружает изображения в порядке возрастания
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
# Просматривает файлы, отображая их в оттенках серого
for i in image_files:
img = cv2.imread(i) # Читает изображение
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Преобразовывает изображение в оттенки серого
gray_img_small = cv2.resize(gray_img, (960, 540)) # Изменяет размер изображения для целей визуализации
cv2.imshow('Grayscale Image', gray_img_small) # Отображает серое изображение в окне под названием "Изображение в оттенках серого".
cv2.waitKey(0) # Нажмите любую клавишу, чтобы закрыть окно
cv2.destroyAllWindows() # Закройте все открытые окна
Теперь наш код намного понятнее. Позже эти комментарии помогут вам напомнить о том что вы имели ввиду в каждом описанном блоке. Однако наши комментарии могут быть немного очевидными, поскольку эта статья представляет собой руководство по советам и хитростям Python. В этом контексте комментарии часто объясняют, “что” из кода; вместо этого часто хорошей практикой является написание “почему” этого фрагмента кода. Например, я мог бы написать комментарии, подобные этому:
import cv2
import glob
# Сортировка изображений по порядку важна, когда изображения записываются последовательно (например, видео, запись сенсором с временными метками).
# Это особенно важно, если изображения представляют собой видеокадры, где важен порядок.
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
# Преобразование в оттенки серого нормализует изображения и ускоряет их обработку. Это помогает моделям машинного обучения, когда цвет не является важной характеристикой.
for i in image_files:
img = cv2.imread(i)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_img_small = cv2.resize(gray_img, (960, 540))
cv2.imshow('Grayscale Image', gray_img_small)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. Напишите повторно используемые функции Python
Если вы сможете сделать свой код полностью повторно используемым с помощью функций, вы избавите себя от многих проблем. Итак, вместо того, чтобы записывать инструкции непосредственно в свой файл, попробуйте обернуть их в функции. Это заставит вас обобщить свой код и сделать его более пригодным для повторного использования в будущих скриптах.
Давайте напишем функцию, которая примет наш файл изображения в качестве аргумента и вернет серое изображение без изменения размера. Мы поместим функцию в начало скрипта, сразу после импорта:
import cv2
import glob
# Функция преобразования цвета в серый
def color2gray(filename):
img = cv2.imread(filename) # Прочтите изображение
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Преобразуйте изображение в оттенки серого
gray_img_small = cv2.resize(gray_img, (960, 540)) # Измените размер изображения для целей визуализации
cv2.imshow('Grayscale Image', gray_img_small) # Отобразите серое изображение в окне под названием "Изображение в оттенках серого".
cv2.waitKey(0) # Нажмите любую клавишу, чтобы закрыть окно
return gray_img
# Загружайте изображения в порядке возрастания
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
# Просмотрите файлы и отобразите изображения в оттенках серого
for i in image_files:
color2gray(i)
cv2.destroyAllWindows() # Закройте все открытые окна
3. Напишите свой собственный пакет Python
Мой следующий совет является продолжением предыдущего. Теперь, когда вы уже начали делать свой код повторно используемым путем добавления функций, вы можете сохранить эти функции в файле Python. Вы можете импортировать этот файл как любую библиотеку и извлекать свои функции всякий раз, когда они вам понадобятся.
Следующий шаг - организовать ваш код в классы. Это также может позволить вам использовать dir() метод для доступа к списку функций в вашем файле.
Давайте поместим нашу предыдущую функцию в новый файл Python с именем utils.py и импортируем его как любой пакет Python. Помните, что ваш utils.py файл должен находиться в том же каталоге.
import cv2
# Функция преобразования цвета в серый
def color2gray(filename):
img = cv2.imread(filename) # Прочтите изображение
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Преобразуйте изображение в оттенки серого
gray_img_small = cv2.resize(gray_img, (960, 540)) # Измените размер изображения для целей визуализации
cv2.imshow('Grayscale Image', gray_img_small) # Отобразите серое изображение в окне под названием "Изображение в оттенках серого".
cv2.waitKey(0) # Нажмите любую клавишу, чтобы закрыть окно
return gray_img
И обновленный gray.py файл:
import cv2
import glob
import utils
# Загружайте изображения в порядке возрастания
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
# Просматривайте файлы, отображая их в оттенках серого
for i in image_files:
utils.color2gray(i)
cv2.destroyAllWindows() # Закройте все открытые окна
Если по какой-то причине ваш utils.py файл находится в другом каталоге, вы можете импортировать его в свой gray.py файл:
import cv2
import glob
import sys
sys.path.append("your-path-to-utils")
import utils
# Загружайте изображения в порядке возрастания
image_files = sorted(glob.glob("./data/formula_one/*.jpg"))
# Просматривайте файлы, отображая их в оттенках серого
for i in image_files:
utils.color2gray(i)
cv2.destroyAllWindows() # Закройте все открытые окна
О пакетах Python можно узнать больше, но это должно помочь вам начать. Удобство чтения - одно из преимуществ хранения ваших функций в специальном файле Python, но это также упрощает обслуживание вашего кода.
Вы можете получить доступ к списку ваших функций с помощью dir().
import utils
print(dir(utils))
Мы получаем следующий результат:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'color2gray', 'cv2']
Вы можете видеть color2gray, функцию, которую мы определили ранее.