Последовательная маскировка изображений в Python

#python #image-masking

Вопрос:

Я работаю над проектом по маскировке последовательных изображений в разных положениях, чтобы изучить движение одной мухи. Итоговое изображение должно выглядеть так: правильная маскировка изображения. Однако по мере того, как код продолжает выполняться, изображения начинают выглядеть следующим образом: неправильная маскировка изображения, чего я не хочу, потому что мне нужна только одна видимая область (круг, содержащий одну муху) на изображение, а не три. Что мне нужно сделать с моим кодом, чтобы на каждом изображении в разных положениях присутствовал только один круг, а не несколько кругов на изображении?

 `List = [
    [180, 353, 85, str("/media/pi/T3 1TB 2Ch xFer/Ramzy Masked /Arena2")],
    [180, 542, 85, str("/media/pi/T3 1TB 2Ch xFer/Ramzy Masked /Arena3")],
    [180, 728, 85, str("/media/pi/T3 1TB 2Ch xFer/Ramzy Masked /Arena4")],
]

def load_images_from_folder(folder):
    images = []
    for filename in os.listdir(folder):
        img = cv2.imread(os.path.join(folder,filename))
        mask = np.zeros(img.shape[:2], dtype="uint8")
    
        for row in List:
            cv2.circle(mask, (row[0], row[1]), row[2], 255, -1)
            masked = cv2.bitwise_and(img, img, mask=mask)
            cv2.imwrite(os.path.join(row[3], f'{filename}'),  masked)

load_images_from_folder("/media/pi/T3 1TB 2Ch xFer/Ramzy Research 
Photos/8.17.21")
    
cv2.waitKey(0)
cv2.destroyAllWindows()
 

`

Ответ №1:

Я не слишком хорошо знаком с библиотекой cv2, но я считаю, что эта строка:

 cv2.circle(mask, (row[0], row[1]), row[2], 255, -1)
 

Это добавление нового круга на вашу маску в каждом цикле. Существует множество способов исправить это, но вы могли бы начать с перемещения этой строки чуть выше вызова cv2.circle в цикле, например:

 def load_images_from_folder(folder):
    images = []
    for filename in os.listdir(folder):
        img = cv2.imread(os.path.join(folder,filename))
    
        for row in List:
            mask = np.zeros(img.shape[:2], dtype="uint8")
            cv2.circle(mask, (row[0], row[1]), row[2], 255, -1)
            masked = cv2.bitwise_and(img, img, mask=mask)
            cv2.imwrite(os.path.join(row[3], f'{filename}'),  masked)

 

Это создаст совершенно новую маску на каждой итерации цикла.

Комментарии:

1. Когда я это делаю, в нем говорится, что «локальная переменная ‘строка’, на которую ссылаются перед назначением». Я думаю, что, поскольку цикл for определяет, что такое строка, эта строка должна быть там, где она была изначально. Есть какие-нибудь идеи о том, что делать дальше?

2. @RamzyIssa извините, мой комментарий был недостаточно ясен. Я отредактировал свой комментарий со всей функцией, переместив переменную маски во внутренний цикл.