AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pixel zählen mit Scanline

Ein Thema von Jazzman_Marburg · begonnen am 4. Mai 2012 · letzter Beitrag vom 4. Mai 2012
Antwort Antwort
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

Pixel zählen mit Scanline

  Alt 4. Mai 2012, 20:09
Hallo Gemeinde,
ich versuche gerade alle schwarzen Pixel in einem Image (TImage) zu zählen. Mit Canvas.Pixels geht es wohl -- nur eben langsam. Deswegen versuche ich auf ScanLine umzustellen, und das geht nun gründlich schief. Habe mir diverse Tutorials angeschaut und war meiner Sache sicher -- aber mit ScanLine zähle ich wohl etwas anderes. Deswegen meine Frage/Bitte ob jemand wohl den Fehler sieht?

Delphi-Quellcode:
 type
    TIntegerArray = array[0..MaxInt div SizeOf(integer) - 1] of integer;
    PIntegerArray = ^TIntegerArray;
  ...

 
  Anzahl := 0;
  Anzahl2 := 0;

  k:= myImage.Width;
  l:= myImage.Height;

  { Canvas.Pixels Version ------------------------------------- }
  for x := 0 to k - 1 do
  begin

    for y := 0 to l - 1 do
    begin

      color := myImage.Canvas.Pixels[ x, y ];
      if color = clBlack then
        inc(Anzahl);

    end;

  end;

  { ScanLine Version ------------------------------------------- }
  for y := 0 to l - 1 do
  begin

    ScanLine := myImage.Picture.Bitmap.ScanLine[ y ];
    for x := 0 to k - 1 do
    begin
      
      ScanLine^[x] := color;
      color := BGRToColor( color );
      if color = ClBlack then
        inc( Anzahl2 );

    end;

  end;
  
function BGRToColor(const BGR : Integer) : TColor;
begin
 result := (BGR and $FF000000) + ((BGR and $000000FF) shl 16) + (BGR and $0000FF00) + ((BGR and $00FF0000) shr 16);
end;
Eine Idee, weshalb das Scanline z.B. 489202 für Anzahl2 liefert -- Canvas.Pixels hingegen 5450 (was wohl richtiger ist)?

Vielen Dank
Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Pixel zählen mit Scanline

  Alt 4. Mai 2012, 20:33
Integer hat die Größe 4, RGBTriple 3

Wenn du auf ein typisiertes Array mit Typengröße 4 (Integer) zugreifst, so greifst du letzendlich so auf den Speicher:
[i] = [<Typengröße>*i] (bei Integer eben 4)


i - index
0 - 0
1 - 4
2 - 8
3 - 12
usw

Jedoch darfste eben nicht in diesen Viererschritten auf den Speicher zugreifen (sondern in Dreierschritten).
TRGBTriple eignet sich dafür gut!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#3

AW: Pixel zählen mit Scanline

  Alt 4. Mai 2012, 20:46
TRGBTriple eignet sich dafür gut!
Aha!

Wieder was dazugelernt!

Vielen Dank Aphton.

Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.112 Beiträge
 
Delphi 12 Athens
 
#4

AW: Pixel zählen mit Scanline

  Alt 4. Mai 2012, 21:45
Und auch nur, wenn man auf ein 3*8-Bit-RGB-Pixel drauf zugreift.

32 Bit pro Pixel sind 4 Byte
24 Bit nur 3 Byte (RGB)
und dann gibt es auch noch andere Formate


Delphi-Quellcode:
      ScanLine^[x] := color;
      color := BGRToColor( color );
      if color = ClBlack then
        inc( Anzahl2 );
Willst du dir Pixel auf eine Zufallsfarbe setzen oder zählen?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#5

AW: Pixel zählen mit Scanline

  Alt 4. Mai 2012, 21:48
Zählen!
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.112 Beiträge
 
Delphi 12 Athens
 
#6

AW: Pixel zählen mit Scanline

  Alt 4. Mai 2012, 22:09
Dann stimmt in dem Code was nicht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Pixel zählen mit Scanline

  Alt 4. Mai 2012, 23:14
nicht vollständig, aber als Ansatz ....
Delphi-Quellcode:
type
  pRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = ARRAY[0..$effffff] OF TRGBTriple;
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad;

Function CountBlack24(Bitmap: TBitmap):Integer;
var
  X, Y: Integer;
  NUL:TRGBTriple;
  pLine: pRGBTripleArray;
begin
  NUl.rgbtBlue := 0;
  NUl.rgbtGreen := 0;
  NUl.rgbtRed := 0;
  Result := 0;
  for Y := 0 to Bitmap.Height -1 do
  begin
    pLine := Bitmap.ScanLine[Y];
    for X := 0 to Bitmap.Width -1 do
      if (pLine[X].rgbtBlue=0) and (pLine[X].rgbtred=0) and (pLine[X].rgbtgreen=0) then inc(Result);
  end;
end;


Function CountBlack32(Bitmap: TBitmap):Integer;
var
  X, Y: Integer;
  pLine: pRGBQuadArray;
begin
  Result := 0;
  for Y := 0 to Bitmap.Height -1 do
  begin
    pLine := Bitmap.ScanLine[Y];
    for X := 0 to Bitmap.Width -1 do
      if (pLine[X].rgbBlue=0) and (pLine[X].rgbred=0) and (pLine[X].rgbgreen=0) then inc(result);
  end;
end;

Function CountBlack(Bitmap: TBitmap):Integer;
begin
  if Bitmap.PixelFormat=pf24bit then Result := CountBlack24(Bitmap)
  else Result:=CountBlack32(Bitmap)

end;


procedure TForm2.Button1Click(Sender: TObject);
var
 i:Integer;
begin
  for I := 0 to Image1.Width do

  image1.Canvas.Pixels[i,i] := clBlack;
  image1.Picture.Bitmap.PixelFormat := pf24bit;
  Showmessage(IntToStr(CountBlack(image1.Picture.Bitmap)));
  image1.Picture.Bitmap.PixelFormat := pf32bit;
  Showmessage(IntToStr(CountBlack(image1.Picture.Bitmap)));

end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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