Что нового

[Автоматизация] Поиск одинаковых точек в группе изображений

vaf

Новичок
Сообщения
186
Репутация
2
Добрый день уважаемые форумчане. Делаю скрипт распознавания сложного текста из графических файлов. И встала следующая промежуточная задача.
Дано скажем 100 картинок 150x150 точек, как бы их все "просмотреть" и создать один файл (скажем png) чтобы на нем были изображены все общие точки которые имеют одинаковый цвет (пусть будет черный).
Для чего нужно ? Для поиска общих точек одной плохо читаемой буквы проанализировав множество картинок. чем больше картинок тем точнее можно найти совпадения. я думаю смысл понятен. делал это вручную, но это нереально, на один символ уходит пол дня времени.
Алгоритм примерно такой. Находим первую черную точку, запоминаем ее координаты, потом последовательно открываем все файлы и смотрим есть ли такая по тем же координатам. если есть то в создаваемом графическом файле с общими точками ставим ее, если нет, то ищем следующую черную точку и так же смотрим по всем файлам. и т.д.

P.S. Чтобы было более понятно что я хочу, прилагаю файлик, со слоями в нем есть слой с общими точками. http://yadi.sk/d/HMK0zNPZJk3jg
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
vaf
Можно сразу преобразовать все файлы в массив пикселей, и потом уже в этом массиве сравнивать:

Код:
#include <GDIPlus.au3>
#include <Array.au3>
#include <File.au3>

Global $aC
$aC = _FileListToArray(@ScriptDir, '*png', 1)

_GDIPlus_Startup()
$hBitmap1 = _GDIPlus_BitmapCreateFromFile($aC[1])
$Width =_GDIPlus_ImageGetWidth ($hBitmap1)
$Height = _GDIPlus_ImageGetHeight($hBitmap1)
_GDIPlus_BitmapDispose($hBitmap1)

Global $aMatrix[$Width*$Height + 1][$aC[0] + 1]

For $i = 1 To $aC[0]
	$hBitmap1 = _GDIPlus_BitmapCreateFromFile($aC[$i])
	$Width = _GDIPlus_ImageGetWidth($hBitmap1)
	$Height = _GDIPlus_ImageGetHeight($hBitmap1)
	$tMap = _GDIPlus_BitmapLockBits($hBitmap1, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
	$bData1 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
	_GDIPlus_BitmapUnlockBits($hBitmap1, $tMap)
	_GDIPlus_BitmapDispose($hBitmap1)
	$bData1 = '######FF' & $bData1
	$aTemp = StringRegExp($bData1, '.{8}', 3)
	$aTemp[0] = UBound($aTemp) - 1

	For $j = 1 To $aTemp[0]
		$aMatrix[$j][$i] = $aTemp[$j]
	Next
Next
_GDIPlus_Shutdown()


For $j = 1 To UBound($aMatrix) - 1
	$aMatrix[$j][0] = 0
	For $i = 2 To UBound($aMatrix, 2) - 1
		If $aMatrix[$j][1] = $aMatrix[$j][$i] Then $aMatrix[$j][0] += 1
	Next
Next

_ArrayDisplay($aMatrix)
 
Верх