@JRBRO

Как дать имя отдельным секторам в изображении?

Такой вопрос, есть изображение, которое я разбиваю на определенные сектора. Каждый из этих секторов я хочу обработать. Можно ли это сделать более оптимально.

Как я делаю это сейчас:
Я использую библиотеку slicer, которая режет изображение, затем обрабатываю каждое по отдельности и затем собираю его обратно. Все работает, но думаю вы согласитесь- достаточно много действий когда таких изображений не одно, а 100500.

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

import cv2
import sys
image = cv2.imread(sys.argv[1])
  
img_h, img_w = image.shape[:2]
bl_w, bl_h = 32, 32

for i in range(int(img_h/bl_h)):
  for j in range(int(img_w/bl_w)):
    cropped = image[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w]
    #cv2.imwrite("Cropped image{}{}.bmp".format(str(i+1), str(j+1)), cropped)

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

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

Кому интересно, свое решение я собираю так(есть куча сохраненных квадратиков, на которые я поочередно кидаю оценку и собираю воедино)
for imagePath in list(sorted(paths.list_images(sys.argv[1]))):
	image = cv2.imread(imagePath)
	C = image_colorfulness(image)
	cv2.putText(image, "{:.2f}".format(C), (40, 40), 
	cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 255, 0), 3)
	results.append((image, C))
allColors = results
allColor = [a[0] for a in allColors[:64]]

allColorMontage = build_montages(allColor, (150, 84), (8, 8))
cv2.imshow("ALL", allColorMontage[0])
cv2.waitKey()
  • Вопрос задан
  • 42 просмотра
Решения вопроса 1
Vindicar
@Vindicar
Вообще ответ зависит от конкретной задачи.
У тебя преобразование каждого кусочка идёт независимо от остальных?
Если да, то всё сильно упрощается. Опиши функцию вида:
def process_one_part(part: numpy.ndarray) -> numpy.ndarray:
    ...

Которая будет обрабатывать один фрагмент изображения.
А дальше собрать их абсолютно тривиально, точно также, как ты их резал:
# пустое изображение такого же размера, как исходное, с тремя каналами по 8 бит на канал
# если на выходе у тебя другое число каналов или тип данных, поправишь
result = numpy.zeros(image.shape[:2] + (3,), numpy.uint8)

for i in range(img_h // bl_h):
  for j in range(img_w // bl_w):
    cropped = image[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w]
    processed = process_one_part(cropped)
    # нужно, чтобы присваиваемый фрагмент имел такой же размер, как "окно" присваивания
    result[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w] = processed
# дальше делаешь с result что тебе нужно


Ну и да... причём тут вообще имя?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы