перекрывать неуместные изображения для максимального сходства и находить разницу с помощью методов кластеризации, а не сравнения пикселей - PullRequest
1 голос
/ 09 мая 2019

Я работаю для сравнения изображений, которые на 99% одинаковы и 1% разницы.Я снимаю изображение печати с помощью камеры Vision (смонтированной на фиксированной подставке).Я перепробовал все алгоритмы сравнения изображений: opencv, ImageMagic, skimage.(результат был с точностью от 80 до 90 процентов)

ссылка: «Различить» изображение с помощью ImageMagick

ссылка: Как определить количество различий между двумя изображениями?

Я реализовал все вышеупомянутое решение из вышеприведенного вопроса, чтобы найти разницу, но проблема с вышеуказанным алгоритмом заключается в том, что они работают от пикселя к пикселю.Ни один из этих алгоритмов не обеспечил более разумный подход к сравнению изображений.

После захвата изображения двух разных отпечатков одного и того же типа я делаю следующие шаги для сравнения изображений:

мой код для совмещения неуместных изображений для максимального сходства:

коддля изображения aliment:

import cv2
import numpy as np

# load image
img = cv2.imread('./photo/image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert to grayscale

retval, thresh_gray = cv2.threshold(gray, 100, maxval=255, type=cv2.THRESH_BINARY_INV)

contours, hierarchy = cv2.findContours(thresh_gray,cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mx_rect = (0,0,0,0)      
mx_area = 0
for cnt in contours:
    arect = cv2.minAreaRect(cnt)
    area = arect[1][0]*arect[1][1]
    if area > mx_area:
        mx_rect, mx_area = arect, area

x,y,w,h = cv2.boundingRect(cnt)
# cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),8)
roi_1 = img[y:y+h, x:x+w] 
cv2.imwrite('./test/Image_rec.jpg', roi_1)

print("shape of cnt: {}".format(cnt.shape))
rect = cv2.minAreaRect(cnt)
print("rect: {}".format(rect))

box = cv2.boxPoints(rect)
box = np.int0(box)
width = int(rect[1][0])
height = int(rect[1][1])

src_pts = box.astype("float32")
dst_pts = np.array([[0, height-1],
                    [0, 0],
                    [width-1, 0],
                    [width-1, height-1]], dtype="float32")
M = cv2.getPerspectiveTransform(src_pts, dst_pts)
warped = cv2.warpPerspective(img, M, (width, height))

cv2.imwrite('./crop_Image_rortate.jpg', warped)

Приведенный выше код дает требуемое изображение, т. Е. Пытается инопланетное изображение, обрезает требуемое изображение, но иногда не удается (2/10, 2 из 10не получается).

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

from PIL import Image
import numpy as np
import cv2
import scipy.misc as smp

f1= './Image_1.png'
f2= './Image_2.png'
im1 = Image.open(f1)
im2 = Image.open(f2)
img1= cv2.imread(f1)
img2= cv2.imread(f2)

# print (img1.shape)
# print (img2.shape)

w_1= img1.shape[0]
h_1= img1.shape[1]
W_1 = w_1-1
H_1 = h_1-1
c = 0
X=[]
Y=[]
R=[]
G=[]
B=[]

rgb = im1.convert('RGB')
rgb2 = im2.convert('RGB')
for x in range(H_1):
    for y in range(W_1):
        
        r1, g1, b1, = rgb.getpixel((x,y))
        t1= r1+g1+b1
        i = x
        j = y
        r2, g2, b2, = rgb2.getpixel((i,j))
        t2=r2+g2+b2
        d= t1-t2

        if d in range (-150,150):
            # print (d)
            pass
        else:
            c = c + 1
            if (c == 1):
                z=y
                
            elif (y == z+1 ):
                # print (x,y)
                i = x+1
                j = y+1
                r2, g2, b2, = rgb2.getpixel((i,j))
                t2=r2+g2+b2
                d= t1-t2

                if d in range (-150,150):
                    # print (d)
                    pass
                    
                else:
                    X.append(x)
                    Y.append(y)
                    R.append(r1)
                    G.append(g1)
                    B.append(b1)

            z=y
            z1=y  # to make group of 2. 


try: 
    data = np.zeros( (h_1,w_1,3), dtype=np.uint8 )

    length = len(X)
    print ("total pixel difference : ",length)

    for i in range(length):
        data[X[i],Y[i]] = [R[i],G[i],B[i]]

    img = Image.fromarray( data, 'RGB' )
    img.save('./test/new.png')
    img.show()
except:
    print ("Error during image creation. ")

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

Но проблема остается той же, сравнение пиксель за пикселем.

Существует ли надлежащая методика кластеризации, которая будет нацелена на правильное различие.

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

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

Образец изображения:

Изображение 1: Изображение 1

Изображение 2: Изображение 2

ПринятоВывод: Допустимый вывод

вывод после разницы:

вывод

Спасибо.

...