πŸ” Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Python: Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ инструмСнты

Для сравнСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PIL (Python Imaging Library) ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ imagehash. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:


from PIL import Image
import imagehash

# Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ изобраТСния
image1 = Image.open('ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.jpg')
image2 = Image.open('ΠΏΡƒΡ‚ΡŒ_ΠΊ_Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.jpg')

# ВычислитС Ρ…ΡΡˆ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
hash1 = imagehash.average_hash(image1)
hash2 = imagehash.average_hash(image2)

# Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Ρ…ΡΡˆΠΈ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ сходство Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…
similarity = 1 - (hash1 - hash2) / len(hash1.hash)  # Π§Π΅ΠΌ Π±Π»ΠΈΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊ 1, Ρ‚Π΅ΠΌ большС сходство

# Π’Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
print(f'Бходство ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ: {similarity * 100}%')
    

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΡ€Π΅Π΄Π½ΡŽΡŽ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (average hash), которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ…ΡΡˆ-ΠΊΠΎΠ΄. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ вычисляСм сходство Π΄Π²ΡƒΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΈΡ… Ρ…ΡΡˆΠ΅ΠΉ. Π§Π΅ΠΌ Π±Π»ΠΈΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊ 1, Ρ‚Π΅ΠΌ большС изобраТСния ΠΏΠΎΡ…ΠΎΠΆΠΈ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π°.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Python

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ Π² Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ автоматичСском ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² изобраТСниях, поискС Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ сходства ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ изобраТСниями. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим нСсколько способов сравнСния ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ Π² Python ΠΈ прСдоставим ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°.

1. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ PIL

Python Imaging Library (PIL) - это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая прСдоставляСт мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с изобраТСниями. Она позволяСт Π½Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ пиксСлям изобраТСния ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈΡ… значСния. Для Π½Π°Ρ‡Π°Π»Π° установим Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PIL:

pip install Pillow

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сравниваСт Π΄Π²Π° изобраТСния с использованиСм срСднСквадратичной разности:

from PIL import Image
import math

def compare_images(image1, image2):
    img1 = Image.open(image1)
    img2 = Image.open(image2)

    h1 = img1.histogram()
    h2 = img2.histogram()

    rms = math.sqrt(sum((h1[i] - h2[i])**2 for i in range(len(h1))))

    return rms

result = compare_images('image1.jpg', 'image2.jpg')
print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния:", result)

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция compare_images ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π° изобраТСния ΠΈ вычисляСт гистограммы для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ изобраТСния. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° вычисляСт ΡΡ€Π΅Π΄Π½Π΅ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ гистограммами ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

2. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° OpenCV прСдоставляСт Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ инструмСнты для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с изобраТСниями, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния исходных пиксСлСй, вычислСния структурированных сходств ΠΈ поиска ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… особСнностСй ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Установим Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ OpenCV:

pip install opencv-python

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сравниваСт Π΄Π²Π° изобраТСния с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния пиксСлСй:

import cv2

def compare_images(image1, image2):
    img1 = cv2.imread(image1)
    img2 = cv2.imread(image2)

    difference = cv2.subtract(img1, img2)
    result = not cv2.countNonZero(difference)

    return result

result = compare_images('image1.jpg', 'image2.jpg')
print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния:", result)

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция compare_images Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄Π²Π° изобраТСния ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ subtract ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV для вычислСния Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ пиксСлями ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ countNonZero для подсчСта Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… пиксСлСй Π² Ρ€Π°Π·Π½ΠΈΡ†Π΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния.

3. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ scikit-image

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° scikit-image Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с изобраТСниями, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ инструмСнты для сравнСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Установим Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ scikit-image:

pip install scikit-image

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сравниваСт Π΄Π²Π° изобраТСния с использованиСм структурного сходства:

from skimage.measure import compare_ssim
from skimage import io

def compare_images(image1, image2):
    img1 = io.imread(image1)
    img2 = io.imread(image2)

    similarity = compare_ssim(img1, img2)

    return similarity

result = compare_images('image1.jpg', 'image2.jpg')
print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния:", result)

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция compare_images ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ compare_ssim ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ scikit-image для вычислСния структурного сходства ΠΌΠ΅ΠΆΠ΄Ρƒ двумя изобраТСниями. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли нСсколько способов сравнСния ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ Π² Python с использованиСм Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠœΡ‹ использовали Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ PIL, OpenCV ΠΈ scikit-image, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сравнСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Какой ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ - зависит ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… потрСбностСй ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΅ΡΡ‚ΡŒ свои прСимущСства ΠΈ ограничСния. РСкомСндуСтся ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящий для вашСго ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ случая.

НадСюсь, эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Python. УспСхов Π² Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…!

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

CΡ€Π°Π²Π½Π΅Π½ΠΈe ΠΈΠ·ΠΎΡ€Π°ΠΆΠ΅Π½ΠΈΠΉ с Python + Pillow

РаспознаваниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Python | Поиск ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ | TensorFlow, PixelLib

Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½ Photoshop. Pillow, ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„ΠΎΡ‚ΠΎ-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

πŸ”₯ Как ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π½ΡƒΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ числа python быстро ΠΈ просто

Как ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС вхоТдСния Π² строкС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python? πŸš€

🐍 ΠŸΠΈΡ‚ΠΎΠ½: язык программирования - Π§Ρ‚ΠΎ это ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

πŸ” Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Python: Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ инструмСнты

❓ Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π° print Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅? 🐍 Π£Π·Π½Π°ΠΉΡ‚Π΅ просто ΠΈ понятно! πŸ“œ

πŸ“š Как вывСсти массив Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π±Π΅Π· ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок: ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌ простыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

πŸ” Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния ΠΈΠ· Ρ‡Π°Ρ‚Π° Π² Telegram с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python 🐍