Python+PIL вычисляет сходство двух изображений и возвращает x-координату первого несовпадающего пикселя (с полным кодом)

предисловие

Несколько дней назад я увидел статью о работе Python+selenium+Super Eagle на коде проверки слайдера.Общая идея такова:

1. Сделайте снимок экрана с проверочным кодом слайдера.

2. Используйте API Super Eagle для обработки изображения,

3. Вернуть расстояние ползунка

Я тоже давно столкнулся с подобной потребностью.В то время мой друг написал для меня код, который использовал PIL для анализа точек пикселей двух изображений, чтобы вернуть точки пикселей оси x двух картинки.

Например, у меня есть две картинки:

вставьте сюда описание изображениявставьте сюда описание изображения

Эти две картинки совершенно одинаковые.Я намеренно нарисовал цифровой дисплей на второй картинке.Теперь мне нужно узнать длину оси x, сравнивая первую картинку со второй картинкой.

вставьте сюда описание изображения

Хорошо, без лишних слов, давайте начнем часть кода

библиотека Установить
Подушка pip установить подушку

Конкретная реализация выглядит следующим образом (Wen Xin Yi Yan Annotation):

Что делает этот код, так это вычисляет сходство двух изображений и возвращает x-координату первого несовпадающего пикселя.

1. Импортировать Imageмодуль, входящий PIL (Python Imaging Library)в состав и используемый для обработки изображений.

2. get_gapОпределена названная функция, которая принимает два объекта-изображения image1и image2в качестве параметров вычисляет сходство между двумя изображениями.

3. В get_gapфункции * определяется и инициализируется значением 0 переменная left, которая используется для записи x-координаты несовпадающего пикселя.

4. Используйте два слоя циклов для обхода image1каждого пикселя и сравнения image2, равен ли он пикселю в соответствующей позиции.

5. Если два пикселя не равны, вызовите is_pixel_equalфункцию, чтобы определить, похожи ли два пикселя.

6. is_pixel_equalФункция принимает два объекта изображения image1и image2, и сравниваемые координаты пикселей (x, y).

7. В is_pixel_equalфункции ** получить значения цвета двух пикселей через image1.load()[x, y]и **.image2.load()[x, y]

8. Определено пороговое значение thresholdдля оценки сходства двух пикселей.

9. Если значения RGB двух пикселей равны в пределах порогового диапазона, вернуть * True*, указывая, что два пикселя похожи, в противном случае вернуть False.

10 В основной функции img_cvиспользуйте , чтобы Image.openоткрыть два файла изображений 'temp_img1.png'и 'temp_img2.png', и назначить их переменным img1_и соответственно img2_.

11. Вызвать функцию * get_gap*, передать в качестве параметров img1_и img2_, получить сходство между двумя изображениями и присвоить координату x несовпадающего пикселя переменной x_pos.

12. Наконец, используйте printprint для вызова img_cvвозвращаемого значения функции, которое является координатой x несовпадающего пикселя.

Следует отметить, что этот код предполагает, что два изображения имеют одинаковый размер и сравниваются, начиная с левого верхнего угла. Если вам нужно сравнить изображения разных размеров или начать сравнение из другого места, вам необходимо изменить его соответствующим образом.

Давайте посмотрим перед запуском кода, приблизительный пиксель примерно 1063-1625=38.

Инструмент измерения, используемый на картинке, — это Snipaste, который был представлен ранее: нажмите на меня

вставьте сюда описание изображениявставьте сюда описание изображения

Демонстрация кода:

вставьте сюда описание изображения

полный код

# -*- coding: utf-8 -*-
'''
@Time    :2023/8/2 15:06
@作者    :一晌小贪欢
@联系    :187xxxxxx
'''
from PIL import Image


def get_gap(image1, image2):
    left = 0
    for i in range(left, image1.size[0]):
        for j in range(image1.size[1]):
            if not is_pixel_equal(image1, image2, i, j):
                left = i
                return left
    return left


def is_pixel_equal(image1, image2, x, y):
    pixel1 = image1.load()[x, y]
    pixel2 = image2.load()[x, y]
    threshold = 60
    if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
            pixel1[2] - pixel2[2]) < threshold:
        return True
    else:
        return False


def img_cv():
    img1_ = Image.open('temp_img1.png')
    img2_ = Image.open('temp_img2.png')
    x_pos = get_gap(img1_, img2_)
    return x_pos


print(img_cv())

Я лично считаю, что этот код по-прежнему очень практичен.Исходный код был использован в коде проверки слайдера.

Я надеюсь, что все должны помочь

Маленький программист, посвященный автоматизации делопроизводства#

Я это видел, подписывайтесь + лайк + в закладки = не теряйтесь! !

Если вы хотите узнать больше об автоматизации офиса Python, обратите внимание!

рекомендация

отblog.csdn.net/weixin_42636075/article/details/132054037