продолжу... хотя уже и так всё ясно.
Выбор методов сравненияДа решил находить пары с однонаправленным изменением цвета. Проанализировав данные одинаковых картинок стало понятно, что один цвет может изменяться в другом направлении. Счёл это допустимым.
Сначала хотелось сделать попроще, сравниваем числа первого объекта с числами второго. Если значение цвета больше присваиваем этому цвету +1, меньше -1
329 363 81 2 405 40
375 404 93 0 459 47
+1 +1 +1 -1 +1 +1
Потом складываем результат и берём по модулю
+1+1+1-1+1+1 = |4| = 4
Если в результате получаем 4 или 5 или 6, значит разнонаправленных не больше 1.
Если 2 или 3 - больше и картинки не совпадают.
Это был самый предварительный этап. Просмотрев тщательней, стало понятно что иногда разнонаправленных два из-за малых и близких значений в одном из них (те же 2 и 0). Решил ввести допуск или мёртвую зону для очень похожих значений и независимо от направленности изменений в этой паре засчитывать её как подходящую.
Так же было решено ограничить различие по величине даже однонаправленных значений. Если , например, большинство пар идёт на увеличение, а одно из значений меняется сильно (было 50 стало 480 или 700) то признавать пару цветов как негодную. Задавать разницу в процентах отсчитывая от большего значения.
И мёртвую зону $mz и процент различия $proc вынес в настройки скрипта для дальнейшего подбора и уточнения.
Сразу выбрал их ориентируясь на 5 капч в размере
$mz = 10 // пикселов
$proc = 40 // процентов, не более
Проходимся по 6 парам и чтобы не проходить 2 и 3 раза, сразу сравнивая присваиваем паре статус
$true = ... значения близкие, в пределах мёртвой зоны $mz
$false = ... значения отличающиеся более чем на $proc процентов
$plus = ... значения увеличиваются
$minus = ... значения уменьшаются
По ходу проверяем, если $false достигло больше 1 или $true больше 4 прерываем чтобы не тратить время и возвращаем результат "НЕ похожи" и "похожи" соответственно.
После прохода, смотрим каких больше плюсов ($plus) или минусов ($minus) большее значение превращаем в $true, меньшее в $false. Напомню, для признания картинок одинаковыми $false не должно быть больше 1 (одного).
329 363 81 2 405 40
375 404 93 0 459 47
$plus $plus $plus $true $plus $plus
$true $true $true $true $true $true
Подпрограмма сравнения пары картинок
SUB(para, $n1, $n2) //==========================================================
$true = 0
$false = 0
$plus = 0
$minus = 0
FOR($i=0, $i<6)
$e1 = $data[$n1*6+$i]
$e2 = $data[$n2*6+$i]
$d = $e1 - $e2
IF(($d < ($mz+1)) & ($d > (($mz+1)*-1)))
INC($true)
ELSE
IF($d > 0)
IF(($e1-$e1/100*$proc) > $e2)
INC($false)
ELSE
INC($minus)
END_IF
ELSE
IF(($e2-$e2/100*$proc) > $e1)
INC($false)
ELSE
INC($plus)
END_IF
END_IF
IF($false > 1)
$result = 0
$i = 10
ELSE
IF($true = 4)
$result = 1
$i = 10
END_IF
END_IF
END_IF
END_CYC
IF($i ! 10)
IF((($plus + $false) > 1) & (($minus + $false) > 1))
$result = 0
ELSE
$result = 1
END_IF
END_IF
END_SUB
Чаще всего в ответ попадала одна похожая пара, это и был ответ. Кликали по любой картинке из пары в случайном порядке.
Вот подходящая пара картинок 4-5.
Иногда лишняя картинка очень похожа на основные (по цветам и направлению) и тогда в ответ попадали две пары, как здесь...
Похожие пары 2-3 и 2-5.
Хорошо что нам можно кликать по любой из двух одинаковых в паре. В этих двух парах общая картинка №2, если кликнем по ней не ошибёмся.
В итоге с первой же проверки правильно разгадало 5 капч.
Дальнейшее тестирование человеком на большей выборке, дало результат
22 из 30 правильных ответов
~73% уже не плохо.
На остальных не нашло пар. Просмотрев результаты значений, нашёл, что у самого худшего варианта мёртвую зону $mz нужно поднять до 13, и процент $proc до 56. Тогда в результате пара признавалась валидной.
Товарищ предложил сделать более точное разделение на картинки. Как здесь и писали, анализируя в цикле все столбцы шириной в 1 пиксель, только не картинкой, а подсчётом цвета фона.
Анализируемая область у нас высотой 60 пикс. Т.к. есть случаи где соседние картинки наползают областями друг на друга и вертикального полного столбца фона между ними нет, берём допустимое значение в 57 пикселов.
После добавления разделения по фону и изменения настроек
$mz = 12 // допуск
$proc = 60 // процент
нашло
29 из 30 , что
~ 96,6%На что результат счёл приемлемым и дальнейших изменений не было. Кода с разделением по фону я не писал, у меня только предыдущий вариант.
Так как решение капчи оказалось на удивление быстрым по времени я предложил использовать динамические допуски.
Чтобы сразу не задирать значения и не спутывать решения которые выполняются на малых значениях.
Вывести весь анализ в подпрограмму и вызывать её изменяя значения $mz, $proc начиная с
$mz = 15
$proc = 40
при не нахождении решения поднимать $mz на 5, а $proc на 20 и вызывать снова.
По идее ~75% решится на первом же вызове, ещё ~20% на втором и оставшиеся 3-5% должны на третьем.
Ввиду отсутствия возможности проводить тесты на натуре и отсутствие практического применения лично для меня. Дописывать скрипт не стал. Есть только вариант ещё до динамического разделения (во вложении).
Всем спасибо, все свободны.
Нафига писал, сам не знаю.