\section{Bayer σε RGB}

Στο πρώτο κομμάτι της εργασίας ζητήθηκε η ανακατασκευή μίας RGB εικόνας από ένα πίνακα Bayer, όπως αυτός θα προέκυπτε από έναν αισθητήρα CCD ή CMOS μίας κάμερας. Ο αλγόριθμος αυτός υλοποιείται στη συνάρτηση \texttt{bayer2rgb}. Απαίτηση της εργασίας ήταν επίσης η ταυτόχρονη αλλαγή μεγέθους (resizing) της εικόνας και ο υπολογισμός των τιμών φωτεινότητας των καναλιών στις νέες θέσεις.

Αρχικά υπολογίζονται οι τετμημένες και τεταγμένες των νέων θέσεων του πλέγματος (grid) της εικόνας. Γνωρίζουμε ότι τα σημεία που βρίσκονται στις τέσσερις γωνίες τις εικόνας αντιστοιχούν στα τέσσερα γωνιακά σημεία του αρχικού πλέγματος Bayer. Υπολογίζουμε την οριζόντια και κατακόρυφη απόσταση μεταξύ δύο διαδοχικών σημείων χρησιμοποιώντας τις εξισώσεις:

\begin{equation}
h = \frac{M_0 - 1}{M - 1}
\end{equation}

\begin{equation}
l = \frac{N_0 - 1}{N - 1}
\end{equation}

Οι τετμημένες και τεταγμένες μπορούν να υπολογιστούν εύκολα στη Matlab:
\begin{lstlisting}[language=Octave]
gridX = 1:l:M0
gridY = 1:h:N0
\end{lstlisting}

Έπειτα πρέπει να υπολογιστούν οι τιμές φωτεινότητας κάθε καναλιού στις θέσεις του πλέγματος. Για τον υπολογισμό αυτό υλοποιήθηκαν δύο μέθοδοι, αυτή του κοντινότερου γείτονα (``Nearest neighbor'') και αυτή της διγραμμικής παρεμβολής (``Bilinear interpolation'').

\subsection{Nearest Neighbor}

Για τη μέθοδο του κοντινότερου γείτονα ο αλγόριθμος βασίστηκε σε απλές παρατηρήσεις των χωρικών ιδιοτήτων του πλέγματος Bayer. Συγκεκριμένα ο κώδικας για την εύρεση του κοντινότερου γείτονα του κόκκινου και μπλε καναλιού είναι όμοιος καθώς οι μετρήσεις των δύο χρωμάτων έχουν παρόμοια διάταξη στο χώρο στο πρότυπο Bayer.

Παρατηρώντας το μοτίβο Bayer βλέπουμε ότι κάθε τετράδα μετρήσεων αυτών των χρωμάτων ορίζει ένα τετράγωνο χώρο μέσα στον οποίο ο κοντινότερος γείτονας είναι πάντα μία από τις κορυφές του τετραγώνου. Ορίζεται ένα ορθοκανονικό σύστημα συντεταγμένων με κέντρο το κέντρο βάρους του τετραγώνου, έτσι σε κάθε τεταρτημόριο του συστήματος αυτού υπάρχει ακριβώς μία από τις κορυφές του τετραγώνου. Με αυτό το τρόπο, για να βρεθεί ο κοντινότερος γείτονας κόκκινης ή μπλε μέτρησης ενός σημείου, αρκεί να βρεθεί σε ποιο τεταρτημόριο ανήκει το σημείο.

Σχήματα εδώ!! ======================================================================================

Παρατηρούμε ότι στο Bayer pattern:
\begin{itemize}
  \item η \textbf{τετμημένη} των \textbf{κόκκινων} σημείων είναι πάντα \textbf{περιττός} ακέραιος αριθμός
  \item η \textbf{τεταγμένη} των \textbf{κόκκινων} σημείων είναι πάντα \textbf{ζυγός} ακέραιος αριθμός
  \item η \textbf{τετμημένη} των \textbf{μπλε} σημείων είναι πάντα \textbf{ζυγός} ακέραιος αριθμός
  \item η \textbf{τεταγμένη} των \textbf{μπλε} σημείων είναι πάντα \textbf{περιττός} ακέραιος αριθμός
\end{itemize}

Βασιζόμενοι σε αυτή τη παρατήρηση υπολογίζουμε αρχικά, για κάθε σημείο πλέγματος RGB εικόνας, τον κοντινότερο περιττό και ζυγό ακέραιο της τεμτημένης και τεταγμένης του σημείου. Έπειτα η τιμή του κοντινότερου γείτονα στο πλέγμα Bayer είναι για κάθε χρώμα:

\begin{lstlisting}[language=Octave]
red = bayerArray(nearestEvenRow, nearestOddCol);
blue = bayerArray(nearestOddRow, nearestEvenCol);
\end{lstlisting}

Σχήματα εδώ!! ======================================================================================

Το πράσινο χρώμα στο μοτίβο Bayer έχει διαφορετική χωροταξία, για αυτό και απαιτείται διαφορετική αντιμετώπιση στον υπολογισμό των συντεταγμένων του κοντινότερου γείτονα. Ωστόσο ο υπολογισμός βασίζεται και πάλι σε παρατήρηση των χωρικών ιδιοτήτων του πλέγματος.

Παρατηρούμε ότι τέσσερα πράσινα σημεία ορίζουν ένα ρόμβο. Ορίζουμε ένα ορθογώνιο σύστημα συντεταγμένων, περιστραμμένο κατά 45\textdegree{} αντιορολογιακά. Όμοια με πριν, σε κάθε τεταρτημόριο του συστήματος συντεταγμένων υπάρχει μόνο μία κορυφή του ρόμβου.

Οι συντεταγμένες του πλέγματος των RGB σημείων στρογγυλοποιούνται στον κοντινότερο ακέραιο. Αν το σημείο που προκύπτει είναι ένα από τα σημεία του Bayer που περιέχουν τη πληροφορία του πράσινου, τότε αυτός είναι ο κοντινότερος γείτονας. Αν αυτή δεν είναι η περίπτωση σημαίνει ότι οι συντενταγμένες που υπολογίστηκαν είναι αυτές του κέντρου βάρους του ρόμβου. Για να βρούμε τις σωστές συντεταγμένες υπολογίζουμε τις ευθείες που περνούν από το κέντρο με κλίση 1 και -1:

\begin{equation}
y = x + b_1
\label{eq:green_rhombus_1}
\end{equation}

\begin{equation}
y = -x + b_2
\label{eq:green_rhombus_2}
\end{equation}

Σχήματα εδώ!! ======================================================================================

Διακρίνονται τέσσερις περιπτώσεις:

\begin{itemize}
  \item το αρχικό σημείο βρίσκεται πάνω από την ευθεία \ref{eq:green_rhombus_1} και πάνω από την ευθεία \ref{eq:green_rhombus_2} τότε ο κοντινότερος γείτονας είναι το σημείο Α
  \item το αρχικό σημείο βρίσκεται πάνω από την ευθεία \ref{eq:green_rhombus_1} και κάτω από την ευθεία \ref{eq:green_rhombus_2} τότε ο κοντινότερος γείτονας είναι το σημείο Β
  \item το αρχικό σημείο βρίσκεται κάτω από την ευθεία \ref{eq:green_rhombus_1} και κάτω από την ευθεία \ref{eq:green_rhombus_2} τότε ο κοντινότερος γείτονας είναι το σημείο Γ
  \item το αρχικό σημείο βρίσκεται κάτω από την ευθεία \ref{eq:green_rhombus_1} και πάνω από την ευθεία \ref{eq:green_rhombus_2} τότε ο κοντινότερος γείτονας είναι το σημείο Δ
\end{itemize}

\subsection{Bilinear interpolation}

Στη μέθοδο της διγραμμικής παρεμβολής απαιτείται η εύρεση των συντεταγμένων των τεσσάρων κοντινότερων σημείων και ύστερα η υλοποίηση της παρεμβολής.

Ο κώδικας για την εύρεση των κοντινότερων γειτόνων κόκκινου και μπλε χρώματος είναι όμοιος καθώς όπως αναφέρθηκε και προηγουμένως οι μετρήσεις των δύο χρωμάτων έχουν παρόμοια διάταξη στο χώρο στο πρότυπο Bayer. Ο αλγόριθμος επιχειρεί τον υπολογισμό των συντεταγμένων ενός μόνο από τους γείτονες, αυτού που βρίσκεται στην πάνω, αριστερή κορυφή του τετραγώνου που ορίζουν τέσσερα γειτονικά σημεία του πλέγματος Bayer. Με βάση αυτές, οι συντεταγμένες των υπόλοιπων σημείων βρίσκονται εύκολα.

Αρχικά οι συντεταγμένες των σημείων του πλέγματος RGB στρογγυλοποιούνται προς τα κάτω στον κοντινότερα ακέραιο. Για την τεταγμένη στο κόκκινο κανάλι ελέγχεται αν η συντεταγμένη είναι ζυγός αριθμός. Αν δεν είναι αφαιρείται μία μονάδα. Όμοια για την τεταγμένη στο μπλε κανάλι γίνεται έλεγχος αν η συντεταγμένη είναι μονός αριθμός και αν δεν είναι τότε αφαιρείται μία μονάδα.

Αντίστοιχα για τις τετμημένες των σημείων, αυτές του κόκκινου καναλιού θα πρέπει να είναι μονός αριθμός ενώ του μπλε θα πρέπει να είναι ζυγός, αν αυτό δεν ισχύει αφαιρείται μία μονάδα από την εκάστοτε συντεταγμένη.

Σχήματα εδώ!! ======================================================================================

Για άλλη μία φορά, όλα τα παραπάνω απορρέουν από τη χωρική δομή των μετρήσεων των καναλιών στο πλέγμα Bayer και αποδεικνύονται με απλή παρατήρηση των ιδιοτήτων του.

Γνωρίζοντας τις συντεταγμένες της μίας κορυφής, ο υπολογισμός των συντεταγμένων των υπόλοιπων κορυφών είναι απλός. Γνωρίζοντας τις συντεταμένες όλων των γειτόνων η παρεμβολή υλοποιείται σε δύο βήματα, πρώτα γίνονται δύο γραμμικές παρεμβολές στη μία διάσταση (οριζόντια) και έπειτα τα αποτελέσματα των παρεμβολών συνδυάζονται για τον τελικό υπολογισμό της φωτεινότητας.

Για το πράσινο κανάλι ο αλγόριθμος επιχειρεί την εύρεση των συντεταγμένων του κέντρου βάρους του ρόμβου που ορίζουν τέσσερα γειτονικά σημεία. Αρχικά οι συντεταγμένες του RGB πλέγματος στρογγυλοποιούνται στον κοντινότερο ακέραιο. Αν το σημείο που προκύπτει \textbf{δεν} περιέχει πληροφορία για το πράσινο χρώμα τότε έχει βρεθεί το κέντρο του ρόμβου. Αν το σημείο που προκύπτει περιέχει πληροφορία για το πράσινο χρώμα, σημαίνει ότι πρόκειται για μία από τις κορυφές του ρόμβου. Για να βρεθεί το κέντρο υπολογίζονται οι εξισώσεις των ευθειών που περνούν από το σημείο που βρέθηκε με συντελεστές κλίσης 1 και -1. Έπειτα, όμοια με πριν, διαχωρίζονται τέσσερις περιπτώσεις όπου με βάση τη σχετική θέση του αρχικού σημείου του RGB πλέγματος και των δύο ευθειών υποδεικνύεται η σωστή θέση του κέντρου του ρόμβου.

Αφού βρεθεί το κέντρο του ρόμβου, ο υπολογισμός των συντεταγμένων των τεσσάρων κορυφών είναι απλός. Τέλος υλοποιείται μία ειδική περίπτωση της διγραμμικής παρεμβολής στη συνάρτηση \texttt{tiltedInterp}, καθώς στο πράσινο κανάλι το σύστημα είναι περιστραμμένο και απαιτεί διαφορετική αντιμετώπιση κατά τη παρεμβολή.

Τέλος σημειώνεται ότι κατά τη παραπάνω διαδικασία μερικά σημεία θα βρεθούν έξω από τα όρια της εικόνας. Αυτό αφορά τα σημεία κοντά (1-2 pixels in) στα όρια της εικόνας. Για να αντιμετωπιστεί εύκολα αυτό, δημιουργήθηκε μία επεκτεταμένη έκδοση του Bayer πλέγματος στο οποίο οι δύο πρώτες και δύο τελευταίες γραμμές και στήλες έχουν αντιγραφεί με κατάλληλο τρόπο. Επίσης ιδιαίτερη προσοχή χρειάστηκε στους δείκτες του πίνακα του επεκταμένου πλέγματος, ώστε να 


ασδφασφασδφα


 το σωστό στοιχείο του πίνακα κάθε φορά.
