Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 38

Изображения в папке сравнить с заданным

07.05.2023, 08:26. Показов 1314. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой код который берет все изображения в папке и сравнивает все между собой.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from sentence_transformers import SentenceTransformer, util
from PIL import Image
import glob
import os
# Load the OpenAI CLIP Model
print('Loading CLIP Model...')
model = SentenceTransformer('clip-ViT-B-32')
# Next we compute the embeddings
# To encode an image, you can use the following code:
# from PIL import Image
# encoded_image = model.encode(Image.open(filepath))
image_names = list(glob.glob('./*.jpg'))
print("Images:", len(image_names))
encoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
# Now we run the clustering algorithm. This function compares images aganist 
# all other images and returns a list with the pairs that have the highest 
# cosine similarity score
processed_images = util.paraphrase_mining_embeddings(encoded_image)
NUM_SIMILAR_IMAGES = 10 
# =================
# DUPLICATES
# =================
print('Finding duplicate images...')
# Filter list for duplicates. Results are triplets (score, image_id1, image_id2) and is scorted in decreasing order
# A duplicate image will have a score of 1.00
# It may be 0.9999 due to lossy image compression (.jpg)
duplicates = [image for image in processed_images if image[0] >= 0.999]
# Output the top X duplicate images
for score, image_id1, image_id2 in duplicates[0:NUM_SIMILAR_IMAGES]:
    print("\nScore: {:.3f}%".format(score * 100))
    print(image_names[image_id1])
    print(image_names[image_id2])
# =================
# NEAR DUPLICATES
# =================
print('Finding near duplicate images...')
# Use a threshold parameter to identify two images as similar. By setting the threshold lower, 
# you will get larger clusters which have less similar images in it. Threshold 0 - 1.00
# A threshold of 1.00 means the two images are exactly the same. Since we are finding near 
# duplicate images, we can set it at 0.99 or any number 0 < X < 1.00.
threshold = 0.99
near_duplicates = [image for image in processed_images if image[0] < threshold]
for score, image_id1, image_id2 in near_duplicates[0:NUM_SIMILAR_IMAGES]:
    print("\nScore: {:.3f}%".format(score * 100))
    print(image_names[image_id1])
    print(image_names[image_id2])
Мне нужно что бы один файл сравнивался со всеми остальными. Мои познания не очень по этому я только с помощью гугл пишу. Нагуглил вот
Открываю пути к изображениям из файла
Python
1
2
3
4
5
filename = "massiv_img.txt"
# Открываем файл для чтения
with open(filename, "r") as f:
    # Считываем все строки из файла и сохраняем их в список
    image_names = [line.rstrip() for line in f]
Я создал список затем получаю изображение которое нужно сравнить
Python
1
query_image = Image.open('2323.jpg')
Дальше не могу ни чего на гуглить помогите пожалуйста
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2023, 08:26
Ответы с готовыми решениями:

Сравнить цвет кнопки с заданным
Как проверить является ли цвет кнопки определенным? if (_1.Background = Colors.Red) не работает if (button.BackColor ==...

Как сравнить текст из memo с текстами файлов в папке?
Здравствуйте! Как сравнить текст из memo с текстами файлов на наличие схожести , которые есть у меня в папке на компьютере? Если есть...

Сравнить вводимые числа с заданным значением
Дана последовательность из 10 чисел, которые пользователь вводит с клавиатуры. Вывести на экран возле каждого числа меньше оно 2 или нет.

13
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
07.05.2023, 10:08
AnteFil, а какой злодей-террорист заставляет тебя решать задачу, которая тебе даже близко не по плечу?
Ты в список читаешь текст, а изображение читаешь как байты) как ты собрался текст с байтами сравнивать?

если тебе тупо нужно полное совпадение то не нужно даже картинки считывать, можно или байты сравнивать или еще проще с помощью хеша (а сначала просто размер файлов сравнить).
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
07.05.2023, 11:25
Цитата Сообщение от Welemir1 Посмотреть сообщение
как ты собрался текст с байтами сравнивать?
так ведь:
Цитата Сообщение от AnteFil Посмотреть сообщение
Открываю пути к изображениям из файла
т.е. ТС не может составить цикл для перебора путей к файлам, чтобы считывать изображения для сравнения...

ЗЫ
Если правильно понял, то код не просто ищет полные дубли, а определяет и порог с оценкой "похожести", т.к. сжатие картинки не даст определить дубль ли это... видимо, для этого и затевался весь этот код...
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
07.05.2023, 11:40
YuS_2, да, моя вина, кофе не попил утром, бывает...

исправляюсь
AnteFil, вот тут есть варианты сравнения файлов, в том числе если они разных размеров но картинка одна
https://stackoverflow.com/ques... python-pil
1
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
07.05.2023, 12:00
Welemir1, не, судя по всему, код этот как раз для задачи ТС подходит... просто он считывает все картинки кучей и среди них ищет похожие, а ТС-у надо брать одну картинку-образец и сравнивать с кучей... хотя, особой разницы в этом действии не вижу - скинуть все картинки в кучу и пусть ищет похожие, последовательный перебор только время обработки увеличит...
А так, вот откуда этот код:
https://www.sbert.net/examples... EADME.html
https://github.com/UKPLab/sent... ates.ipynb
0
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 38
07.05.2023, 18:21  [ТС]
Проблема в коде сейчас такая что картинки сравниваются друг с другом. Для сравнения 4 картинок будет затрачено 16 сравнений. А если таких картинок 1000 то будет 100 000 операций это долго и ресурсно затратно, А если сравнивать 1 картику с 4 то всего 4 сравнения что в разы быстрее.

Добавлено через 1 минуту
Цитата Сообщение от YuS_2 Посмотреть сообщение
Welemir1, не, судя по всему, код этот как раз для задачи ТС подходит... просто он считывает все картинки кучей и среди них ищет похожие, а ТС-у надо брать одну картинку-образец и сравнивать с кучей... хотя, особой разницы в этом действии не вижу - скинуть все картинки в кучу и пусть ищет похожие, последовательный перебор только время обработки увеличит...
А так, вот откуда этот код:
https://www.sbert.net/examples... EADME.html
https://github.com/UKPLab/sent... ates.ipynb
Я меня есть готовый и рабочий пример я не понимаю как переписать цикл просто!

Добавлено через 22 минуты
Цитата Сообщение от Welemir1 Посмотреть сообщение
AnteFil, вот тут есть варианты сравнения файлов, в том числе если они разных размеров но картинка одна
https://stackoverflow.com/ques... python-pil
Ну мне надо чёт подобное только в цикле. 1 картинку сравнить с массивом картинок

Добавлено через 2 минуты
Вот три строчки которые создают первый массив (список)
Python
1
2
3
image_names = list(glob.glob('./*.jpg'))
print("Images:", len(image_names))
encoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
Я переписал его на это
Python
1
2
3
4
5
filename = "massiv_img.txt"
# Открываем файл для чтения
with open(filename, "r") as f:
    # Считываем все строки из файла и сохраняем их в список
    image_names = [line.rstrip() for line in f]
Мне не нужно брать все картинки в папке мне нужно только те которые я передаю скрипту. Например я передал 1000 картинок (путей) в файл скрипт подхватил их. начало я подправил так как мне надо тут всё ок.

Добавлено через 3 минуты
Этой строчкой я закодирываю в векторно
Python
1
processed_images = util.paraphrase_mining_embeddings(encoded_image)
вызывает функцию paraphrase_mining_embeddings из модуля util, передавая в качестве аргумента закодированное изображение encoded_image. Функция paraphrase_mining_embeddings использует предварительно обученную нейронную сеть для создания векторного представления закодированного изображения. Затем функция находит похожие векторы в предоставленном наборе данных (например, в других изображениях) и возвращает кортеж, содержащий закодированное изображение и список кортежей, каждый из которых содержит индекс и сходство (косинусное расстояние) между вектором закодированного изображения и вектором другого изображения из набора данных.

Добавлено через 3 минуты
Вот здесь затуп я хз как ещё обьяснить. Должно быть так.
Картинка №1 сравнивается с Картинкой №2 итог сходство 10%
Картинка №1 сравнивается с Картинкой №3 итог сходство 10%
Картинка №1 сравнивается с Картинкой №4 итог сходство 10%
Картинка №1 сравнивается с Картинкой №5 итог сходство 10%
Картинка №1 сравнивается с Картинкой №6 итог сходство 10%

.............
Вот так должно быть

Добавлено через 23 минуты
Вот походу есть. У меня есть Лист image_names мне надо в цикле его перебрать.
Получается я каждый раз должен вызывать функцию
Python
1
processed_images = util.paraphrase_mining_embeddings(encoded_image)
и весь тот код что идёт ниже для двух изображений одно из листа другое выббранное изображение.
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
07.05.2023, 19:54
Цитата Сообщение от AnteFil Посмотреть сообщение
Должно быть так.
ну, если очень хочется, создайте список пар и сравнивайте, вызывая их последовательно.
Python
1
2
3
4
5
arrfile = ['a','b','c','d']
file = 'z'
for item in arrfile:
    image_names = [file, item]
...
Добавлено через 57 секунд
Цитата Сообщение от AnteFil Посмотреть сообщение
Получается я каждый раз должен вызывать функцию
конечно. Вы же хотите попарно сравнивать...
0
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 38
08.05.2023, 10:09  [ТС]
Я вроде понял что само сравнение происходит в этой функуии.
Python
1
processed_images = util.paraphrase_mining_embeddings(encoded_image)
Теперь помогите непосредственно написать код.
Python
1
2
3
4
5
6
odin_image = Image.open('2323.jpg')
filename = "massiv_img.txt"
# Открываем файл для чтения
with open(filename, "r") as f:
    # Считываем все строки из файла и сохраняем их в список
    image_names = [line.rstrip() for line in f]
Дальше кодируем в модель
Python
1
encoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
Дальше перебрать надо.

Блин почему PYTHON такой трудный. Не понятно вообще где цикл где нет его. На php всё просто и понятно.
На php всё решаеться в две строчки
PHP
1
2
3
foreach ($array as $value) {
    // code to be executed for each $value
}
С этим долбаным PYTHON мучаюсь уже 4 день

Добавлено через 9 минут
Тока щас понял получаеться как то так
Python
1
2
3
4
5
6
7
8
9
filename = "massiv_img.txt"
# Открываем файл для чтения
with open(filename, "r") as f:
# Считываем все строки из файла и сохраняем их в список
    image_names = [line.rstrip() for line in f]
# Добавляем ещё фото
odin_image = Image.open('2323.jpg')
for item in line:
    image_names = [file, item]
Добавлено через 2 минуты
Python
1
2
3
4
5
encoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
# Now we run the clustering algorithm. This function compares images aganist 
# all other images and returns a list with the pairs that have the highest 
# cosine similarity score
processed_images = util.paraphrase_mining_embeddings(encoded_image)
И дальше код вроде понятно стало а как закрыть цикл ? Всмысле как показать что вот такой большой код это всё нужно выполнять в цикле

Добавлено через 20 минут
Написал вот так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
filename = "massiv_img.txt"
# Открываем файл для чтения
with open(filename, "r") as f:
    # Считываем все строки из файла и сохраняем их в список
    image_1 = [line.rstrip() for line in f]
 
odin_image = Image.open('2323.jpg')
 
for item in image_1:
    image_names = [odin_image, item]
    ncoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
    processed_images = util.paraphrase_mining_embeddings(ncoded_image)
    NUM_SIMILAR_IMAGES = 10
Падает ошибка
Python
1
2
3
4
5
6
 File "img.py", line 28, in <module>
    ncoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
  File "img.py", line 28, in <listcomp>
    ncoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
  File "python3.7/site-packages/PIL/Image.py", line 3245, in open
    prefix = fp.read(16)
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
08.05.2023, 10:10
Лучший ответ Сообщение было отмечено AnteFil как решение

Решение

Цитата Сообщение от AnteFil Посмотреть сообщение
Блин почему PYTHON такой трудный.
привычка свыше нам дана, замена счастию она


Цитата Сообщение от AnteFil Посмотреть сообщение
Дальше кодируем в модель
Не так... Вы же очень желаете попарное сравнение...
Цитата Сообщение от AnteFil Посмотреть сообщение
Тока щас понял получаеться как то так
и это, не совсем так...
Поэтому:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#здесь все импорты для инициализации
...
# до определения модели:
model = SentenceTransformer('clip-ViT-B-32')
# а далее, уже так:
file = '2323.jpg'
filename = "massiv_img.txt"
with open(filename, "r") as f:
    arrfile = [line.rstrip() for line in f]
for item in arrfile:
    image_names = [file, item]
    encoded_image = model.encode([Image.open(filepath) for filepath in image_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
    # здесь весь остальной код для определения дубликатов (т.е. для каждой пары файлов он будет выполняться отдельно)
    ...
1
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
08.05.2023, 10:18
Цитата Сообщение от AnteFil Посмотреть сообщение
Я вроде понял что само сравнение происходит в этой функуии
А ты вообще как код писал? Без понимания что-ли? Зачем тебе нейросети для сравнения картинок? Какая стоит задача?
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
08.05.2023, 10:21
Цитата Сообщение от u235 Посмотреть сообщение
А ты вообще как код писал?
Код писал не ТС...
Цитата Сообщение от u235 Посмотреть сообщение
Зачем тебе нейросети для сравнения картинок? Какая стоит задача?
Цитата Сообщение от YuS_2 Посмотреть сообщение
Если правильно понял, то код не просто ищет полные дубли, а определяет и порог с оценкой "похожести", т.к. сжатие картинки не даст определить дубль ли это... видимо, для этого и затевался весь этот код...
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
08.05.2023, 10:32
YuS_2, насколько я понял, сеть из картинки создает текстовое описание.
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
08.05.2023, 10:33
u235,
Изображения в папке сравнить с заданным
0
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 38
08.05.2023, 11:56  [ТС]
Хвала богам и YuS_2 всё заработало. Теперь только проблемка с результатами. Они печатаются после сравнения. Можно ли как сделать что бы они не печатались а например записывались в массив и после выполнения скрипта распечатать максимальный процент.

Добавлено через 1 час 12 минут
Разобрался сохраняю в массив результат
Python
1
2
3
4
5
6
 my_array.append(round(score * 100))
#После цикла
# находим максимальное значение
max_num = max(my_array)
# печатаем результат
print(max_num)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2023, 11:56
Помогаю со студенческими работами здесь

Сравнить набор чисел с заданным числом
Даны целые числа K, N и набор из N целых чисел. Если в наборе имеются числа, меньшие K, то вывести True; в противном случае вывести False. ...

Проверить есть ли файл с заданным именем в папке
Здравствуйте. Мне необходимо проверить есть ли файл с таким именем в папке, и если есть, то записать в него данные. Записать и я...

Список файлов в папке с заданным периодом отбора
Доброго времени суток ВСЕМ! Возможно ли изменить Код, что бы можно было задавать период по &quot;по дате создания&quot;, и в &quot;Список...

Сравнить введённый год рождения с заданным в программе
Написать программу , в которой : a. запрашивается год рождения студента, b. сравнивается введенная информация со значением строковой...

Как из Edit первый символ сравнить с заданным
помогите сделать задачу, которая заключается в следующем: ЕСть форма с 5-ю эдитами, кнопкой и одним чекбоксом.. в эдиты вводятся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru