Grafik işleme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
kod için teşekkürler
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.
"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.
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.
programı sipariş edenler bilgi sahibimi ?
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
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

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.
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.
Bir Hata mı Var
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.
Sizin kodunuzda sadece formatı
Format('%.2x',[Okunan[iSutun]]); şeklinde değiştirmekte aynı işi yapıyor.
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;
Format('%.2x',[Okunan[iSutun]]); şeklinde değiştirmekte aynı işi yapıyor.
@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...
- Amaç, ScanLine fonksiyonunun, bir çoğumuzca bilinmeyen ama resim işlemek adına basit ve etkili bir fonksiyon olduğuna dikkat çekmekti...
- Çalışmalarınızda başarılar...
- 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...

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

- Çalışmalarınızda başarılar...
@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]]));
@mrmcop merhaba,
yukarıdaki mesajımda zaten bunuda belirtmiştim.Formatın yardımına baktığımda bende bu çözümü sonradan farkettim.
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.
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.
yukarıdaki mesajımda zaten bunuda belirtmiştim.Formatın yardımına baktığımda bende bu çözümü sonradan farkettim.
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.Sizin kodunuzda sadece formatı
Format('%.2x',[Okunan[iSutun]]); şeklinde değiştirmekte aynı işi yapıyor
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

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.

aşağıdaki linklere bir bakıver...
http://www.efg2.com/Lab/ImageProcessing ... anline.htm
http://www.efg2.com/Lab/ImageProcessing/index.html
http://www.efg2.com/Lab/ImageProcessing ... anline.htm
http://www.efg2.com/Lab/ImageProcessing/index.html
@kelaynak2
- Direkt kod içerisine odaklandığımdan mesajının son satırını görmemişim, pardon...
- Çalışmalarında başarılar...
- Direkt kod içerisine odaklandığımdan mesajının son satırını görmemişim, pardon...

- İ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 neOCR 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.

- Çalışmalarında başarılar...
Haklı olabilirsiniz
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.
Şimdi Harmanlayalım. Forma koyduğunuz Memo'ya satırları listeliyoruz...
Ben burada for iSutun := 0 to (Bitmap.Width div
-1 do burada bitmap width ni neden 8 böldük onu anlamadım hocam neden 10 bölmedik????
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;

Siz hayal edin...Biz yapalım TuannaSoft...
- 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...
- 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...
Re: Grafik işleme
@mrmarman, verdiğiniz kodlar için teşekkürler. Aradan geçen 9 yıla rağmen hala işe yarıyorlar.