Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизРаспознование Текста с сканера! Найти похожие ветки
← →
pavels777 (2006-11-12 22:39) [0]Уважаемые друзья!
Мне задали сделать программу которая распознаёт буквы, отсканированные с плохого листа бумаги.
Функцию очистки от шума я сделал. а вот сравнение с шаблоном в масиве сделать не получаеться :(
Я делал по сравнению количества чёрных пикселей, но ето приводит к неправильному результату!
Помогите пожалуйста!!
← →
Palladin © (2006-11-12 22:41) [1]девствительно... вот уж в орешник так в орешник...
ему задали сделать программу... фигасе... да еще с плохого листа бумаги... и то правда... контрольная работа для школьника...
← →
pavels777 (2006-11-12 22:44) [2]Ребята а может поможите?
← →
pavels777 (2006-11-12 22:44) [3]Ребята а может поможите?
← →
DrPass © (2006-11-12 22:46) [4]
> pavels777 (12.11.06 22:44) [3]
Мы бы с радостью, да вот одна заминка - мой знакомый как раз занимался распознаванием букв в изображении... он эту работу делал четыре года, и получил за нее звание кандидата технических наук. У тебя есть столько времени?
← →
Percent (2006-11-12 22:48) [5]Функцию очистки от шума я сделал
Это похвально. Какими алгоритмами ты пользовался?
Я делал по сравнению количества чёрных пикселей, но ето приводит к неправильному результату!
Ты неправильно написал программу.
Помогите пожалуйста!!
Чем тебе помочь?
← →
pavels777 (2006-11-12 22:50) [6]очистка от шумов (слабый цвет или другой цвет:)
begin
for y := 0 to Image1.Picture.Bitmap.Height - 1 do
for x := 0 to Image1.Picture.Bitmap.Width-1 do begin
Color := image1.Canvas.Pixels[x,y];
if Color > $00878787
then
image1.Canvas.Pixels[x,y]:=$00FFFFFF;
if Color < $00878787
then
image1.Canvas.Pixels[x,y]:=$00000000;
end;
← →
Ketmar © (2006-11-12 22:52) [7]мда. если это -- очистка от шумов, то я точно танцую лучше Майи Плисецкой.
← →
Kolan © (2006-11-12 22:53) [8]Можешь использовать простейший алгоритм шаблона, но для букв врядли получится. Нейроннаня сеть - вариант 2...
← →
pavels777 (2006-11-12 22:54) [9]:)
но ето приметивная очистка. для перебора с шаблонами букв наверно подойдёт,
← →
Palladin © (2006-11-12 22:55) [10]
> [6] pavels777
поможем... обязательно поможем понять, что даже простейшее определение примитивов стоит дипломной работы... если не больше... а то что ты там привел по поводу шумов это это знаешь... как уборка в квартире при помощи бульдозера...
← →
Percent (2006-11-12 22:56) [11]Если у сканера шумы распределяются по такому закону, то в топку его, этот сканер.
← →
Kolan © (2006-11-12 22:57) [12]Нет если буквы, то шаблон лучьше не брать ошибаться будет он для чисел годится. Начни с выделения букв для этого можно использовать "проход фронтом". Те есть строка на картинке:
абв
Идешь как-бы фронтом просматривая пикселы и находишь буквы...
Распознавание букв шаг 2
← →
pavels777 (2006-11-12 22:59) [13]Я тут кое что нашол
{ ýòîé ÷àñòè è ïðîèñõîäèò ðàñïîçíàâàíèå}
{*} repeat
{Îáíóëÿåì âñå ìàññèâû}
{*} for i:=0 to 9 do
{*} begin
{*} dig[i]:=0;
{*} s[i]:=0;
{*} pos_x[i]:=0;
{*} pos_y[i]:=0;
{*} end;
{*} for x:=dx to dx+mask_width-1 do
{*} for y:=0 to 9 do {Îïðåäåëåííàÿ îáëàñòü íà êàðòèíêå}
{*} begin
{*} for i:=0 to 9 do s[i]:=0;
{*} for x_:=0 to mask_width-1 do
{*} for y_:=0 to mask_height-1 do {Áåðåì ïî î÷åðåäè âñå òî÷êè èç ìàñêè}
{*} begin
{*} for i:=0 to 9 do begin {Ïîäñòàâëÿåì âñå ìàñêè ïî î÷åðåäè}
{*} if (pic[x_+x,y_+y]=masks[i][x_,y_])
{*} and (masks[i][x_,y_]=1) then s[i]:=s[i]+1; {Ïðè ñîâïàäåíèè óâåëè÷èâàåì ýëåìåíò ìàññèâà íà 1 }
{Çàïîìèíàåì ìàêñèìàëüíîå ÷èñëî ñîâïàâøèõ òî÷åê äëÿ êîíêðåòíîé ìàñêè }
{*} if s[i]>dig[i] then begin dig[i]:=s[i];pos_x[i]:=x;pos_y[i]:=y; end;
{*} end;
{*} end;
{*} end;
{*} max:=getmax(dig); {À ãäå æå ó íàñ ñîâïàëî ëó÷øå âñåõ? }
{Cëåäóþùèå ñòðîêè äî êîììåíòàðèÿ "!" ìîæíî âûêèíóòü }
{Çäåñü äëÿ ïîíòà ðèñóþòñÿ öèôðû ïî ìàñêàì, â òåõ ïîçèöèÿõ, ãäå îíè áûëè íà êàðòèíêàõ }
{*} for x:=dx to dx+fig_width do
{*} for y:=0 to pic_height-1 do
{*} image_out.Picture.Bitmap.Canvas.Pixels[x,y]:=clblack;
{*} for x:=0 to mask_width-1 do
{*} for y:=0 to mask_height-1 do
{*} if masks[max][x,y]=1 then
{*} image_out.Picture.Bitmap.Canvas.Pixels[x+pos_x[max],y+pos_y[max]]:=$00AAFFAA;
{!}
{Çàïîìèíàåì ñàìóþ ìåíüøóþ âåðîÿòíîñòü ñîâïàäåíèÿ }
{*} if round(100*dig[max]/masks_pix[max])<prob then prob:=round(100*dig[max]/masks_pix[max]);
{*} label1.Caption:=Label1.Caption+inttostr(max);
{*} dx:=dx+fig_width; {Ñäâèãàåìñÿ âïðàâî äëÿ ñëåäóùåé öèôðû}
{*} until dx>=pic_width;
← →
Gydvin © (2006-11-12 23:00) [14]Как думаешь, fineReader наверное, профаны писали? И даже у них распознание с "плохого" листа толком не идет. Тем более там не только распознание по шаблону, а также есть встроенный словарь слов. С которым при сомнительном распознавание слов идет сравнение.
← →
Percent (2006-11-12 23:00) [15]Kolan ©
Коля, давай ты будешь излагать только то, в чем ты совершенно уверен в теории и на практике.
В противном случае, давай, ты не будешь сбивать людей с толку, эти люди и сами собьются...
← →
pavels777 (2006-11-12 23:03) [16]извеняюсь :)
{В этой части и происходит распознавание}
{*} repeat
{Обнуляем все массивы}
{*} for i:=0 to 9 do
{*} begin
{*} dig[i]:=0;
{*} s[i]:=0;
{*} pos_x[i]:=0;
{*} pos_y[i]:=0;
{*} end;
{*} for x:=dx to dx+mask_width-1 do
{*} for y:=0 to 9 do {Определенная область на картинке}
{*} begin
{*} for i:=0 to 9 do s[i]:=0;
{*} for x_:=0 to mask_width-1 do
{*} for y_:=0 to mask_height-1 do {Берем по очереди все точки из маски}
{*} begin
{*} for i:=0 to 9 do begin {Подставляем все маски по очереди}
{*} if (pic[x_+x,y_+y]=masks[i][x_,y_])
{*} and (masks[i][x_,y_]=1) then s[i]:=s[i]+1; {При совпадении увеличиваем элемент массива на 1 }
{Запоминаем максимальное число совпавших точек для конкретной маски }
{*} if s[i]>dig[i] then begin dig[i]:=s[i];pos_x[i]:=x;pos_y[i]:=y; end;
{*} end;
{*} end;
{*} end;
{*} max:=getmax(dig); {А где же у нас совпало лучше всех? }
{Cледующие строки до комментария "!" можно выкинуть }
{Здесь для понта рисуются цифры по маскам, в тех позициях, где они были на картинках }
{*} for x:=dx to dx+fig_width do
{*} for y:=0 to pic_height-1 do
{*} image_out.Picture.Bitmap.Canvas.Pixels[x,y]:=clblack;
{*} for x:=0 to mask_width-1 do
{*} for y:=0 to mask_height-1 do
{*} if masks[max][x,y]=1 then
{*} image_out.Picture.Bitmap.Canvas.Pixels[x+pos_x[max],y+pos_y[max]]:=$00AAFFAA;
{!}
{Запоминаем самую меньшую вероятность совпадения }
{*} if round(100*dig[max]/masks_pix[max])<prob then prob:=round(100*dig[max]/masks_pix[max]);
{*} label1.Caption:=Label1.Caption+inttostr(max);
{*} dx:=dx+fig_width; {Сдвигаемся вправо для следущей цифры}
{*} until dx>=pic_width;
← →
Percent (2006-11-12 23:04) [17]pavels777
Я тут кое что нашол
Сидят мужики, ловят рыбу. Подваливает ёжик:
- Мужики, у вас изолента есть?
- Нет...
Ёжик уходит, через час возвращается:
- Мужики, я вам изоленту принес!
(С) Анекдот
То есть, зачем ты это тут выложил? Это твой код? Что он должен делать? Что он делает неправильно? Где, по твоему, ошибка?
← →
Palladin © (2006-11-12 23:05) [18]:)))
> [15] Percent
Уже сбились, бо уверены что за две минуты могут сдвинуть гору, только бы подсказали как, а там уж они сами как нибудь... и ведь не переубедить...
← →
Ketmar © (2006-11-12 23:14) [19]>[16] pavels777 12-Nov-2006, 23:03
>извеняюсь :)
>{В этой части и происходит распознавание}
это тебя кто-то жестоко обманул.
← →
KilkennyCat © (2006-11-12 23:17) [20]Не, ну конкретно для конкретного плоо листа распознаватель, довольно-таки идеальный, за пару дней написать не проблема. Только экономически не выгодно :)
← →
pavels777 (2006-11-12 23:17) [21]ок привожу полный код!
procedure TForm1.Button1Click(Sender: TObject);
begin
{Запускаем диалог и открываем картинку }
{*} If OpenPicture.Execute then Image_IN.Picture.LoadFromFile(OpenPicture.FileName);
{---------------------------------------------------------------------------------------------------}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OpenPicture.InitialDir:=ExtractFilePath(Application.Exename)+"TESTPICTURES";
end;
procedure TForm1.Button2Click(Sender: TObject);
const mask_height=10; {Высота маски}
mask_width=8; {Ширина маски}
pic_height=20; {Высота картинки}
pic_width=48; {Ширина картинки}
fig_width=round(pic_width/3); {Третья часть картинки (для трех цифр)}
type mask=array[0..mask_width-1,0..mask_height-1] of byte; {Тип массива для маски}
var masks:array[0..9] of mask; {Массив масок}
masks_pix:array[0..9] of integer; {Массив для хранения кол-ва белых пикселей для каждой маски}
pic:array[0..pic_width-1,0..pic_height-1] of byte; {Массив для картинки}
i,x,y,x_,y_,dx,max,prob:integer;
dig,s,pos_x,pos_y:array[0..9] of byte; {вспомогательные массивы}
{Функция определения номера максимально совпавшей маски }
{*} function Getmax(dig:array of byte):byte;
{dig - число совпавших точек для каждой маски }
{*} var i,i_:byte;
{*} a,b:real;
{*} begin
{*} a:=0;
{*} i:=0;
{*} for i_:=0 to 9 do
{*} begin
{Вычисляем вероятность совпадения }
{*} b:=dig[i_]/masks_pix[i_];
{*} if a<b then
{*} begin
{*} a:=b;
{*} i:=i_;
{*} end;
{*} end;
{*} result:=i;
{*} end;
{---------------------------------------------------------------------------------------------------}
begin
{Загружаем маски в массивы }
{*} for i:=0 to 9 do
{*} begin
{*} masks_pix[i]:=0;
{*} Temp.Picture.LoadFromFile(ExtractFilePath(Application.Exename)+"MASKS\"+InttoStr(i)+".bmp");
{*} for x:=0 to mask_width-1 do
{*} for y:=0 to mask_height-1 do
{*} if Temp.Canvas.Pixels[x,y]=clwhite then
{*} begin
{*} masks[i][x,y]:=1;
{*} masks_pix[i]:=masks_pix[i]+1;
{*} end
{*} else masks[i][x,y]:=0;
{*} end;
{---------------------------------------------------------------------------------------------------}
{Загружаем картинку в массив }
{*} for x:=0 to pic_width-1 do
{*} for y:=0 to pic_height-1 do
{*} begin
{*} if Image_IN.Canvas.Pixels[x,y]=clwhite then pic[x,y]:=1 else pic[x,y]:=0;
{*} end;
{---------------------------------------------------------------------------------------------------}
{Подготовка Image_OUT}
{*} Image_OUT.Picture.Bitmap.Width:=pic_width;
{*} Image_OUT.Picture.Bitmap.Height:=pic_height;
{---------------------------------------------------------------------------------------------------}
{Очищаем картинку от мусора }
{Мусор в данном случае - точки того же цвета, что и цифры }
{*} for x:=0 to pic_width-1 do
{*} for y:=0 to pic_height-1 do
{*} if pic[x,y]=1 then
{*} begin
{*} x_:=x;
{*} y_:=y;
{*} if x<=-1 then x_:=1;
{*} if y<=-1 then y_:=1;
{Если нет соседних точек или точка лежит на краях картинки то убираем ее }
{Здесь может быть и какой-нибудь другой признак: различие по цвету, например }
{*} if (pic[x_+1,y_]<>1) and (pic[x_-1,y_]<>1) and
{*} (pic[x_,y_+1]<>1) and (pic[x_,y_-1]<>1) and
{*} (pic[x_+1,y_+1]<>1) and (pic[x_-1,y_-1]<>1) and
{*} (pic[x_-1,y_+1]<>1) and (pic[x_+1,y_-1]<>1) then
{*} pic[x_,y_]:=0;
{*} end;
{---------------------------------------------------------------------------------------------------}
dx:=0; {Смещение по горизонтали}
prob:=100; {Начальное значение вероятности успешного распознавания(в %)}
label1.Caption:="";
{В этой части и происходит распознавание}
{*} repeat
{Обнуляем все массивы}
{*} for i:=0 to 9 do
{*} begin
{*} dig[i]:=0;
{*} s[i]:=0;
{*} pos_x[i]:=0;
{*} pos_y[i]:=0;
{*} end;
{*} for x:=dx to dx+mask_width-1 do
{*} for y:=0 to 9 do {Определенная область на картинке}
{*} begin
{*} for i:=0 to 9 do s[i]:=0;
{*} for x_:=0 to mask_width-1 do
{*} for y_:=0 to mask_height-1 do {Берем по очереди все точки из маски}
{*} begin
{*} for i:=0 to 9 do begin {Подставляем все маски по очереди}
{*} if (pic[x_+x,y_+y]=masks[i][x_,y_])
{*} and (masks[i][x_,y_]=1) then s[i]:=s[i]+1; {При совпадении увеличиваем элемент массива на 1 }
{Запоминаем максимальное число совпавших точек для конкретной маски }
{*} if s[i]>dig[i] then begin dig[i]:=s[i];pos_x[i]:=x;pos_y[i]:=y; end;
{*} end;
{*} end;
{*} end;
{*} max:=getmax(dig); {А где же у нас совпало лучше всех? }
{Cледующие строки до комментария "!" можно выкинуть }
{Здесь для понта рисуются цифры по маскам, в тех позициях, где они были на картинках }
{*} for x:=dx to dx+fig_width do
{*} for y:=0 to pic_height-1 do
{*} image_out.Picture.Bitmap.Canvas.Pixels[x,y]:=clblack;
{*} for x:=0 to mask_width-1 do
{*} for y:=0 to mask_height-1 do
{*} if masks[max][x,y]=1 then
{*} image_out.Picture.Bitmap.Canvas.Pixels[x+pos_x[max],y+pos_y[max]]:=$00AAFFAA;
{!}
{Запоминаем самую меньшую вероятность совпадения }
{*} if round(100*dig[max]/masks_pix[max])<prob then prob:=round(100*dig[max]/masks_pix[max]);
{*} label1.Caption:=Label1.Caption+inttostr(max);
{*} dx:=dx+fig_width; {Сдвигаемся вправо для следущей цифры}
{*} until dx>=pic_width;
{---------------------------------------------------------------------------------------------------}
label1.Caption:=Label1.Caption+" ("+inttostr(prob)+"%)";
end;
← →
Palladin © (2006-11-12 23:19) [22]
> ок привожу полный код!
кому? [17] читал?
← →
KilkennyCat © (2006-11-12 23:21) [23]нехилые вложенные циклы...
> Здесь для понта рисуются
файнриадер и прочие - вы уволены! вот она - суперо-пуперо-распознавалка!
← →
KilkennyCat © (2006-11-12 23:23) [24]Очистка от мусора выполнена по алгоритму игры "Life" :))
← →
Palladin © (2006-11-12 23:29) [25]
> Очистка от мусора выполнена по алгоритму игры "Life"
%))
← →
Gydvin © (2006-11-12 23:31) [26]Если интересно, у Керка или Подгорецкого выложен пример распознования цифр
← →
Ketmar © (2006-11-12 23:35) [27]мда. а ведь и я когда-то был таким же молодым и горячим...
← →
KilkennyCat © (2006-11-12 23:39) [28]> [26] Gydvin © (12.11.06 23:31)
Вау! Керк и Подгорецкий - одно и тоже лицо, оказывается! Теперь все ясно...
:)
> [27] Ketmar © (12.11.06 23:35)
А теперь ты старый и холодный :)
← →
Gydvin © (2006-11-12 23:41) [29]
> KilkennyCat © (12.11.06 23:39) [28]
>
> > [26] Gydvin © (12.11.06 23:31)
>
> Вау! Керк и Подгорецкий - одно и тоже лицо, оказывается!
> Теперь все ясно...
> :)
Почему? Волшебное слово - ИЛИ
← →
KilkennyCat © (2006-11-12 23:42) [30]> [29] Gydvin © (12.11.06 23:41)
вот именно.
← →
Palladin © (2006-11-12 23:42) [31]угу... лет 10-12 назад... когда все казалось очевидным... но подобный срез значений я уж никак чисткой шумов не называл... )
← →
Gydvin © (2006-11-12 23:43) [32]
> > KilkennyCat © (12.11.06 23:39) [28]
Можно иногда полностью читать сообщение))
← →
Gydvin © (2006-11-12 23:44) [33]
> KilkennyCat © (12.11.06 23:42) [30]
>
> > [29] Gydvin © (12.11.06 23:41)
>
> вот именно.
Ну и....
> Gydvin © (12.11.06 23:31) [26]
Читаем заново )))
← →
KilkennyCat © (2006-11-12 23:44) [34]> [31] Palladin © (12.11.06 23:42)
гы... я в то время пришел к выводу, что можно сделать аналоговый распознаватель :) устройство, типа аналогового ксерокса плюс печатная машинка.
← →
Palladin © (2006-11-12 23:47) [35]это типа если оцифровать голоса двух человек и вычислить среднестатистическую разницу циферек, то можно синтезировать голос одного в голос другого...
:)))
← →
Palladin © (2006-11-12 23:48) [36]
> голоса двух человек
произносящих соответственно одну и туже фразу :)
← →
Anatoly Podgoretsky © (2006-11-12 23:48) [37]> KilkennyCat (12.11.2006 23:39:28) [28]
Так нас уже трое оказывается, ты Кетмаря забыл
← →
Gydvin © (2006-11-12 23:51) [38]Чет я не понял, в каком месте начинать смеяться..... где я сказал не так
← →
KilkennyCat © (2006-11-12 23:53) [39]> [37] Anatoly Podgoretsky © (12.11.06 23:48)
точно... эх, хорошо вам вместе, нескучно...
← →
Palladin © (2006-11-12 23:55) [40]
> [38] Gydvin ©
ни в каком... народ частично ушел в детство...
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.044 c