Laboration 4: Digitala bilder

Relevanta dokument
Laboration 3. Redovisning Uppgifterna skall vara demonstrerade och godkända av en handledare senast måndag 22/2.

Laboration 3. I1 Programmerade system, HT15

Laboration 4. Redovisning Uppgifterna skall vara demonstrerade för och godkända av en handledare senast måndag 23/2.

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-15, TDA540. Dag: , Tid:

Att skapa en bakgrundsbild och använda den i HIPP

Laboration 3: Musikbibliotek

Tentamen, Programmeringsteknik för BME, F och N

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Bildbehandling i frekvensdomänen

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-15, TDA540. Dag: , Tid:

Objektorienterad programmering D2

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

ID1004 Laboration 3, 5-6 November 2012

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-15, TDA540. Dag: , Tid:

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Så skapas färgbilder i datorn

Påminnelse: en datatyp för bilder. Programmering. En datatyp för bilder. Spegelbild. hh.se/db2004

Laboration 2. returnerar true om det är omöjligt för roboten att göra move() utan att. exekveringsfel erhålls, annars returnera false.

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Histogram över kanter i bilder

Kort om klasser och objekt En introduktion till GUI-programmering i Java

TEM Projekt Transformmetoder

Instuderingsfrågor, del D

Instuderingsfrågor, del E

Torstens Digitalbildguide

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

I den tidigare filen Manual Editor belystes grunderna för enkel uppdatering samt editorns utformning.

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Per Holm Inlämningsuppgift 2, PTDC 2014/15 2 / 19. Med c = i konvergerar inte talföljden:

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Kamerans sensor. I kameran sitter bildsensorn som består av en rektangulär platta med miljontals små ljuskänsliga halvledare av CCD eller CMOS typ.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Laboration 1. Objektorienterad programmering, Z1. Syfte

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Exempel på användning av arv: Geometriska figurer

Laboration 24 Databasen MySQL och java

Bildredigering i EPiServer & Gimp

Digital bildhantering

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen Bildanalys (TDBC30) 5p

Lab5 för prgmedcl04 Grafik

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Projekt 2 (P2) Problembeskrivning och uppdragsspecifikation

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

En grund i bildbearbetning för webben i Photoshop CS5

Labora&on 7 Syfte med laborationen:

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

GRAFISK MANUAL 1.0 FÖR SYSTEMTEXTS PRODUKTVARUMÄRKEN JANUARI 2011

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Laboration 3. Redovisning. Snabbkurs i digitalt ljud. Objektorienterad programmering

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

Presentation av trafiksimuleringsprojektet

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

OBJEKTORIENTERAD PROGRAMMERING för Z1 (TDA540)

Föreläsning 8: Exempel och problemlösning

ID1004 Laboration 4, November 2012

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Samling och kaffe. Temakväll Bildhantering i släktforskningen Genomgång kring temat. Forska själv. Forska själv. Diskussion kring temat

Tentamen, EDAA20/EDA501 Programmering

Grundredigering i Photoshop Elements. Innehåll. Lennart Elg Grundredigering i Elements Version 2, uppdaterad

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Institutionen för TENTAMEN CTH VT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Så här använder du de enklaste funktionerna i programmet: Starta programmet. Programmet startas från ikonen på skrivbordet.

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Tentamen, EDAA20/EDA501 Programmering

Lösningsförslag övning 2.

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Laboration 13, Arrayer och objekt

Tvådimensionella fält

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Bildförbättring i spatial domänen (kap. 3) Bildförbättring (enhancement) Spatial domän. Operatorer. Tröskling (threshold) Gråskale-transformationer

Laboration 1 - Grunderna för OOP i Java

Tentamen i Grundläggande programmering STS, åk 1 lördag

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Laboration 3, uppgift En klass för en räknare

Tentamen i Objektorienterad programmering E

Tentamen i Programmeringsteknik I

JAVA Mer om klasser och objektorientering

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen i Programmeringsteknik I

Objektorientering: Lagring, räckvidd och livstid

Malmö högskola 2008/2009 CTS

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

Objektorienterad programmering i Java

Transkript:

Objektorienterad programmering, Z : Digitala bilder Syfte I denna laboration skall vi återigen behandla transformering av data, denna gång avseende digitala bilder. Syftet med laborationen är att få förståelse för och erfarenhet av att använda flerdimensionella fält. Redovisning Källkoden för uppgifterna skall lämnas in via Fire senast torsdag 23/. Lämna in samtliga källkodsfiler som en komprimerad zip-fil. Uppstart Börja med att skapa en ny mapp Lab4. Ladda ner filen fileslab4.zip från kursens hemsida och kopiera innehållet i denna fil till mappen Lab4. Snabbkurs i digital bildrepresentation En digital bild kan representeras som ett tvådimensionellt fält av bildpunkter eller pixlar (eng. pixels, för picture elements). I en digital gråskalebild är en bildpunkt ett heltalsvärde i intervallet -255, där värdet betecknar svart och värdet 255 betecknar vitt. En bild har en viss storlek, dvs ett visst antal bildpunkter i höjdled och ett visst antal bildpunkter i sidled. En gråskalebild kan således representeras med ett tvådimensionellt fält av typen int[][], där den första dimensionen definierar bildens höjd och den andra dimensionen definierar bildens bredd. En variabel som representera en gråskalebild med höjden HEIGHT pixlar och bredden WIDTH pixlar kan skapas med satsen: int[][] grayimage = new int[height][width]; Elementet grayimage[2][4] anger alltså gråtonen i den pixel som återfinns 2 pixlar nedåt från bildens övre vänstra hörn och 4 pixlar åt höger. Observera att grayimage[][] är pixeln i övre vänstra hörnet i bilden och att grayimage[height][width] är pixeln i nedre högra hörnet. En digital färgbild lagras på RGB-format, där varje bildpunkt utgörs av tre heltalsvärden i intervallet -255. De enskilda värdena representerar intensiteten av färgerna rött, grönt och blått. En färgbild kan således avbildas med ett tredimensionellt fält av typen int[][][], är den första dimensionen definierar bildens höjd, den andra dimensionen definierar bildens bredd och den tredje dimensionen representerar färgerna rött, grönt respektive blått. En variabel som representera en färgbild med höjden HEIGHT pixlar och bredden WIDTH pixlar kan skapas med satsen: int[][][] colorimage = new int[height][width][3]; Elementer colorimage[8][56][] anger alltså intensiteten av grönt i den pixel som återfinns 8 pixlar nedåt från bildens övre vänstra hörn och 56 pixlar åt höger. Javas API innehåller ett antal klasser för att hantera både gråskalebilder och färgbilder som lagras på olika bildformat, såsom jpg, jpeg, gif och png. För att kunna genomföra laborationen behöver ni inte ha någon kunskap om dessa klasser, utan de används i de färdskrivna klasserna som bifogas till laborationen. (6)

Uppgift : Gråskalebilder I denna uppgift skall ni skriva ett antal metoder för behandling av gråskalebilder. Till er hjälp har ni klasserna GrayImage, GrayImagePanel, GrayImageWindow och MyGrayProgram. Klassen GrayImage tillhandahåller de publika klassmetoderna static int[][] read(string filename) som läser in en bild, lagrad på gif-, jpg-, jpeg- eller png-format, från filen filename och returnerar den som ett tvådimensionellt heltalsfält. Om ursprungsbilden i filen är en färgbild översätts denna till en gråskalebild. som skriver ut fältet picture som en gråskalebild på formatet gif, jpg, jpeg eller png till en fil med namnet filename. static void write(string filename, int[][] picture) Klassen GrayImageWindow tillhandahåller en konstruktor GrayImageWindow(int[][] picture, int[][] picture2) som skapar ett fönster i vilket fälten picture och picture2 ritas ut som gråskalebilder (enligt nedan). Klassen MyGrayProgram innehåller nedanstående kod och producerar fönstret som visas ovan. public class MyGrayProgram { public static void main(string[] args) throws Exception{ int[][] original = GrayImage.read("mushroom.jpeg"); int[][] manipulated = updown(original); GrayImage.write("upDownMushroom.jpeg", manipulated); GrayImageWindow iw = new GrayImageWindow(original, manipulated); }//main public static int[][] updown(int[][] samples) { int[][] newsamples = new int[samples.length][samples[].length]; for (int row = ; row < samples.length; row = row + ) for (int col = ; col < samples[row].length; col = col + ) newsamples[row][col] = samples[samples.length - row - ][col]; return newsamples; }//updown }//MyGrayProgram I klassen finns metoden public static int[][] updown(int[][] samples) som tar ett tvådimensionellt fält samples (som representerar en gråskalebild) och returnerar ett nytt tvådimensionellt fält (som också representerar en gråskalebild). Det nya fältet som metoden returnerar är en spegelvänd kopia av fältet samples roterad runt den horisontella axeln, dvs första raden i det nya fältet är sista raden i samples, andra raden i det nya fältet är näst sista raden i samples, osv. Metoden användas alltså för att vända en bild upp och ner. Metoden main läser in en fil (mushroom.jpeg) som innehåller en bild och lagrar denna som en gråskalebild i det tvådimensionella fältet original, skapar ett nytt fält manipulated genom att anropa metoden updown med fältet original, skriver ut fältet manipulated som en bild till filen updownmushroom.jpeg och skapar slutligen ett fönster där filerna original och manipulated ritas ut som bilder. 2 (6)

Din uppgift är att utöka klassen MyGrayProgram med följande metoder: public static int[][] leftrigt(int[][] samples) som returnerar en spegelvänd kopia av samples roterad runt den vertikala axeln. public static int[][] invert(int[][] samples) som returnerar en kopia av samples där värdet si, j för varje element i samples har ersätts med värdet 255- si, j. public static int[][] toblackwhite(int[][] samples) som returnerar en kopia av samples där värde si, j för varje element i samples har ersätts med värdet om si, j är mindre än 28 och med värdet 255 om si, j är större eller lika med 28. public static int[][] conture(int[][] samples) som returnerar konturen av samples. En kontur i en svartvit bild definieras enligt nedan: I konturen av bilden samples, skall en pixel vara svart om och endast om samples[i][j] är svart och antingen (i, j) ligger på randen i samples eller (i, j) har minst en granne som är vit i samples. Randen i bilden utgörs av de yttre raderna och kolumnerna. Grannar till (i, j) är alla (ik, jk) sådan att ik i..i+ och jk j..j+. Bildpunkter som ligger på randen kan inte direkt beräknas med detta uttryck eftersom dessa bildpunkter saknar en eller flera närliggande punkter. Ni kan bortse från bildpunkterna på randen och låta dessa ha samma värden som i den svartvita varianten av originalbilden. orginal leftright invert toblackwhite conture För att rita ut t.ex. den spegelvända kopian ändrar ni satsen int[][] manipulated = updown(original); i main-metoden i klassen MyGrayProgram till int[][] manipulated = leftright(original); Vill ni lagra den nya bilden som en jpeg-bild ändrar ni också satsen GrayImage.write("upDownMushroom.jpeg", manipulated); exempelvis till GrayImage.write("leftRightMushroom.jpeg", manipulated); Om ni vill använda någon annan bild än den som finns på filen mushroom.jpeg kan ni naturligtvis göra detta genom att lagra en annan bildfil i mappen där ni har er programkod och ändra i main-metoden så att denna bildfil läses in i stället för filen mushroom.jpeg. Uppgift 2: Färgbilder För färgbilder finns klasserna ColorImage, ColorImagePanel, ColorImageWindow och MyColorProgram. Klassen ColorImage tillhandahåller klassmetoderna static int[][][] read(string filename) som läser in en bild på gif-, jpg-, jpeg- eller png-format från filen filename och returnerar den som ett tredimensionellt heltalsfält. 3 (6)

som skriver ut fältet picture som en bild på formatet gif, jpg, jpeg eller png till en fil med namnet filename. static void write(string filename, int[][][] picture) Klassen ColorImageWindow tillhandahåller en konstruktor ColoImageWindow(int[][][] picture, int[][][] picture2) som skapar ett fönster i vilket fälten picture och picture2 ritas ut som färgbilder (enligt nedan). Klassen MyColorProgram har utseendet: public class MyColorProgram { public static void main(string[] args) throws Exception { int[][][] original = ColorImage.read("mushroom.jpeg"); int[][][] manipulated = updown(original); ColorImage.write("upDownMushroom.jpeg", manipulated); ColorImageWindow iw = new ColorImageWindow(original, manipulated); }//main public static int[][][] updown(int[][][] samples) { int[][][] newsamples = new int[samples.length][samples[].length][3]; for (int row = ; row < samples.length; row = row + ) for (int col = ; col < samples[row].length; col = col + ) for (int c = ; c < samples[row][col].length; c = c + ) newsamples[row][col][c] = samples[samples.length-row][col][c]; return newsamples; }//updown }//MyColorProgram a) Din uppgift är att utöka klassen MyColorProgram med följande metoder: public static int[][][] leftrigt(int[][][] samples) public static int[][][] invert(int[][][] samples) public static int[][][] togray(int[][][] samples) public static int[][][] toblackwhite(int[][][] samples) leftright invert togray 4 (6) toblackwhite

Inversen till en färgbild erhålls genom att för varje pixel i originalbilden ersätta intensiteten s i, j för var och en av färgerna röd, grön och blå med värdet 255- si, j. För att få bästa kvalitén på den gråskalebild (och därmed den svartvita bild) som erhålls från en färgbild skall ni beräkna bildpunkternas luminans. Luminansen L är den för ögat upplevda ljusheten hos en yta och definieras som L =.299 r +.587g +.4b där r är intensiteten av rött, g är intensiteten av grönt och b är intensiteten av blått. I den gråskalebild som beräknas från en färgbild, sätts intensiteten av färgerna rött, grön och blått i varje pixel till värdet L i motsvarande pixel i färgbilden. I den svartvita bild som erhålls från en färgbild, sätt intensiteten av färgerna rött, grön och blått i varje pixel till värdet om L i motsvarande pixel i färgbilden är mindre än 28 och till 255 om L är större eller lika med 28. b) I bildanalys används ofta så kallade faltningsfilter för att lyfta fram sådant som är intressant i bilden. Det kan t.ex. röra sig om att ta bort brus, eller att reducera eller framhäva konturer i bilden. Vid användning av faltningsfilter beräknas ett nytt värde på en bildpunkt genom att, förutom att beakta bildpunkten själv, även beakta närliggande bildpunkter. Ett faltningsfilter kan således anses som en matris. Faltningsfiltret 9 är ett filter som förändrar skärpan i bilden. Filtret anger att det nya värdet i en bildpunkt beräknas genom att multiplicera bildpunktens gamla värde med 9 och subtrahera med varje närliggande bildpunkt. Detta kan också uttryckas på följande sätt: Alla bildpunkter newi,j i den bild som erhålls med faltningsfiltret och som inte ligger på randen i bilden beräknas av uttrycket newij = *oldi,j *oldi,j *oldi,j+ *oldi,j + 9*oldi,j *oldi,j+ *oldi+,j *oldi+,j *oldi+,j+ där oldi,j är värdet för bildpunkten i,j i bilden som filtreras. I en färgbild appliceras faltningsfiltret på varje enskild färgkomponent. Värdet av den nya bildpunkten newi,j kan bli negativt eller större än 255. Detta måste kontrolleras. Negativa värden sätts till och värden större än 255 sätts till 255. Ett annat faltningsfilter som förändrar skärpan är 5 För att beräkna det nya värdet av en bildpunkt används i detta filter endast 4 av de 8 närbelägna bildpunkterna. Resultatet av de båda filtren ser ni nedan. Utöka klassen MyColorProgram med metoderna public static int[][][] shapenone(int[][][] samples) public static int[][][] shapentwo(int[][][] samples) som implementerar de båda ovan beskrivna faltningsfiltren. 5 (6)

c) För att detektera kanter i bilder appliceras två filter på original bilden (ett filter för att få fram kanterna i x-led och ett filter för att få fram kanterna i y-led). Ett välkänt kantdekteringsfilter är Sobel-filtret, vars faltningsmatriser har följande utseende: 2-2 2-2 Om vi för varje enskild färgkomponent betecknar resultatet från dessa båda filter för bildpunkten (i, j) som dx(i, j) respektive dy(i,j), beräknas slutresultatet från Sobel-filteringen som s i, j = d x i, j 2 d y i, j 2. Utöka klassen MyColorProgram med metoden public static int[][][] sobel(int[][][] samples) som implementerar Sobel-filtret enligt beskrivningen ovan. Bild som filtrerats med Sobel-filter. Bild som först filtrerats med Sobel-filter, och sedan inverterats. Slutkommentar Antalet bearbetningar man kan göra på bilder är näst intill obegränsat. Ni kan säkert komma på egna förslag på metoder att implementera. Den intresserade kan också hitta många ytterligare exempel på bildbehandling och filter genom sökning på nätet. Några lämpliga adresser att börja med är: http://en.wikipedia.org/wiki/image_editing http://en.wikipedia.org/wiki/sobel_operator 6 (6)