πŸ–ΌοΈ Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° изобраТСния Π½Π° ΠΏΠΎΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python?

Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° изобраТСния Π½Π° ΠΏΠΎΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ Π² Python?

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


import cv2

def compare_images(image1_path, image2_path):
    image1 = cv2.imread(image1_path)
    image2 = cv2.imread(image2_path)

    difference = cv2.subtract(image1, image2)
    result = not cv2.countNonZero(difference)

    return result

image1_path = 'ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ1.jpg'
image2_path = 'ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ2.jpg'

is_similar = compare_images(image1_path, image2_path)

if is_similar:
    print("Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΡ…ΠΎΠΆΠΈ")
else:
    print("Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ")

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ compare_images, которая Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄Π²Π° изобраТСния, сравниваСт ΠΈΡ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True, Ссли ΠΎΠ½ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹, ΠΈ False, Ссли ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΠΈ ΠΊ изобраТСниям Π½Π° свои собствСнныС.

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

Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° изобраТСния Π½Π° ΠΏΠΎΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

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

1. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ пиксСлСй

Один ΠΈΠ· самых простых способов ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° изобраТСния - это ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль изобраТСния ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… сходство. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PIL (Python Imaging Library) для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.


from PIL import Image

def compare_images(image1_path, image2_path):
    image1 = Image.open(image1_path)
    image2 = Image.open(image2_path)
    
    width, height = image1.size
    
    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
    if image1.size != image2.size:
        return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹"
    
    # Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
    for x in range(width):
        for y in range(height):
            pixel1 = image1.getpixel((x, y))
            pixel2 = image2.getpixel((x, y))
            
            if pixel1 != pixel2:
                return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ"
    
    return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹"

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
image1_path = "ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ1.jpg"
image2_path = "ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ2.jpg"
result = compare_images(image1_path, image2_path)
print(result)
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΄Π²Π° изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PIL ΠΈ провСряСм ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ сравниваСм ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ getpixel(). Если хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ пиксСль отличаСтся, ΠΌΡ‹ считаСм, Ρ‡Ρ‚ΠΎ изобраТСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹.

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

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° OpenCV прСдоставляСт Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ для сравнСния Π΄Π²ΡƒΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΠΎΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ.


import cv2

def compare_images(image1_path, image2_path):
    image1 = cv2.imread(image1_path)
    image2 = cv2.imread(image2_path)
    
    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
    if image1.shape != image2.shape:
        return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹"
    
    # Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сравнСния срСдних ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… ошибок
    difference = cv2.subtract(image1, image2)
    result = not difference.any()
    
    if result:
        return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹"
    else:
        return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ"

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
image1_path = "ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ1.jpg"
image2_path = "ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ2.jpg"
result = compare_images(image1_path, image2_path)
print(result)
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cv2.subtract() ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV для вычислСния Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя изобраТСниями. Если Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ изобраТСниями Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹.

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

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° dHash (Difference Hash) прСдоставляСт простой ΠΈ эффСктивный способ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° изобраТСния Π½Π° ΠΈΡ… ΠΏΠΎΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ.


from PIL import Image
import dhash

def compare_images(image1_path, image2_path):
    image1 = Image.open(image1_path)
    image2 = Image.open(image2_path)
    
    # ВычисляСм Ρ…ΡΡˆ для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
    hash1 = dhash.dhash_int(image1)
    hash2 = dhash.dhash_int(image2)
    
    # Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Ρ…ΡΡˆΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
    if hash1 - hash2 == 0:
        return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹"
    else:
        return "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ"

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
image1_path = "ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ1.jpg"
image2_path = "ΠΏΡƒΡ‚ΡŒ_ΠΊ_ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ2.jpg"
result = compare_images(image1_path, image2_path)
print(result)
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dhash_int() ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ dHash для вычислСния Ρ…ΡΡˆΠ΅ΠΉ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ сравниваСм эти Ρ…ΡΡˆΠΈ. Если Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ…ΡΡˆΠ°ΠΌΠΈ Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ изобраТСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹.

Π’Ρ‹Π²ΠΎΠ΄

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΈΡ… ΠΏΠΎΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ Π² Python ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с использованиСм Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ². ΠœΡ‹ рассмотрСли Ρ‚Ρ€ΠΈ способа: сравнСниС пиксСлСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ PIL, сравнСниС с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV ΠΈ сравнСниС с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ dHash. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ свои прСимущСства ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ Π² зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π° Π·Π°Π΄Π°Ρ‡ΠΈ.

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

Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ„ΠΎΡ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ синхронно ?

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ². НСсколько строк ΠΊΠΎΠ΄Π° ΠΈ Π²Ρ‹ сравнили Ρ„Π°ΠΉΠ»Ρ‹, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ.

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

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

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π° str Π² Python? πŸ’»πŸ РазбираСмся с основами

Как ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° python Π² atom? ПолноС руководство

Команда def Π² Python: Ρ‡Ρ‚ΠΎ это ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ? 🐍

πŸ–ΌοΈ Как ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° изобраТСния Π½Π° ΠΏΠΎΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python?

πŸ”Œ Как ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ tkinter Π² python 3: простая инструкция ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°

πŸ”€ Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ рСвСрс строки Π² Python: простой способ

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ запись Python: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС πŸ”πŸ