#python-3.x #opencv #image-compression
#python-3.x #opencv #сжатие изображений
Вопрос:
Я использую OpenCV для сравнения 2 изображений.
Через пару дней я смог изменить его, чтобы сравнить изображение со списком изображений.
Как я могу сравнить список изображений с другим списком?
Пример: у нас есть 2 папки Images1 и Images2. Images1 = te1.jpg , te2.jpg , te3.jpg ; Изображения 2 = te1.jpg , te2.jpg , te3.jpg .
Я хочу сравнить te1.jpg из изображений 1 с te1.jpg из изображений 2, te2.jpg из изображений 1 с te2.jpg из изображений 2 и te3.jpg из изображений 1 с te3.jpg из изображений 2.
Могу ли я добавить обе папки и выполнить цикл через них, чтобы получить соответствующее изображение в Images2 для каждого изображения в Images1?
He is my code until now:
import cv2
import numpy as np
import glob
original = cv2.imread("te.jpg")
#Load all the images
all_images_to_compare = []
titles = []
for f in glob.iglob("images2/*"):
image = cv2.imread(f)
titles.append(f)
all_images_to_compare.append(image)
for image_to_compare, title in zip(all_images_to_compare, titles):
# 1) Check if 2 images are equals
if original.shape == image_to_compare.shape:
print("The images have the same size and channels")
difference = cv2.subtract(original, image_to_compare)
b, g, r = cv2.split(difference)
#image1 = original.shape
#image2 = duplicate.shape
cv2.imshow("difference", difference)
#cv2.imshow("b", b)
#cv2.imshow("g", g)
#cv2.imshow("r", r)
#print(image1)
#print(image2)
print(cv2.countNonZero(b))
if cv2.countNonZero(b) == 0 and cv2.countNonZero(g) == 0 and cv2.countNonZero(r) ==0:
print("Similarity: 100% (equal size and channels)")
# 2) Check for similarities between the 2 images
sift = cv2.xfeatures2d.SIFT_create()
kp_1, desc_1 = sift.detectAndCompute(original, None)
kp_2, desc_2 = sift.detectAndCompute(image_to_compare, None)
#print("Keypoints 1ST Image: " str(len(kp_1)))
#print("Keypoints 2ND Image: " str(len(kp_2)))
index_params = dict(algorithm=0, trees=5)
search_params = dict()
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(desc_1, desc_2, k=2)
good_points = []
ratio = 0.9 # mai putin de 1
for m, n in matches:
if m.distance < ratio*n.distance:
good_points.append(m)
# Define how similar they are
number_keypoints = 0
if len(kp_1) <= len(kp_2):
number_keypoints = len(kp_1)
else:
number_keypoints = len(kp_2)
print("Keypoints 1ST Image: " str(len(kp_1)))
print("Keypoints 2ND Image: " str(len(kp_2)))
print("Title:" title)
percentage_similarity = len(good_points) / number_keypoints * 100
print("Similarity: " str(int(percentage_similarity)) "%n")
Ответ №1:
Я думаю, вам просто нужен вложенный цикл for?
Итак, для папок «Images1» и «Images2» — я бы поступил так:
import os
import cv2
# load all image names into a list
ls_imgs1_names = os.listdir(Images1)
ls_imgs2_names = os.listdir(Images2)
# construct image paths and save in list
ls_imgs1_path = [os.path.join(Images1, img) for img in ls_imgs1_names]
ls_imgs2_path = [os.path.join(Images2, img) for img in ls_imgs2_names]
# list comprehensin to load imgs in lists
ls_imgs1 = [cv2.imread(img) for img in ls_imgs1_path]
ls_imgs2 = [cv2.imread(img) for img in ls_imgs2_path]
for original in ls_imgs1:
for image_to_compare in ls_imgs2:
# compare orignal to image_to_compare
# here just insert your code where you compare two images
В зависимости от вашей памяти или, скорее, количества изображений в вашей папке, я бы либо загрузил все imgs непосредственно в список, как я сделал выше, либо вы загружаете imgs в циклы for, чтобы вы перебирали ls_imgs1_path и ls_imgs2_path
Комментарии:
1. строка 6, в <module> ls_imgs1_path = os.listdir(Images1) # загрузить все пути к изображениям в список Ошибка имени: имя ‘Images1’ не определено
2. Я изменил имена переменных img, чтобы сделать их более понятными. Верхняя часть — это просто еще один (я думаю, лучший) способ загрузки ваших изображений из двух папок — проверьте функцию «listdir» из модуля ОС, который поставляется с предустановленным python
3. ах, извините — строки со списком должны выглядеть следующим образом: ls_imgs1 = [cv2.imread(os.path.join(Images1, img)) для img в ls_imgs1_path] ls_imgs2 = [cv2.imread(os.path.join(Images2, img)) для img в ls_imgs2_path]причина этого в том, что списки «ls_imgs1_path» выглядят так: [«img1.png», «img2.png», …] но вы указываете полный путь, чтобы правильно их загрузить. Это делается с помощью метода «os.path.join ()», чтобы получить [«Images1 / img1.png», «Images1 / img2.png», …] — это решило проблему?