Grafik işleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Misafir

Grafik işleme

Mesaj gönderen Misafir »

Tif dosyası üzerinde işlem yapmak konu bu ;

Fahrettin adminimiz bu konu ile ilgili bir postta FineReader, ReadIris, TextBridege gibi firmaların kendi OCR engineleri program geliştiricilere sattıklarını soylemiş.Benim ogrenmelk istedigim.

Bu firmaların sitelerine baktım.

1-fiyatları 180-450 dolar arası bazı OCR ile ilgili paketler var
2-Bu sattıkları şey componentmidir.
3-OCR ile ilgili internette bazı şeyler buldum.Hepsi farklı farklı şeyler...benim aklımdan gecen ile alakası yok
4-Ben optik sınav formalarının okuyup düz olup olmadığnı test edip.sıra ile tarama yapılırken degerlendirip txt ye cevirmek ve bunları değerlendirmek! işte bu firmaların sattıkları şey her ne ise benim ihtiyacımı karşılacak bir şeymidir.
5-Taranmış resmi almak sorun değil bunu üzerinde pixel pixel renk kontrolü yapmak bir fonksiyon la falanmı olabilir.Bunun la ilgili çalışması ön bilgisi olan arkadaslar varmı?yada ekranın her hangi bir yerindeki yada bir resmin her hanig bir koordinatındaki rengi ogrenmek ne ile olabilir.

Teşekkür ederim.
Misafir

bir örnek

Mesaj gönderen Misafir »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y : Integer;
  BitMap : TBitMap;
  P : PByteArray;
begin
  BitMap := TBitMap.create;
  try
    // On Windows replace MyBitmap.png with a full pathname such as
    // C:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp
    BitMap.LoadFromFile('MyBitmap.png');
    for y := 0 to BitMap.Height -1 do
    begin
      P := BitMap.ScanLine[y];

      for x := 0 to BitMap.Width -1 do
        P[x] := y;
    end;
    Canvas.Draw(0,0,BitMap);
  finally
    BitMap.Free;
  end;
end;


delphi yardımında soyle bir ornek var...

Bitmap image not valid hatası alıyorum...

bunu for döngüsüne girmeden veriyor...istediği image dosyaların oluşturdum...hatanın nerden kaynaklandıgını bulamıyorum.


*** Kodları [ code ] tagı içine alın. mege
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: bir örnek

Mesaj gönderen sadettinpolat »

alperim yazdı:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y : Integer;
  BitMap : TBitMap;
  P : PByteArray;
begin
  BitMap := TBitMap.create;
  try
    // On Windows replace MyBitmap.png with a full pathname such as
    // C:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp
    BitMap.LoadFromFile('c:\deneme.bmp'); //<-- bu şekilde
    for y := 0 to BitMap.Height -1 do
    begin
      P := BitMap.ScanLine[y];

      for x := 0 to BitMap.Width -1 do
        P[x] := y;
    end;
    Canvas.Draw(0,0,BitMap);
  finally
    BitMap.Free;
  end;
end;


delphi yardımında soyle bir ornek var...

Bitmap image not valid hatası alıyorum...

bunu for döngüsüne girmeden veriyor...istediği image dosyaların oluşturdum...hatanın nerden kaynaklandıgını bulamıyorum.


*** Kodları [ code ] tagı içine alın. mege
dosyanın tam yolunu ver birde bmp uzantılı olsun
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Misafir

kimsenin bi fikri yokmu

Mesaj gönderen Misafir »

ya bu konuda kimsenin bi fikri yokmu :)


Ramsnet adminlerim....yardımınızı görüşlerinizi bekliyorum
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...

@sadettinpolat'ın bahsettiği gibi BMP tipinde bir resim seçtiğinizi teyid ediniz... :!:

- Ayrıca resim okunduktan sonra da OCR işlemi için ilk yapılması gereken şey -tabii daha önce bu işe başlamış ama vakit bulamamış olan benim görüşümdür bu- resmi siyah beyaz hale dönüştürmektir. Bu şekilde işler 80% hafiflemiş olur. Yoksa komuşuluk değerleri konuşur, photoshop gibi bir programla TraceContour gibi bir plugin'e ihtiyaç olunur... :wink:

Kod: Tümünü seç

Var
  Bitmap: TBitmap;
  Palet : TMaxLogPalette;
begin
  Palet.palVersion := $300;
  Palet.palNumEntries := 2;
  With Palet.palPalEntry[0] do
  begin
    peRed   := 0;
    peGreen := 0;
    peBlue  := 0;
    peFlags := 0
  end;

  With Palet.palPalEntry[1] do
  begin
    peRed   := 255;
    peGreen := 255;
    peBlue  := 255;
    peFlags := 0
  end;

  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('E:\DelphiTurkiye.BMP');
    Bitmap.Palette := CreatePalette(pLogPalette(@Palet)^);
    Bitmap.PixelFormat := pf1bit;
    Image1.Picture.Graphic := Bitmap
  finally
    Bitmap.Free
  end;
end;
Resim
Resim ....Resim
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

OCR= Optical Charecter Recognition grafik olarak bulunan yazıları tanıyıp texte çevirmek diye kısaca diye biliriz

"sınav formalarının " okunması için bence gerek yok çünkü bu formlarda
ad soyad no gibi kısımlarda zaten kodlanarak işaretleniyor... yani a Harfi için belli bir kordinatta kutucuklar karalanıyor

Form görüntülerini bmp ye çevirdikten sonra form üzerinde referans teşkil edebileceğin bir yer bul ve diğer kısımları -yani karalanmış kutucukları - ona göre oku ...

ilgili rengi okumak için Image -> Canvas -> Pixsels [X][Y] kullanabilirsin

Mesela Referans Noktam x0,y0
1. sorunun cevabının A Şıkkının kutucuğunun merkezinin referans noktamdan
uzaklığı (k,l) okuyacağım yer (x0+k,y0+l) gibi ...
( Her görüntü için önce x0 ve y0 tespit etmek gerekir diğerleri zaten ona göre bulunuyor )
biraz karışık oldu ama inşallah anlata bilmişimdir...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@bk

- Zaten gerçek anlamda bir OCR işlemine gerek olmadığı açık. OSYM de isimleri text'den okumuyor, isim karalama tablosunu kullanıyor. :wink:

- Image -> Canvas -> Pixsels [X][Y] yavaş bir yöntemdir.. Scanline ile pointer array'a okuyup karşılaştırmak çok daha hızlıdır... @alperim'in doğru bir noktaya ulaştığını düşünüyorum. :idea:

- Bunun için resmi siyah beyaz'a dönüştürdüğünde değerlerin büyük oranda sadeleşeceğini ifade etmeye çalıştım.

- Asıl mesele senin de ifade ettiğin şey. Resmin doğru tarandığının tespiti.

- @alperim için söylüyorum; Programın güvenilirliği ve kalite faktörü; düzgün, gereğinden büyük/küçük, ters/yan taranmış olup olmadığını anlamakla orantılıdır. Bu da OCR işleminde ana unsur olan satır sütun tespiti için gerekli algoritmaya denktir. Biz en iyisi buna OCR'dan C'yi atarak OR diyelim. :lol: :lol:

- Yani @bk'nın da belirttiği durum, x0 ve y0 referans noktaları sabit olamayacağından buraların tespiti çok önemli. :roll:
Resim
Resim ....Resim
Misafir

yanii...

Mesaj gönderen Misafir »

zaten optic formlarda sol tarafata dikkat ederseniz siyah aralıklık noktalar vardır..bunların durumuna göre resmin düz olup olmadığını anlayıp tekrar taranmassını isteyebilirim...resim düz olduktan sonrada referans noktası belirleyeceğim...referans noktasını kullanıcı belirleyecek...yani dogru sıkları verecek. Program bu dogru şıkların oldugu yerleri kontrol edecek..isim soy ad kısımlarında ise..bütünü sütunu arayıp işaretli yerleri bulacak...bunlar işin mantalitesi......


gelelim teknik konuya...

zaten resimler tif olarak taranıyor..bunu bmp de yaparbilriz...siyah beyaz tarıyorum resimleri...renkli tarayıp da bidaha siyah beyaz yapmaya çalışmak zaman kaybı...

takıldıgım bi tek nokta var...

her hangi bir koordinatta rengin ne oldugunu nasıl bulacağım... :)

bütün mesela bu :)
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

" her hangi bir koordinatta rengin ne oldugunu nasıl bulacağım.."

Image -> Canvas -> Pixsels [X][Y] :wink:

x ve y koordinatındaki pikselin -noktanın - rengini okuyabilir yada değiştire bilirsin her nekadar mrmcop yavaş bir yöntem olduğunu söylesede bence belli koordinatlardaki kısımlarla ilgilendiğimiz için yeterli olacağını sanıyorum
8)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

:lol: :lol: :lol: Yahu noktanın rengiyle niye ilgilenelim Nokta var mı yok muyu buluyoruz ya... :idea:

Tabloda 1 olan yerler ile 0 olan yerleri ayırt edemiyor muyuz :?: :wink:

Kod: Tümünü seç

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111100111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111000111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111000011111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111110000011111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111110000001111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111100000001111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111100000000111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111100000000111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111000000000111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111000000000011111111111111111111111111111111111111111111111
111111111111111111111111111111111111110000000000011111111111111111111111111111111111111111111111
111111111111111111111111111111111111110000000000001111111111111111111111111111111111111111111111
111111111111111111111111111111111111100000000000001111111111111111111111111111111111111111111111
111111111111111111111111111111111111100000000000000111111111111111111111111111111111111111111111
111111111111111111111111111111111111100000000000000111111111111111111111111111111111111111111111
111111111111111111111111111111111111001000000000000111111111111111111111111111111111111111111111
111111111111111111111111111111111111001100000000000011111111111111111111111111111111111111111111
111111111111111111111111111111111110011100000000000011111111111111111111111111111111111111111111
111111111111111111111111111111111110011110000000000001111111111111111111111111111111111111111111
111111111111111111111111111111111100111110000000000001111111111111111111111111111111111111111111
111111111111111111111111111111111100111111000000000000111111111111111111111111111111111111111111
111111111111111111111111111111111000111111000000000000111111111111111111111111111111111111111111
111111111111111111111111111111111001111111000000000000111111111111111111111111111111111111111111
111111111111111111111111111111111001111111100000000000011111111111111111111111111111111111111111
111111111111111111111111111111110011111111100000000000011111111111111111111111111111111111111111
111111111111111111111111111111110011111111110000000000001111111111111111111111111111111111111111
111111111111111111111111111111100111111111110000000000001111111111111111111111111111111111111111
111111111111111111111111111111100111111111111000000000000111111111111111111111111111111111111111
111111111111111111111111111111000111111111111000000000000111111111111111111111111111111111111111
111111111111111111111111111111001111111111111100000000000111111111111111111111111111111111111111
111111111111111111111111111111000000000000000000000000000011111111111111111111111111111111111111
111111111111111111111111111110000000000000000000000000000011111111111111111111111111111111111111
111111111111111111111111111110011111111111111110000000000001111111111111111111111111111111111111
111111111111111111111111111100111111111111111110000000000001111111111111111111111111111111111111
111111111111111111111111111100111111111111111111000000000000111111111111111111111111111111111111
111111111111111111111111111001111111111111111111000000000000111111111111111111111111111111111111
111111111111111111111111111001111111111111111111000000000000111111111111111111111111111111111111
111111111111111111111111110001111111111111111111100000000000011111111111111111111111111111111111
111111111111111111111111110011111111111111111111100000000000011111111111111111111111111111111111
111111111111111111111111100011111111111111111111110000000000001111111111111111111111111111111111
111111111111111111111111100011111111111111111111110000000000001111111111111111111111111111111111
111111111111111111111111000011111111111111111111110000000000000111111111111111111111111111111111
111111111111111111111110000001111111111111111111110000000000000011111111111111111111111111111111
111111111111111111111100000000011111111111111111100000000000000001111111111111111111111111111111

Şimdi daha kolay anlaşılır herhalde... Yukardaki tablo nasıl mı oluştu işte bu şekilde...

Forma
:arrow: bir tane Image nesnesi koyun : Image1

:arrow: bir tane Memo nesnesi koyun : Memo1
:arrow: Memo nesnesinin Font tipini Courier New yapın ki sabit genişlikli olsun ve sonucu yukardaki code tagındaki kadar rahat görebilesiniz..


// Siyah/Beyaz A harfi basan fonksiyon yazayım

Kod: Tümünü seç

Var
  Bitmap : TBitmap;
begin
  Bitmap := TBitmap.Create;
  With Bitmap do
  begin
    Width  := 100;
    Height := 60;
    PixelFormat := pf1Bit;
    Canvas.FillRect(Rect(0,0,100,60));
    Canvas.Font.Size := 50;
    Canvas.Font.Style := [fsBold];
    Canvas.Font.Name := 'Times New Roman';
    Canvas.TextOut(20, 0, 'A');
  end;
  Image1.Picture.Graphic := Bitmap;
  Bitmap.Free;
end;
Şimdi HEX sayıyı BIN (2'lik düzende sayıya) çeviren bir fonksiyona ihtiyaç olacak.

Kod: Tümünü seç

function HexToBin(const S: string): string;
var I: integer; T: string;
begin
  Result:='';
  for I:=1 to Length(S) do
    begin
      case S[I] of
        '0': T:='0000';
        '1': T:='0001';
        '2': T:='0010';
        '3': T:='0011';
        '4': T:='0100';
        '5': T:='0101';
        '6': T:='0110';
        '7': T:='0111';
        '8': T:='1000';
        '9': T:='1001';
        'A': T:='1010';
        'B': T:='1011';
        'C': T:='1100';
        'D': T:='1101';
        'E': T:='1110';
        'F': T:='1111';
      else T:= 'xxxx';
      end; // Case
      Result:=Concat(Result,T)
    end
end;
Şimdi Harmanlayalım. Forma koyduğunuz Memo'ya satırları listeliyoruz...

Kod: Tümünü seç

var
  iSatir,
  iSutun : Integer;
  Okunan : pByteArray;
  Bitmap : TBitmap;
  Satir  : String;
begin
  Bitmap := TBitmap.Create;
  Bitmap.Assign(Image1.Picture.Bitmap);
  Application.ProcessMessages;

  for iSatir := 0 to Bitmap.Height-1 do
  begin
    Okunan := pByteArray(Bitmap.Scanline[iSatir]);
    for iSutun := 0 to (Bitmap.Width div 8)-1 do
    begin
      Satir := Satir + HexToBin(Format('%.2x',[Okunan[iSutun]]));
    end;
    Memo1.Lines.Add(Satir);
    Satir := '';
  end;
  Image1.Picture.Graphic := Bitmap;
  Bitmap.Free;
end;
:idea: Tezimde ısrar ediyorum. Buna karşılık Pixel Pixel uğraşının daha hızlı ve kolay olduğuna inanmaya devam ediyorsanız, bir örnek de sizden bekliyorum :wink: Foruma faydası dokunacak cinsten açıklayıcı olsun... :)
En son mrmarman tarafından 26 Oca 2005 08:28 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Misafir

güzel...olayı netleştirelim

Mesaj gönderen Misafir »

foruma katkısı olacak bir şeyler...ok...

şimdi burda yukarda yaptıgınız şey anlamlı...ancak optic formu okurken bunun hız olarak kazandıracağı şeyi tam algılayamadım...

ben şoyle düşünüyorum...


belirli bir noktada ki rengi algılayabiliyormuyuz....

daha once dediğim gibi solda hizlama çizgilerine gore bütün kutucukların uzaklığı bellidiri...Formun düz olup olmadığı belirlendikten sonra...kullanıcının dogru cevap şıklarını girmesini isteyip...ona ilişkin noktaları programdan kontrol etmesini isteriz... siyah ise ok..beyaz is olumsuz...

bunun sizin belirttiğiniz yontemem gore yavaşlığını açıklayabilirmisiniz...

?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba... Proje senin, tercihlerin kendi tasarrufunda... :lol:

- 1 Pixel kontrolü yapmak senin için yeterli geliyorsa diyecek bir sözüm yok burada noktayı koyuyorum, ama benim için yeterli değil... Şöyle açayım... :idea:

- Referans çizgilerinin her biri en az 20 Pixel dikey ve 100 pixel yataydan oluşan birer bütündür. Yani bu bütünlerden belli bir noktayı hedeflemek kolaydır ama yetmez. Çünkü standart bir form tarayıcısı değil, bilgisayarcılardan alınmış bir tarayıcı kullanılıyor. Ters, eğri vb. olduğunu anlamak için yetmez...

- İşaret kutusundaki bir kalem çizgisinin kapladığı alanı tarayıp ne kadar pixel alanı kapladığını deneyerek kendinin görmesi en doğru olanıdır. :wink:

- -şahsi fikrimdir- sınav sonuç kartlarının hata kaldırmayacak bir olgu olduğu değerlendirildiğinde, her referans çizgisinden birer-ikişer nokta okuyarak kontrolünün güvenli olmayacağı kanaatindeyim.

- Düşün ki en son referans çizgisini kontrol ettiğin noktadan sonra, kalemle bir karalama yapılmış olsun. Ve taryıcıya konan kağıt birkaç milimetre yukarıda kalmış olsun, sonuç ne olur ?

- Büyük ihtimalle tüm referans kontrollerini doğru sanarak, en alttaki satırdaki soru/cevap dizisinin boş veya mükerrer işaretlenmiş olduğu sonucuna varılabilecektir. :wink: Geriye kalan cevapların sıra kaymış olduğu sonucu bir kenara...

- İki ya da -30 çizgi varsa- 30 noktaya bakarak algoritma gibi bişi geliştirmenin doğru olmayacağını düşünüyorum. Referans çizgilerinin bütünlüğünün de kontrol edilmesi bence şarttır. Her referans çizgisinin bütünlüğünü okurken geçen zaman gözardı edilecek kadar az ise sorun yok zaten. 8)

- Buraya kadar anlattıklarımla hız sorununu bağlayayım. Kontrol sayısı ve alanı artıkça, Pixel x Pixel döngü kurduğunuzda yavaşlamayı göreceksiniz. Diğer yandan bir kaç pixel okuma sırasında geçen zaman kadar bir sürede tüm bir bloktaki pixelleri okuyabilien Scanline fonksiyonu asla karşılaştırılmaz... :)
Resim
Resim ....Resim
Seko
Üye
Mesajlar: 11
Kayıt: 07 Ara 2004 01:16

Mesaj gönderen Seko »

Bir soru da benden. Bu formları okuyan cihazlar var. Neden bu cihazlar varken böyle bir program ihtiyacı hissediliyor. Bu cihazlar pahalı olsa bile en kesin ve en hızlı çözüm olmazmı?
Seko
Üye
Mesajlar: 11
Kayıt: 07 Ara 2004 01:16

Mesaj gönderen Seko »

http://www.mobilsoft.com.tr/default.asp?id=44
böylede bir link buldum. Tam olarak isteğinize cavap verecektir bu tür bir cihaz. Fiyatı ne düzeydedir bilmiyorum ama böyle bir proje yapacak olsaydım herhalde önce böyle bir cihaz üzerinde yoğunlaşırdım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Güzel soru :) Cihazlar sanıldığı kadar -emek/program oranla- pahalı değil. Bir soru daha, acaba programı sipariş edenler yeterince bilgi sahibi mi ?:idea:
Resim
Resim ....Resim
Cevapla