Сравнение изображений в разных папках

Vseslav

Новичок
Пользователь
Янв 12, 2021
1
0
1
Доброго времени суток.Возникла необходимость нахождения наиболее подобных изображений в двух разных папках и формирования пар оригинал/подобие
Изображения в обеих папках имеют одинаковый стандарт (jpeg с одинаковым разрешением)
Был написан код (не ругайте строго за стиль, я только начинаю постигать python
Python:
frames_path = "E:/My_prog/frames/"
analysis_path = "E:/My_prog/analysis/"

for frame_file in os.listdir(frames_path): #перебираем файлы фреймов
    difference = 2
    proper_image = ""
    
    frame = cv2.imread(frame_file, 0) #читаем фрейм
    frame_hist = cv2.calcHist([frame], [0], None, [256], [0, 256])   #строим гистограмму

    for thumb_file in os.listdir(analysis_path): #перебираем файлы для анализа
        thumb = cv2.imread(thumb_file, 0) #читаем файл для анализа
        
        img = Image.open("%s%s"%(analysis_path, thumb_file))
        img.show()
        thumb_hist = cv2.calcHist([thumb], [0], None, [256], [0, 256])
        
        plt.imshow(thumb)
        plt.show()

        img_hist_diff = cv2.compareHist(frame_hist, thumb_hist, cv2.HISTCMP_BHATTACHARYYA)
        img_template_probability_match = cv2.matchTemplate(frame_hist, thumb_hist, cv2.TM_CCOEFF_NORMED)[0][0]
        img_template_diff = 1 - img_template_probability_match
        commutative_image_diff = img_hist_diff + (img_template_diff/10)
        
        if difference>commutative_image_diff:
            difference = commutative_image_diff
            proper_image = thumb_file

        print (frame_file)
        print (proper_image)
        print (difference)

P.S. строки были добавлены исключительно для собственного понимания почему код без них всегда даёт нулевую гистограмму thumb_file и будет стёрт после исправления ошибки
Python:
        plt.imshow(thumb)
        plt.show()


При попытке исполнения кода получаю
Код:
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-159-367fb0418268> in <module>
     18         thumb_hist = cv2.calcHist([thumb], [0], None, [256], [0, 256])
     19 #        print (thumb_file)
---> 20         plt.imshow(thumb)
     21         plt.show()
     22 #        print (thumb_hist)
........................................
TypeError: Image data of dtype object cannot be converted to float

Поиски в сети натолкнули на мысль, что ошибка возникает так как не выполняется строчка
Python:
 thumb = cv2.imread(thumb_file, 0)
Т.е. изображение не может быть прочитано

Вместе с тем, часть кода
Python:
        img = Image.open("%s%s"%(analysis_path, thumb_file))
        img.show()
исполняется и изображение открывается.

Хочу также заметить, что
Python:
    frame = cv2.imread(frame_file, 0) #читаем фрейм
    frame_hist = cv2.calcHist([frame], [0], None, [256], [0, 256])   #строим гистограмму
срабатывает отлично и, при желании, эти изображения легко открываются внутри цикла через plt.imshow

Подскажите пожалуйста, в чём может быть причина такой ошибки и как её исправить

Заранее благодарен
 

Форум IT Специалистов