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

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

07.05.2023, 08:26. Показов 1275. Ответов 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
07.05.2023, 10:08
AnteFil, а какой злодей-террорист заставляет тебя решать задачу, которая тебе даже близко не по плечу?
Ты в список читаешь текст, а изображение читаешь как байты) как ты собрался текст с байтами сравнивать?

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

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

исправляюсь
AnteFil, вот тут есть варианты сравнения файлов, в том числе если они разных размеров но картинка одна
https://stackoverflow.com/ques... python-pil
1
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
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
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
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
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
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
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
08.05.2023, 10:18
Цитата Сообщение от AnteFil Посмотреть сообщение
Я вроде понял что само сравнение происходит в этой функуии
А ты вообще как код писал? Без понимания что-ли? Зачем тебе нейросети для сравнения картинок? Какая стоит задача?
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
08.05.2023, 10:21
Цитата Сообщение от u235 Посмотреть сообщение
А ты вообще как код писал?
Код писал не ТС...
Цитата Сообщение от u235 Посмотреть сообщение
Зачем тебе нейросети для сравнения картинок? Какая стоит задача?
Цитата Сообщение от YuS_2 Посмотреть сообщение
Если правильно понял, то код не просто ищет полные дубли, а определяет и порог с оценкой "похожести", т.к. сжатие картинки не даст определить дубль ли это... видимо, для этого и затевался весь этот код...
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
08.05.2023, 10:32
YuS_2, насколько я понял, сеть из картинки создает текстовое описание.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru