Программа с глазами Филипп Коряка Хакер, номер #073, стр. 073-120-3 my $zcount=0; for ($i=0; $i<47; $i++){ my $zerro=1; for ($j=0; $j<20; $j++){ $zerro = 0 if ($img-> getPixel($i, $j) != 0); } if ($zerro){ $zcount++; push (@beg, ($i - 3)) if ($zcount == 3); } else{ push (@end, $i) if ($zcount > = 3); $zcount=0; } } Теперь в массиве @beg находятся координаты начала разделителей, а в массиве @end координаты конца. Используя их не представляет никакого труда выделить из изображения отдельные цифры. Затем потребуется так же обрезать уже полученные цифры слева и сверху так, что бы в левом столбце и в самой верхней строке обязательно был хотя бы один пиксел, отличный от нуля. С этим легко справляется следующая функция: sub remove_zerro{ my $img = $_[0]; my $zerro=1; for ($i=0; $i<20, $zerro; $i++){ for ($j=0; $j<20; $j++){ $zerro = 0 if ($img-> getPixel($j, $i) != 0); } if (!$zerro){ $img-> copy($img,0,0,0,$i,20,20); } } $zerro=1; for ($i=0; $i<20, $zerro; $i++){ for ($j=0; $j<20; $j++){ $zerro = 0 if ($img-> getPixel($i, $j) != 0); } if (!$zerro){ $img-> copy($img,0,0,$i,0,20,20); } } } Сравнение с эталоном Наконец приступаем к завершающей стадии: сравнению выделенных цифр с эталоном. Для этого нам понадобится заготовить эталоны для каждой цифры от 0 до 9. Можно поступить просто: изменить алгоритм таким образом, чтобы в заключительной части, вместо сравнения с эталоном, осуществлялось сохранение разделенных и обработанных цифр на диск. Далее остается только прогнать через программу необходимое число изображений, чтобы получить все десять эталонов. Но следует отметить, что от качества эталона зависит качество распознавания. Используя плохие эталоны можно легко попасть в ситуацию, когда программа будет путать 5 и 3, 9 и 8 и т.д. А поскольку, в описываемом способе мы берем в качестве эталона восстановленное изображение, то результат, скорее всего, будет не очень хорошим. Конечно, можно обратиться к программистам, написавшим данный вид защиты и попросить их изготовить нам эталоны, но более действенным способом кажется взятие за основу цифр полученных при помощи данной программы, обработанных в графическом редакторе. Обработка заключается в ручном удалении лишних точек, если они есть и нанесении недостающих. Таким образом, в результате ручной обработки у нас должны получиться чистые качественные эталоны, совпадающие на 100% с тем, что наносится на изображение до зашумления. Само сравнение происходит достаточно просто. Необходимо поочередно сравнить распознаваемую цифру с десятью эталонами. В процессе сравнения поочередно сравнивается каждый пиксел исходного изображения с каждым пикселом эталонного изображения. При этом подсчитывается общее количество пикселов цвета 1 в эталонном изображении и количество совпавших пикселов. Следует заметить, что совпадение проверяется только для пикселов цвета 1, а нулевые пикселы при сравнении игнорируются. Таким образом, степень соответствия равняется отношению общего числа пикселов цвета 1 к числу совпадений. Изображения с максимальной степенью соответствия будем считать одинаковыми. Эта мысль реализуется следующим образом: |