Имеется одно изображение (imA) размером 10x10px и более 60 000 изображений (imN) 10x10
Все изображения черно-белые
Задача найти минимальное количество точек, с которымичтобы отличить первое изображение (imA) от всех остальных (imN) - извините за мой плохой английский, я добавляю img и комментирую
Первое, что я сделал, это превратило все изображения в матрицу с numpy
q=0
for file in inputImages:
eachImage = os.path.join(generatorFolder, file)
a[q]=numpy.asarray(Image.open(eachImage))
q+=1
b=numpy.asarray(Image.open(templateimage))
b [y, x, color] раскрасить свой список [255,255,255]
a [1-60000, y, x, color]
Далее я использую вложенныйДля сравнения, нерекурсивный поиск с глубиной в 3 точки выглядит примерно так:
for y1 in range(b.shape[0]):
for x1 in range(b.shape[1]):
for y2 in range(b.shape[0]):
for x2 in range(b.shape[1]):
for y3 in range(b.shape[0]):
for x3 in range(b.shape[1]):
if y1==y2==y3 and x1==x2==x3:continue
check=0
for a_el in range(a.shape[0]):
if numpy.array_equal(b[y1,x1],a[a_el,y1,x1]) and \
numpy.array_equal(b[y2,x2],a[a_el,y2,x2]) and \
numpy.array_equal(b[y3,x3],a[a_el,y3,x3]):
check=1
break
if not check:return 'its unic dots'
Проблема этого кода в том, что он очень медленный.Например, у нас первое изображение отличается от всех остальных минимум на пять пунктов:
получи 100!/ 95!* 60 000 сравнений - 542 070 144 000 000
Правда, я использую немного другой алгоритм, который позволяет превратить это в: 40! / 35! * 60000 = 4.737.657.600.000, что не так уж и мало.
Есть ли способ решить мою проблему красивее, а не грубой силой.
ОБНОВЛЕНИЕ add img
![enter image description here](https://i.stack.imgur.com/sR2vE.png)
0строка: 3 других изображения (imN) 4x4
1 строка: 0 шаблонное изображение (imA) и 1-3 изображения, где отмечена красная разница (imA XOR imN)
2 строка: 0 изображениегде синим цветом отмечены две точки две точки для сравнения,
1 image green its difference, red its compare - difference yes - NEXT
2 image red its compare - difference NO - Break (these two points is not enough to say that imA differs from imN(2))
3 линия: как линия 2, другие точки
4 линия: Мы выбрали две точки, достаточно, чтобы сказать, что imA отличается отImn (1-3)