Как обрезать чёрные полосы через python
У меня есть фотография и мне нужно обрезать эти чёрные полосы сверху и с низу используя python. Как это можно сделать? Если на всех фотография расстояние от границ до этих элементов по середине всегда разное.
У меня есть фотография и мне нужно обрезать эти чёрные полосы сверху и с низу используя python. Как это можно сделать? Если на всех фотография расстояние от границ до этих элементов по середине всегда разное.
Достаточно интересный вопрос. Здесь Вам на выручку пойдут инструменты компьютерного зрения.
В данном решении использовался OpenCV. Здесь не использовались никакие дополнительные фильтры/преобразования, которые могут Вам в дальнейшем пригодится, но данный код достойно справляется с удалением верхних и нижних черных участков на изображении.
Продемонстрирую результаты его работы на Вашем примере и на одном рандомном примере с интернета:
А вот и сам код:
import cv2
# Загрузите Ваше изображение
image = cv2.imread("photo.jpg")
# Конвертирование изображения в градации серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Нахождение границ черных полос в верхней и нижней частях изображения
# Параметр <20, регулирует насколько черный объект,
# т. е 0 - это абсолютно черный.
height, width = gray.shape
top = 0
bottom = height - 1
while top < height - 1 and cv2.mean(gray[top])[0] < 20:
top += 1
while bottom > 0 and cv2.mean(gray[bottom])[0] < 20:
bottom -= 1
# Обрезка изображения
image = image[top:bottom, :]
# Сохранение обрезанного изображения
cv2.imwrite('photo39.jpg', image)
Учитывая, что Вы указали, что Вам придеться работать с множеством изображений. Вот решение, которое позволяет принимать и обрабатывать целые папки с изображениями, которые содержат эти мерзопакостные черные полосы.
import cv2
import os
# Путь к директории с изображениями
dir_path = r'{Ваш путь к папке с изображениями}'
# Получаем список всех файлов в директории
file_list = os.listdir(dir_path)
# Цикл для обработки каждого изображения. Принимаем и .jpg и .png
for file_name in file_list:
if file_name.endswith('.jpg') or file_name.endswith('.png'):
# Загрузка изображения
image = cv2.imread(os.path.join(dir_path, file_name))
# Конвертирование изображения в градации серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Нахождение границ черных полос в верхней и нижней частях изображения
height, width = gray.shape
top = 0
bottom = height - 1
while top < height - 1 and cv2.mean(gray[top])[0] < 20:
top += 1
while bottom > 0 and cv2.mean(gray[bottom])[0] < 20:
bottom -= 1
# Обрезка изображений
image = image[top:bottom, :]
# Сохранение обрезанных изображений с префиксом _new
new_file_name = os.path.splitext(file_name)[0] + '_new' + os.path.splitext(file_name)[1]
cv2.imwrite(os.path.join(dir_path, new_file_name), image)