vraagje over java JPEG encoding

Pagina: 1
Acties:

  • CaMmY
  • Registratie: Oktober 2001
  • Laatst online: 16-09 22:34

CaMmY

Water, Gerstemout en Hop

Topicstarter
Ok, ik zal eerlijk zijn dit is een onderdeel van ons project op school, maar we zitten met een probleempje.

Bij het progranmeren van de "run length encoder" moet er vooor gezorgt worden dat uit een 2d array bijvoorbeeld 0000 opgslagen wordt als 4x0 of iets dergelijks....

Dit moet waarschijnlijk met een lusje maar we komen er niet echt uit...

Iemand iedeeën ?

Kunnen we misschien weer verder =]

/me Een echte patomaan


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Wat jij vraagt lijkt meer op een compressie algoritme (lzw, zip) eerlijk gezegd. JPEG zit een stuk ingewikkelder in elkaar. Wat bedoel je precies?

Als je gewoon lzw wilt toepassen moet je even het algoritme goed bekijken. Het is daarna vrij simpel te implementeren.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:25

Janoz

Moderator Devschuur®

!litemod

Mwah .. Na de fourier transformatie en het weghalen van de niet zichtbare data krijg je een enorme hoeveelheid nullen in je data. Dus het heeft op zich wel een heleboel van Jpeg weg.. Ikzelf heb een tijdje terug ook wat omgeklooid met compressie van beelden. Hierbij gebruikten we een echte fourier transformatie ipv de cosinustransformatie die bij Jpeg gebruikt wordt.

Voor het comprimeren hebben we toen gebruik gemaakt van een soort bitmap.. Gewoon een array van booleans (echt 1 bit!!) die aangaf of er op een bepaalde positie een 0 of een waarde stond, en vervolgens alleen de punten met een waarde weggeschreven... Maarja, bij dat practicum ging het vooral over de fourier en de eliminatie van niet zichtbare data, en vervolgens mochten we een schatting van de gerealiseerde compressie geven.....

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • CaMmY
  • Registratie: Oktober 2001
  • Laatst online: 16-09 22:34

CaMmY

Water, Gerstemout en Hop

Topicstarter
Ok, het wuz dus niet duidelijk genoeg, het gaat erom dat we dus een plaatje mbv een jpeg algoritme moeten comprimeren, we zijn nu zo ver dat we een plaatje verdelen in arrays van 8 bij 8 pixels, na deze vermenigvuldigd te hebben met een bep. array, komen er in de arrays van 8 bij 8 veel nullen te staan wat ons probleem nu is dat we niet weten hoe we kunnen zeggen dat er meerdere nullen achter elkaar staan bijvoorbeeld: int [][] voorbeeldarray = {
{0,0,0,0,0,0,0,9},
{12,12,14,19,26,58,60,55},
{14,13,16,24,40,57,69,56},
{14,0,0,0,0,0,0,62},
{18,22,37,56,68,109,103,77},
{24,35,55,64,81,104,113,92},
{49,64,78,87,103,121,120,101},
{72,92,95,98,112,100,103,99},
};

hoe zorg je er nu voor dat het program ziet dat er op bijvoorbeeld de eerte regel 7 nullen achter elkaar staan en hij dit weergeeft als (bijvoorbeeld); 0(6)(een nul plus nog zes nullen dus),9,enz..,that's it. laterzzzzz

/me Een echte patomaan


  • TD-er
  • Registratie: Januari 2000
  • Laatst online: 28-08 16:22
Runlength encoding is in principe vrij eenvoudig.
Je kijkt gewoon naar de data en als je goed de data voorbewerkt, dan kun je een bit-stroom genereren, die je zelf kunt opslaan en weer terug lezen.
Met de wetenschap dat je voor elk getal maar 5 a 6 bits nodig is, kun je bijvoorbeeld definieren dat het "getal" 111111 voorstelt dat alles wat erna komt van het formaat is [waarde][aantal].
Als je nu ook even rekening houdt met het fiet dat dit pas winst oplevert, wanneer er >3 dezelfde waardes voorkomen, dan kun je eventueel nog kiezen om [aantal] de betekenis te geven van [aantal+3]
Die 6 bits per waarde hebben we moeten afleiden in hetzelfde practicum, als waar Janoz het over heeft gehad.
Daarvoor moet je wel een beetje een goede quantisatie-methode gebruiken.
Voor informatie over Quantisatie en fourier, moet je maar ff kijken naar het verslag wat ik erover geschreven heb. (mogelijk dat Janoz zijn verslag ook online heeft staan ;) )

[aanvulling]
Bij Jpeg gebruik je een DCT (Discrete Cosinus Transformatie) ipv een fourier-.
Het voordeel is dat het alle hoge waarden links boven heeft staan ipv in het midden zoals bij fourier.
Je kunt dan een soort van zigzag beweging gebruiken (linksboven beginnen en dan de lijnen parallel aan de diagonaal aflopen, maar dat heb je volgens mij al gedaan, gezien de data) , want dan heb je de hoogste waarden eerst en de nullen aan het eind (achter elkaar)

Een goedkope voeding is als een lot in de loterij, je maakt kans op een paar tientjes korting, maar meestal betaal je de hoofdprijs. mijn posts (nodig wegens nieuwe layout)


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:25

Janoz

Moderator Devschuur®

!litemod

Verslag is niet online.. Alleen de plaatjes die in de appendix zaten en de source staan op http://www.fmf.nl/~janoz/BB/opgave5.html

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1