%% Denne filen er en kjapp innføring i forskjellige begreper i matlab

% Dette er en kommentar.

% Du starter matlab ved å skrive matlab i en terminal på redhat,
% eller klikker på matlab-ikonet i windows.

% For å raskt komme i gang: Trykk F1 og velg "Getting Started"

%-------------------------------------------------------------------------

% Lag en mappe som heter INF4300 og sett current directory i matlab til å
% peke på denne. Bruk enten UI'et eller kommandoen cd i kommandovinduet.

% Lag en ny m-fil intro.m.

% Koden under kan du nå skrive inn i denne filen.

% For å kjåre koden kan du skrive intro i "Command Window", eller du kan
% merke den koden du vil kjøre for så å trykke F9.

%% Dette lager en ny blokk (Denne funksjonaliteten kan noen ganger være avslått)

%% 1. Matriser

% defineres [linje1; linje2; ... linjeN] 
% linje er [tall1,tall2,...,tallM] eller [tall1 tall2 ... tallN]

enMatrise = [1 0 0; 0 1 0; 0 0 1]

% Husk: Det er ofte enklere måter å gjøre ting på i matlab f.eks
diag([1 1 1])

% diag er en innebygget metode i matlab. 
% Lurer du på hvordan en metode virker skriv; help <metodenavn> i
% kommandovinduet.

% Når man jobber med matriser:
% - Er det lurt å definere store matriser før man jobber på dem

% Lager en 100*100 matrise med bare 1'ere
stor_1 = ones(100); %<-- ';' bakerst forhindrer utskrift
% Lager en 50*40*3 matrise med bare 0'ere
stor_0 = zeros([50 40 3]);

% Kan også enkelt lage vektorer med fast steg 
% Format <start>:<steg>:<slutt>
steg1 = 1:2:50;
% Kan droppe steget. Da blir det 1 (default)
steg2 = 1:50;
% Vis frem steg1 og steg2 med metoden stem()
% Husk at du kan finne ut hvordan stem() virker ved å skrive help stem.

% Hvordan hente ut verdier fra en matrise?
% Vi indekserer matrise(linearIndeks) eller matrise(x,y,...,dim). 
% MERK at indeksene i matlab starter på 1!
mat = [1 3 4; 3 4 5]
mat(2,1) % Hvilken 3'er er dette?

% Vi finner den andre 3'eren både ved:
mat(3)
% og
mat(1,2)

% Indeksering av deler av en matrise. (Subset indeksering)
mat(1:2,1) % gir første kolonne.
mat(1:end,1) % gir det samme siden n = 2
% Det samme gjør;
mat(:,1)
mat(1:end,1:2) % gir de to første kolonnene
% Merk at dette er ekvivalent med
mat([1 2],[1 2])
% , men at sistnevnte ofte blir tung å skrive.

% Vi setter de to første kolonnene til 0
mat(1:2,1:2) = 0

% Husk på at matrisene kan være lagret i ulike formater
% f. eks. uint8, int8, double. Se f. eks. >>help uint8
% Ofte er det her feilen ligger hvis man f?r ett rart resultat.

%% Matriseoperasjoner

mat1 = [2 3; 5 7];
mat2 = [4 5; 1 9];

% Pluss og minus
mat1 + mat2
mat1 - mat2

% transponering
mat1'

% Gange og dele
mat1 * mat2
mat1 / mat2

% komponentvise operasjoner med '.'
mat1 .* mat2
mat1 ./ mat2
mat1 .^ mat2

% Merk at det er forskjell på
mat1^2
% og
mat1.^2

%% 2. Kontrollstrukturer

% Løkker: while og for - løkker. 
% Kan som regel byttes ut med matriseoperasjoner.
% Det er det matlab kan best, og dermed går programmet fortere.
%
% I de siste utgavene av matlab så er kompilatoren blitt bedre til å
% akselerere for-løkker slik at denne regelen alltid ikke stemmer lenger.
%
% For de som vil lese mer om hvordan man skriver rask matlab-kode:
% http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=5685

% F. eks:
A = ones(1,100);
for i = 100
    A(i) = 2;
end
% er en tungvint måte å skrive:
A = ones(1,100) * 2;
% på.

% Hvorfor skrive:
for i=1:100, j=1:100; 
    stor_1(i,j) = i^2;
end
% når vi kan skrive :-)
stor_1_temp = repmat((1:100)'.^2, 1,100);
% eller enda bedre
stor_1_temp2 = (1:100)'.^2 * ones(1,100);

% Husk: 
% Det meste kan som regel gjøres uten for-løkker.
% Men det er ikke alltid det blir like lesbart. 
% Derfor; kommenter!

% Det er noen ganger viktig å ikke bruke for-løkker i lavnivåe deler av en 
% algoritme som skal behandle store datamengdene. 
% Det kan det fort bli med bilder.

% Logiske strukturer: if, elseif, else, switch, case
% Hvilket tall blir skrevet ut?
if -1
    2
else 
    1
end

var = 't';
switch var
    case 2 
        1
    case 't'
        2
end

%% Find

% Veldig praktisk, men kan virke krevende.

% Se: >>help find 

M = [1 2 3; 4 4 5; 0 0 2]
M == 4 % Gir logisk "kart"
I = find(M == 4)
[II, J] = find(M == 4)
M(I)

%% Bilder

% Åpne et bilde
img1 = imread('football.jpg');
img2 = imread('coins.png');

figure, imshow(img1)
figure, imshow(img2)

% En annen metode for å vise frem bilder er
figure, imagesc(img1)

% Histogram
H = imhist(img2);
plot(H)

% Konvertering av et fargebildet med 3 fargekanaler til et gråtonebilde
% med en kanal.
img3 = rgb2gray(img1);
figure, imshow(img3)

%% Litt basic filtrering i bildedomenet

% bruk conv2 eller imfilter

h1 = ones(5,5) / 25; % kjerne for lavpassfilter
img4 = imfilter(img3,h1);
imshow(img3), title('Original Image');
figure, imshow(img4), title('Filtered Image') 
% Legg merke til den svarte rammen. Hvordan fjerner vi den med en linje
% kode? 

% Kantdeteksjon med høypass
h2x = [1 0 -1; 2 0 -2; 1 0 -1] 
h2y = [-1 -2 -1; 0 0 0; 1 2 1]
resX = conv2(double(img3), h2x); % <- Merk. Typekonvertering til double.
resY = conv2(double(img3), h2y);
resXY = sqrt(resX.^2 + resY.^2);

figure, imshow(resXY); % Hvorfor blir dette hvitt med noen små sorte prikker?
% Følgende linjer gir alle riktig fremvisning av dataene. Hvorfor?
figure, imshow(resXY, []);
figure, imshow(resXY, [min(resXY(:)) max(resXY(:))]);
figure, imshow(resXY./max(resXY(:)));
figure, imshow(uint8(resXY./max(resXY(:)).*255));

%% Litt basic filtrering i frekvensdomenet
% Demo med lena + sin-funksjon.
% Hvordan fjerner vi den periodiske st?yen?

%% Oppgave 1: 
% Lag en funksjon som returnerer det samme som imhist med img2 som
% parameter. Funksjonen trenger bare å støtte 8 bits gråtonebilder.

% Det er lov til å bruke for-løkker, men prøv å begrens deg.

% Funksjoner lagres i .m filer som heter det samme som funksjonen.

% 1. Lag en m-fil som heter histogram.m
% 2. Første linje skal være: function H = histogram(img)
% 3. Jobben blir nå å prosessere bildet slik at vi får et histogram over de
% 256 gråtonene i H.
% 4. Lagre filen.
% 5. Fra en annen m-fil, eller kommandolinjen kan du nå kalle histogram med
% et gråtonebildet som parameter.

%% Oppgave 2:
% 
% a)
% Bruk operatorene >, <, >=, <= til å terskle img2.
%
% b)
% IPT i matlab har en egen tersklingsmetode basert på Otsu's metode
% Finn denne ved hjelp av matlabs hjelpesystem.
% Finn så terskelen.
% Bruk så denne med im2bw() til å gjøre en ny terskling av img2.

% Ser du noen forskjell?
% Hvis ikke, prøv å visualiser forskjellen.

%% Oppgave 3:
% Normaliser resXY slik at max(resXY(:)) = 255
% og min(resXY(:)) = 0.
% Terskl resultatet med T = 100.
% Tenk over hva de neste trinnene ville være hvis du skulle finne 
% hele summen på ballen for å kontrollere den.

