Grafik işleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

kod için teşekkürler

Mesaj gönderen kelaynak2 »

Sayın MrmCop
"A" harfini oluşturan koddan dolayı teşekkürler.Bende 0 ve 1 leri Text dosyasına tek tek girerek, sonrada bunları programa yükleyerek bir şeyler yapmaya çalışıyordum.
En son kelaynak2 tarafından 30 Ara 2004 09:56 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

neden cihaz varken program? çünkü cihaz burada alan birini tanıyorum 4-4.5 milyar arasında, ancak yazılım olsa kağt belemeli bir tarayıcı max 500 $ civarında yazılımda bir kereye mahsus güzel yazılırsa. tarayıcı+program =2.3 milyar civarında daha altına da olabilir. ve dershaneler genelde 4 milyarı çok buluyorlar ve daha ucuz çözümleri alıp her sınav sonunda kağıt okutma derdi ve parasından kurtuluyorlar. o cihazı satsanız kaç para size kalıyor. tarayıcı+program satsanız kaç para size kalıyor. ve cihaz çok fazla satılmıyor.
Misafir

programı sipariş edenler bilgi sahibimi ?

Mesaj gönderen Misafir »

düşnünki bir optic okuyucu cihaz 3000 dolar civarında...artı bu donanımı aldığınızda da ayrıca bir yazılım alıyorsunuz...


bu işi scainer ile halleden ve cok daha ucuza olan bir komplex yapı...

açıklama kısa ama anlaşılır sanırım :)
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

O cihazlar sadece çok hızlı tarama yapmak ve formları beslemede kullanılır.

Formdaki datayı digital hale getirme işlemini program yapar. neden makina hepsini yapmıyor derseniz şu yüzden: formlar standart değil.

Programda her farklı form tipinin karalama kutucuklarının yerleri tanımlanır. Program yandaki siyah barlara göre resmi düzeltir ve belirli bir noktaya göre sıfırlar. daha sonra daha önce tanımlanmış kutucuk koordinatlarına bakarak dolu veya boş olup olmadığını belirlemeye çalışır.
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Bir Hata mı Var

Mesaj gönderen kelaynak2 »

mrmcop merhaba,
Oluşturduğunuz A harfinin sağ tarafındaki kaymaları dikkat ettinizmi?
Sebebi Hexedimal rakam tek rakam olursa (örneğin sadece E) soldaki '0000' hesaba katılmıyor.
Verdiğiniz kodu aşağıdaki şekilde değiştirdim.A harfi tam çıktı.Hatam varsa bildirirsiniz.

Kod: Tümünü seç

var 
  iSatir, 
  iSutun : Integer; 
  Okunan : pByteArray; 
  Bitmap : TBitmap; 
  Satir  : String;
 s: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 
    s:=Format('%x',[Okunan[iSutun]]); 
if length(s)=1 then
s:='0'+s;
      Satir := Satir + HexToBin(s);
    end; 
    Memo1.Lines.Add(Satir); 
    Satir := ''; 
  end; 
  Image1.Picture.Graphic := Bitmap; 
  Bitmap.Free; 
end; 


Sizin kodunuzda sadece formatı

Format('%.2x',[Okunan[iSutun]]); şeklinde değiştirmekte aynı işi yapıyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@kelaynak2 Merhaba...

- Memnun oldum... Amacım bu şekilde formatlı dönüşüm yapmak değildi ama buna ihtiyacı olanlar için sayende tamalanmış güzel bir örnek oldu... :o

- Amaç, ScanLine fonksiyonunun, bir çoğumuzca bilinmeyen ama resim işlemek adına basit ve etkili bir fonksiyon olduğuna dikkat çekmekti... :idea:

- Çalışmalarınızda başarılar...
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@kelaynak2 şimdi dikkatimi çekti, önceden dikkat etmemişim, yaptığın güncellemenin gereğini düşününce aslında Format tanımı içine bir nokta ve hane sayısı koymak ile otomatik yaptırabiliyoruz hatırlatmak istedim...

Kod: Tümünü seç

%2x  iki haneli değerlendirir,
%.2x iki haneli ama boşlukları 0 doldurur..

Kod: Tümünü seç

      Satir := Satir + HexToBin(Format('%.2x',[Okunan[iSutun]]));
Resim
Resim ....Resim
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Mesaj gönderen kelaynak2 »

@mrmcop merhaba,
yukarıdaki mesajımda zaten bunuda belirtmiştim.Formatın yardımına baktığımda bende bu çözümü sonradan farkettim.
Sizin kodunuzda sadece formatı

Format('%.2x',[Okunan[iSutun]]); şeklinde değiştirmekte aynı işi yapıyor
Ama şunu söyleyebilrim ki yazdığım OCR programında sizin kodunuz olmasaydı takılır kalırdım. pf24bit resmi pf1bit'e çevirdim. sizin hextobin fonksiyonunu kullanarak her bayttaki hexleri binarye(pixele) çevirdim. Sonra sayfanın tamamını iki boyutlu dinamik bir arraya attım. Sonra ilk bitten başlayarak "0" ları arattırdım. Sıfır bulduğum zaman komşu pixellerdeki "0" ları buldum ve bitmapdaki harfi extract ettim. Sonrası zaten bu 8*8 boyundaki "0" ve "1" leri neural networka göndererek hangi harf olduğunu bulmasını istemek kalıyor. Şu anda harfler arasındaki boşlukta takıldım.Sanırım onuda yakında çözerim. Programı bitirince kaynak kodunu web sayfamda ve burada yayınlayacağım. O kadar ingilizce-rusça delphi sitesi gezdim, açık kaynak kodlu bir OCR programına rastlamadım. Amacım sadece beyin jimnastiği, bende biliyorum ki finereader gibi bir OCR programı yazamam.

OCR konusunu araştırırken kaynak kodu açık olmayan ilginç componentlere rastladım. Mesela resmi 30 derece eğik taramış, component bu resmi düzeltiyor. Sizce bunu nasıl yapıyor :roll: Benim tahminim yazıların olduğu bir satırı bulunca bu satırdaki harflerin üst kısmındaki pixellerin çizgisel doğrusunu buluyor ve bu çizginin açısına göre resmi düzeltiyor.

Compenentin Ters konan resmi 180 derece çevirerek doğrultmasını nasıl yapıyor diye düşünürsek galiba belirli harfleri kontrol ediyor, bu harf tanıdık bir harf ve ters yazılmış ise resminde ters olduğuna karar veriyor ve çeviriyor. Başınızı ağrıttım.
Bu arada "A" harfi mükemmel çıkmış, elinize sağlık.
Görüşmek üzere. :D
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@kelaynak2

- Direkt kod içerisine odaklandığımdan mesajının son satırını görmemişim, pardon... :oops:
OCR konusunu araştırırken kaynak kodu açık olmayan ilginç componentlere rastladım. Mesela resmi 30 derece eğik taramış, component bu resmi düzeltiyor. Sizce bunu nasıl yapıyor Benim tahminim yazıların olduğu bir satırı bulunca bu satırdaki harflerin üst kısmındaki pixellerin çizgisel doğrusunu buluyor ve bu çizginin açısına göre resmi düzeltiyor.
- İmkanın olup da eğikliği düzelten bu OCR componente erişirsen, kenarları düzgün olmayan bir resimle dener misin bu tip denemelerele nasıl bir metod izlediği anlaşılır... Baş ağrısı mı o da ne :o

- Çalışmalarında başarılar...
Resim
Resim ....Resim
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Haklı olabilirsiniz

Mesaj gönderen kelaynak2 »

Anladığım kadarıyla siz OCR componentinin resmin kenarlarındaki renk değişikliğine bakarak ve açısını hesaplayarak resmi düzeltiyor demek istiyorsunuz. Bu çözüm daha mantıklı gibi geliyor.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

Ş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;
Ben burada for iSutun := 0 to (Bitmap.Width div 8)-1 do burada bitmap width ni neden 8 böldük onu anlamadım hocam neden 10 bölmedik????
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Resmi oluşturan her bir Pixel için 8 Bit veri saklanır.

- Her Pixel'den 8 kopya varmış gibi düşünebilirsin. Bize bunlardan sadece birisi gerekli.

- Dilersen bölmeden dene ve kendin gör.

// Edit // Ekleme //

- Bitmap.Width 'i rakamsal veri olarak kullandık, yani resmi 8'e böldük anlamında değil... Bu daha kolay kavramanı sağlar...
Resim
Resim ....Resim
Kullanıcı avatarı
karflake
Üye
Mesajlar: 222
Kayıt: 15 Haz 2003 03:57

Re: Grafik işleme

Mesaj gönderen karflake »

@mrmarman, verdiğiniz kodlar için teşekkürler. Aradan geçen 9 yıla rağmen hala işe yarıyorlar.
Cevapla