#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 извините, мой комментарий был недостаточно ясен. Я отредактировал свой комментарий со всей функцией, переместив переменную маски во внутренний цикл.