Toon posts:

[VB/Delphi] % rood in een JPG

Pagina: 1
Acties:
  • 209 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Mijn pa is tuinder en nou wil hij een programmatje hebben dat het %rood in een foto vindt.
(kun je nl. zien hoeveel tomaat er per plant zit)

Nu ben ik een beetje handig met programmeren (VB & Delphi).

Weet iemand waar je een duidelijke uitleg kan krijgen hoe JPG's opgebouwd zijn. En hoe ik ze in VB of Delphi (of iets anders?) zo kan inlezen dat ik de kleurcode's kan uitlezen, en daarmee het %rood kan bepalen.

Ik heb wel gezocht mee googel maar iets echt duidelijk heb ik niet kunnen vinden.

Kan iemand mij naar een hulpzame site verwijzen? Of misschien een andere hint/tip/aanwijzing geven?

Verwijderd

Topicstarter
Oh sorry als dit topic meer bij programmeren hoort.

Verwijderd

ikke gok inderdaad p&w. voor delphi zijn er allerlei components die jpg's in kunnen lezen, zie oa www.torry.net

  • Willem
  • Registratie: Februari 2001
  • Laatst online: 04-09 23:23
En toch lijkt me een JPG niet helemaal handig als je het mij vraagt, aangezien het om een gecomprimeerd plaatje gaat, en de dat kleurechtheid vaak verre van realistisch is.

Motor (of auto) onderhoud bijhouden


Verwijderd

het vesrchil tussen een tomaat en een blaadje haal je er toch wel uit denk ik :P

  • Hangloozz
  • Registratie: Juli 1999
  • Laatst online: 13-07 17:24

Hangloozz

{ @$%&# }

zoek es op 'watershed algorithm' op Google...

www.jurgroessen.nl


Verwijderd

Topicstarter
Tja het was de bedoeling om van tevoren op te geven wat je rood vind en wat niet meer (2 grenzen) en alles wat daar tussen zit zou rood moeten zijn....

  • cutter
  • Registratie: November 2000
  • Laatst online: 28-09-2025

cutter

Wannabe i7 fanboy

titel edited
+
move 13--->14 na overleg.

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 30-11-2025

WOmBaT

Nyaaa!!!

Gewoon inlezen in een TBitmap lijkt me... Dat kun je via die jpeg unit gewoon doen..
Daarna per pixel opsplitsen in RGB en kijken bij welke waarde je vind dat het een tomaat is... :)

Verwijderd

Topicstarter
Ik kan (volgens mij) alleen bij bitmaps (bmp) de kleuren uitsplitsen in standaard delphi (6). Nog iemand suggesties?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Er zal wel een standaard image representatie zijn in delphi, in java en php noemt men het gewoon image, hoe het in delphi heet weet ik niet.

Die kan je over het algemeen maken van een willekeurige bron file als jpg, png, gif, bmp etc.

Daar zijn wel standaard libraries/modules/etc voor.

Als je het eenmaal in zoiets hebt ingelezen is het min of meer triviaal om de percentages rood te bepalen.
Het inlezen is, door die standaard libs, overigens ook erg simpel :)

  • elnino
  • Registratie: Augustus 2001
  • Laatst online: 03-09 05:13
Let ook wel op met het inlezen van het % rood. Je kunt niet zomaar naar de RGB waarde kijken om te zeggen of iets rood is. Als je bijvoorbeeld de kleur geel hebt, heeft dat een RGB code van 255 rood, 255 groen en 0 blauw. Je zult dus ook naar de andere kleuren moeten kijken.

Je kunt dus beter zeggen dat rood groter dan bijv. 150 moet zijn, groen kleiner dan 100 en blauw ook kleiner dan 100.

Hiermee zul je dus ook nog rekening moeten houden. Voor het uitlezen van bestandsformaten kun je trouwens ook op deze site kijken: The Programmer's File Format Collection. Hier staan de specificaties van ontzettend veel bestandsformaten, ook grafische. Het gebruiken van een library is overigens nog handiger, zoals ACM al aangaf hierboven. Ik hoop dat je hier wat aan hebt.

Verwijderd

Even wat zitten proberen en het gaat prima.
Geel/Oranje wordt hier niet meegenomen aangezien ook die gewoon een RGB samenstelling hebben.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
uses
  JPEG;

procedure TForm1.Button1Click(Sender: TObject);
var
  JPG: TJPEGImage;
  Bmp: TBitmap;
  pScanLine: PByteArray;
  iWidth,
  iHeight,
  X, Y,
  iRedFound: Integer;
  dPercent: Double;
begin
  JPG:=TJPEGImage.Create;
  try
    JPG.LoadFromFile('C:\WINNT\Web\Wallpaper\Bloemblad.jpg');
    Bmp:=TBitmap.Create;
    try
    Bmp.PixelFormat := pf24bit;
    Bmp.Width := JPG.Width;
    Bmp.Height := JPG.Height;
    Bmp.Canvas.Draw(0, 0, JPG);
    iWidth:=Bmp.Width*3; // 24 bits (3*8 bits)
    iHeight:=Bmp.Height;
    iRedFound:=0;
    for Y:=0 to iHeight-1 do
    begin
      pScanLine:=Bmp.ScanLine[Y];
      X:=0;
      while X<iWidth-1 do
      begin
        // Blauw (X) 0..100 (beetje blauwe tint mag wel)
        // Groen (X+1) 0..100(beetje groene tint mag wel)
        // Rood (X+2) 128..255 (het rood moet wel te zien zijn natuurlijk)
        if (pScanLine^[X]<=100) and (pScanLine^[X+1]<=100) and (pScanLine^[X+2]>128) then
        inc(iRedFound);
        inc(X, 3);
      end;
    end;
    Self.Canvas.Draw(0, 0, Bmp); // Toon plaatje om te laten zien dat we echt een JPEG gelezen hebben.
    Application.ProcessMessages;
    if iRedFound>0 then
      dPercent:=100/((iWidth/3)*iHeight)/iRedFound
    else
      dPercent:=0;
    ShowMessage(FloatToStr(dPercent));
    finally
     Bmp.Free;
    end;
  finally
    JPG.Free;
  end;
end;

Even wat sleutelen aan de groen en blauw waardes en je moet redelijk ver kunnen komen.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op woensdag 12 juni 2002 15:49 schreef elnino het volgende:
Let ook wel op met het inlezen van het % rood. Je kunt niet zomaar naar de RGB waarde kijken om te zeggen of iets rood is. Als je bijvoorbeeld de kleur geel hebt, heeft dat een RGB code van 255 rood, 255 groen en 0 blauw. Je zult dus ook naar de andere kleuren moeten kijken.

Je kunt dus beter zeggen dat rood groter dan bijv. 150 moet zijn, groen kleiner dan 100 en blauw ook kleiner dan 100.
De betere aanpak is om de verhoudingen te checken:
RGB ( 149,0,0 ) is ook wel rood, veel roder dan (150,100,100). Het is dus logischer om te denken aan R>c*B && R>c*G met c ergens tussen de 1 en 2.

Of je transformeert RGB naar HSV en je checkt Hue.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
En hoe werkt dat?

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

I hate to bother you, maar hier zijn toch al zat standaard proggels voor?
Ik kan me een gratis scripting language herinneren die extreem snel bv. aantal bonen op een witte achtergrond kon tellen; zo kon je zelfs bepalen hoeveel bonen er in een pot gingen...

Klaar voor een nieuwe uitdaging.


Verwijderd

Topicstarter
Jaaaa maar waar kan ik die standaart proggies vinden ?!?!?!
Ik heb gezocht meet googel enzo maar daar kan ik ze niet vinden....

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

kijk eens op efg's delphi pages, staan vast wel tips...
standaart proggies
en proggen doe je zelf, niet andermans proggies gebruiken ;)

btw je naam is dat je studentenno of zo?

Cogito Ergo Credo


Verwijderd

Topicstarter
Ja ik weet dat ik daar kan kijken, maar dat heb ik al gedaan en daar was nix (bruikbaars) te vinden....
Ik heb gevraagd of iemand een site wist waar ik informatie erover kon vinden |:(

Verwijderd

Op vrijdag 14 juni 2002 12:48 schreef s456819 het volgende:
Ja ik weet dat ik daar kan kijken, maar dat heb ik al gedaan en daar was nix (bruikbaars) te vinden....
Ik heb gevraagd of iemand een site wist waar ik informatie erover kon vinden |:(
Heb je mijn voorbeeld nog geprobeerd? Deed het wat je bedoelde of totaal niet?

Verwijderd

Topicstarter
Ja jou voorbeeld werkt goed!

Ik ben alleen nog op zoek hoe dat je die RGB-waarden kan laten zien, zodat je ze eventueel kan aanpassen.
(resp 128, 100 en 100).

Maar daar zal ik wel uitkomen

Verwijderd

Op zaterdag 15 juni 2002 11:25 schreef s456819 het volgende:
Ja jou voorbeeld werkt goed!

Ik ben alleen nog op zoek hoe dat je die RGB-waarden kan laten zien, zodat je ze eventueel kan aanpassen.
(resp 128, 100 en 100).

Maar daar zal ik wel uitkomen
Maar dat moet dan toch een peultje zijn?

ScanLine is een array van bytes waarmee je afhankelijk van de diepte de kleur kan vragen of instellen:
Bij 24-bit (3*8 bit [B, G en R]) kun je de afzonderlijke RGB-waardes vragen en instellen.

Verwijderd

Topicstarter
Ja maar je kunt dus niet 155 X 155 x 128 = 3 miljoen kleuren laten zien... |:(

  • PieterJ
  • Registratie: Juli 2000
  • Laatst online: 04-09 15:30
Misschien suf hoor, maar als je je foto eerst converteerd naar 16 kleuren gif?

Dan heb je twee kleuren rood en twee kleuren groen.
Er zijn op tucows zat programma's die dat batch gewijs kunnen.

bv Graphic converter 2001

Ben even de spec's van een gif bestand aan het zoeken.

Sorry,is nog wat veel om over te tikken. Ik heb wel een stukje C source die laat zien hoe je een gif decompressed. Maar dat moet je dan wel herschrijven naar VB/Delphi.

Dat wil ik je wel mailen

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 04-09 14:31

sopsop

[v] [;,,;] [v]

Wellicht kun je ff zoeken op histogram. Moment:

AdOculos - PC-based image processing without the need of extensive programming knowledge
The following image processing functions are realized as DLLs. The complete C source code of these DLLs is part of the standard pack. Point, local and global, morphological operations Texture, image sequence Histograms procedures Hough and color transformations Automatic counting and interactive measuring Pattern recognition, graylevel profile General purpose and display functions ( The Imaging Source)

bron

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Kijk hier eens:
http://www.efg2.com/Lab/

www.fendt.com | Nikon D7100 | PS5

Pagina: 1