Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Schwarz-Weiß-Bildanalyse (https://www.delphipraxis.net/137834-schwarz-weiss-bildanalyse.html)

LDericher 29. Jul 2009 10:59


Schwarz-Weiß-Bildanalyse
 
Hallo DP!

Wie bereits hier angekündigt, mache ich dieses Thema auf, weil ich nun ein konkretes Problem habe.

Ich brauche einen Algorithmus, der mir aus einer schwarz-weißen Bitmap ein Rechteck ermittelt, in dem soundsoviel Prozent der weißen Pixel liegen und der dabei recht flott arbeitet.

Hoffe, ich bekomme interessante Ansätze,

Euer LDer.

Aphton 29. Jul 2009 11:14

Re: Schwarz-Weiß-Bildanalyse
 
Ich hab mir den alten Thread angeschaut und muss sagen, dass dein Schwarz-Weiß Macher nicht sehr schnell ist/sein kann, da du da auf Pixel zugreifst.
Wie du schon richtig rausbekommen hast, ist man da mit Scanline viel besser dran.

Zweiteres: ich würde zuerst einmal versuchen, Ecken im Bild zu detektieren. Also zuerst das Bild Schwarz-Weiß machen, dann einen Ecken-Filterer drüber laufen lassen.
Für das Filtern von Ecken habe ich einmal ein Codesnippet gepostet - Suche hier nach "Sobel Operator" bzw einfach nur "Sobel" (mr_emre_d, alter Account)

MfG

LDericher 29. Jul 2009 11:29

Re: Schwarz-Weiß-Bildanalyse
 
Aber der S/W-Macher ist schnell, und den nutze ich, wie man auch im letzten Thread erkennen kann...

Delphi-Quellcode:
procedure BlackWhite(Input:TBitmap);
type
  PixArray = packed record
    b, g, r: Byte;
    end;
var
  P: ^PixArray;
  X,
  Y:integer;
  Hell:Byte;
  DHell:int64;
const
  paWhite:PixArray=(b:255; g:255; r:255);
  paBlack:PixArray=(b:0; g:0; r:0);
begin        
Input.PixelFormat:=pf24bit;
DHell:=0;    
for Y:=0 to Input.Height-1 do
   begin
   P:= Input.ScanLine[Y];
   for X:=0 to Input.Width-1 do
      begin
      Hell:=(P^.b*21+P^.g*174+P^.r*61)div 256;
      P^.b:=Hell;
      P^.g:=Hell;
      P^.r:=Hell;
      DHell:=DHell+Hell;
      Inc(P);
      end;
   end;
DHell:=DHell div (Input.Height*Input.Width);
for Y:=0 to Input.Height-1 do
   begin
   P:= Input.ScanLine[Y];
   for X:=0 to Input.Width-1 do
      begin
      if(P^.b > DHell)
        then P^:=paWhite
        else P^:=paBlack;
      Inc(P);
      end;
   end;
end;
Und zu deinem "Sobel": Is en schöner Effekt, nur ich finde ihn etwas unbrauchbar, ich gehe da über Differenzbilder ran und habe dort eine weiße Fläche, wo mein Kopf ist...
Da aber durch Rauschen ein gewisser Fehler entsteht, hätte ich jetzt gerne 90% (oder so, kann man dann ja ausprobieren) der weißen Pixel "eingerechteckt", und ich weiß nicht, was ich da sobeln soll ;)

MfG LDer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz