Сравните обрезанные изображения Python OpenCV - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу сравнить два изображения, чтобы проверить, равны они или нет, но для этого мне нужно сравнить конкретный регион (ROI) обоих изображений.Я обрезал области, которые я хочу сравнить, но теперь я хотел бы знать, как я могу сделать этот процесс, потому что я не могу напрямую сравнить обрезанные изображения.Как я могу, например, получить средние значения пикселей обоих обрезанных изображений и сравнить их?

Обновление: я решил ситуацию.Текущий код:

import cv2
import numpy as np
from skimage.measure import compare_ssim as ssim


def mse(imageA, imageB):
    # the 'Mean Squared Error' between the two images is the sum of the squared difference between the two images;
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2) 
    err /= float(imageA.shape[0] * imageA.shape[1])


polarity_ok = cv2.resize(cv2.imread("polarity_OK_edited.jpg"),None,fx=0.2, fy=0.2) #resize the image to be smaller
polarity_nok = cv2.resize(cv2.imread("Polarity_NOK1.JPG"), None,fx=0.2, fy=0.2) #resize the image to be smaller

polarity_ok_cropped = polarity_ok[350:408, 97:111]
polarity_nok_cropped = polarity_nok[350:408, 97:111]

polarity_ok_cropped1 = polarity_ok[359:409, 232:240]
polarity_nok_cropped1 = polarity_nok[359:409, 232:240]

polarity_ok_cropped2 = polarity_ok[118:153, 44:69]
polarity_nok_cropped2 = polarity_nok[118:153, 44:69]

polarity_ok_cropped3 = polarity_ok[94:142, 192:197]
polarity_nok_cropped3 = polarity_nok[94:142, 192:197]

m = mse(polarity_ok_cropped, polarity_nok_cropped)
s = ssim(polarity_ok_cropped, polarity_nok_cropped, multichannel=True)

diff = cv2.subtract(polarity_ok_cropped, polarity_nok_cropped)
result = not np.any(diff)

m1 = mse(polarity_ok_cropped1, polarity_nok_cropped1)
s1 = ssim(polarity_ok_cropped1, polarity_nok_cropped1, multichannel=True)

diff1 = cv2.subtract(polarity_ok_cropped1, polarity_nok_cropped1)
result1 = not np.any(diff1)

m2 = mse(polarity_ok_cropped2, polarity_nok_cropped2)
s2 = ssim(polarity_ok_cropped2, polarity_nok_cropped2, multichannel=True)

diff2 = cv2.subtract(polarity_ok_cropped2, polarity_nok_cropped2)
result2 = not np.any(diff2)

m3 = mse(polarity_ok_cropped2, polarity_nok_cropped2)
s3 = ssim(polarity_ok_cropped2, polarity_nok_cropped2, multichannel=True)

diff3 = cv2.subtract(polarity_ok_cropped3, polarity_nok_cropped3)
result3 = not np.any(diff3)


if (result and result1 and result2 and result3):
    print ("The polarity is correct. Awesome :)")
else:
    print ("Nice try, but the polarity is incorrect. Take another chance!")

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Если вы точно знаете, где находятся объекты, которые вы хотите сравнить, простой и быстрый метод, использующий OpenCV для сравнения двух изображений, - это извлечь гистограммы, используя calcHistogram() для каждого канала (RGB или HSV), а затем сравнить их, используя compareHist().

Дополнительную информацию и примеры можно найти здесь: Сравнение гистограмм.

0 голосов
/ 30 января 2019

Еще один способ сделать то же самое:

from PIL import Image
import math, operator

i1 = Image.open('./image1.png')
i2 = Image.open('./image2.png')

#this will resize any format of image file
assert i1.mode == i2.mode, "Different kinds of images."
assert i1.size == i2.size, "Different sizes."
 
pairs = zip(i1.getdata(), i2.getdata())
if len(i1.getbands()) == 1:
    # for gray-scale jpegs
    dif = sum(abs(p1-p2) for p1,p2 in pairs)
else:
    dif = sum(abs(c1-c2) for p1,p2 in pairs for c1,c2 in zip(p1,p2))
 
ncomponents = i1.size[0] * i1.size[1] * 3
print ("Difference (percentage):", (dif / 255.0 * 100) / ncomponents)

Вам необходимо установить подушку.Надеюсь, что это поможет вам.

0 голосов
/ 21 декабря 2018

Вы можете использовать Структурный индекс сходства (SSIM) , предоставляя 2 изображения в качестве входных данных и возвращая значение оценки в диапазоне [-1, 1].Оценка 1, указывающая на идеальное сходство между двумя входными изображениями (в случае, когда оба изображения равны)

from skimage.measure import compare_ssim
(score, diff) = compare_ssim(image1, image2, full=True)

Btw Преобразование входных изображений перед сравнением в оттенки серого является предпочтительным.

...