Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
однако гиф изображения не подходят для классификации ввиду сильного сжатияОни-то как раз и показывают реальное совпадение/различие (0,02), которое даёт алгоритм. А когда затем стали использовать не по одному изображению, а цветные изображения, бинаризованные способом из первой статьи, то фактически стали сравнивать крупные «низкочастотные» пятна на них. Вот и выросло «совпадение» с 0,02 до 0,15.
def PicDist(P1,P2)
sum =0
for x in range(X):
for y in range(Y):
for C in ['R','G','B']:
sum += sqrt(abs(P1[x][y][C]**2 - P2[x][y][C]**2))
return sum


import pygame
import os
import numpy as np
#from math import sqrt
P1 = pygame.surfarray.array3d(pygame.image.load(os.path.join("Pictures","TestImage1.png")))
P2 = pygame.surfarray.array3d(pygame.image.load(os.path.join("Pictures","TestImage2.png")))
P3 = pygame.surfarray.array3d(pygame.image.load(os.path.join("Pictures","TestImage3.png")))
(R,G,B) = (0,1,2)
Sum12 = Sum13 = Sum23 = 0
for x in range(512):
for y in range(512):
for color in (R,G,B):
Sum12 += abs(float(P1[x][y][color]) - float(P2[x][y][color]))
Sum13 += abs(float(P1[x][y][color]) - float(P3[x][y][color]))
Sum23 += abs(float(P2[x][y][color]) - float(P3[x][y][color]))
Norma = 255*3*(512**2)
N12 = Sum12/Norma
N13 = Sum13/Norma
N23 = Sum23/Norma
def makeMono(Array):
New_Array = np.zeros(Array.shape)
for x,row in enumerate(Array):
for y,(R,G,B) in enumerate(row):
New_Array[x][y] = int((0.299*R**2 + 0.587*G**2 + 0.114*B**2)**0.5)
return New_Array[:,:,0]
Pm1 = makeMono(P1)
Pm2 = makeMono(P2)
Pm3 = makeMono(P3)
SumM12 = SumM13 = SumM23 = 0
for x in range(512):
for y in range(512):
SumM12 += abs(float(Pm1[x][y]) - float(Pm2[x][y]))
SumM13 += abs(float(Pm1[x][y]) - float(Pm3[x][y]))
SumM23 += abs(float(Pm2[x][y]) - float(Pm3[x][y]))
Norma = 255*(512**2)
Nm12 = SumM12/Norma
Nm13 = SumM13/Norma
Nm23 = SumM23/Normaкак их преобразовать в проценты?* 100

Хм. NumPy умеет в векторизованные операции. Первые 3 цикла заменяются строкой наподобие [N1,N2,N3] = np.average(np.abs(np.subtract(a,b)),axis=(0,1)) / 255 и т.д., это будет работать быстрее.
Машинный анализатор. Часть 4. Классификатор