Browse Source

Various fixes, Complete report, Finalization

master
Apostolos Fanakis 6 years ago
parent
commit
270dc3c764
  1. 1
      .gitignore
  2. 6
      Assignment_1/README.md
  3. 182
      Assignment_1/bayer2rgb.m
  4. 9
      Assignment_1/imagedequant.m
  5. 8
      Assignment_1/imagequant.m
  6. 2
      Assignment_1/report/1.0.introduction.tex
  7. 66
      Assignment_1/report/2.0.bayer_to_rgb.tex
  8. 3
      Assignment_1/report/3.0.quantization.tex
  9. 3
      Assignment_1/report/4.0.ppm.tex
  10. 52
      Assignment_1/report/5.0.results.tex
  11. 16
      Assignment_1/report/report.tex
  12. 66
      Assignment_1/report/res/BayerGreenCenterIsGreen.pdf_tex
  13. 2
      Assignment_1/report/res/BayerGreenCenterIsGreen.svg
  14. 60
      Assignment_1/report/res/BayerGreenCenterLines.pdf_tex
  15. 2
      Assignment_1/report/res/BayerGreenCenterLines.svg
  16. 70
      Assignment_1/report/res/BayerGreenSpacing.pdf_tex
  17. 2
      Assignment_1/report/res/BayerGreenSpacing.svg
  18. 71
      Assignment_1/report/res/BayerRedBlueSpacing.pdf_tex
  19. 2
      Assignment_1/report/res/BayerRedBlueSpacing.svg
  20. 65
      Assignment_1/report/res/BayerToRGBGrids.pdf_tex
  21. 2
      Assignment_1/report/res/BayerToRGBGrids.svg
  22. BIN
      Assignment_1/report/res/linear_3bit_960X1280.png
  23. BIN
      Assignment_1/report/res/linear_8bit_960X1280.png
  24. BIN
      Assignment_1/report/res/nearest_3bit_960X1280.png
  25. BIN
      Assignment_1/report/res/nearest_8bit_960X1280.png
  26. 17
      Assignment_1/saveasppm.m
  27. 242
      Assignment_1/try.ppm

1
.gitignore

@ -10,3 +10,4 @@
*.synctex.gz *.synctex.gz
*.synctex.gz(busy) *.synctex.gz(busy)
*.fls *.fls
*.fdb_latexmk

6
Assignment_1/README.md

@ -0,0 +1,6 @@
# First deliverable
In this first deliverable we were called to implement a number of functions that:
- produce an RBG image from a Bayer pattern array of samples
- quantize and dequantize the image using any desired number of bits
- transform the image to the PPM format and save it to disk

182
Assignment_1/bayer2rgb.m

@ -3,10 +3,7 @@ function xc = bayer2rgb(xb, M, N, method)
% Detailed explanation goes here % Detailed explanation goes here
% Initializes the struct that's going to store the RGB image % Initializes the struct that's going to store the RGB image
xc = struct; xc = zeros(M, N, 3);
xc.red = zeros(M, N);
xc.green = zeros(M, N);
xc.blue = zeros(M, N);
% Initializes helper variables % Initializes helper variables
bayerPatternDimY = size(xb, 1); bayerPatternDimY = size(xb, 1);
@ -60,8 +57,8 @@ function xc = bayer2rgb(xb, M, N, method)
% Closest neighbors for red and blue can be determined by observing % Closest neighbors for red and blue can be determined by observing
% the Bayer pattern % the Bayer pattern
xc.red = xb(nearestOddRow, nearestEvenCol); xc(:, :, 1) = xb(nearestEvenRow, nearestOddCol);
xc.blue = xb(nearestEvenRow, nearestOddCol); xc(:, :, 3) = xb(nearestOddRow, nearestEvenCol);
for currentRow = 1:M for currentRow = 1:M
for currentCol = 1:N for currentCol = 1:N
@ -107,14 +104,14 @@ function xc = bayer2rgb(xb, M, N, method)
if (fixedNearestRow < 1) if (fixedNearestRow < 1)
% Fix for the marginal first row case % Fix for the marginal first row case
xc.green(currentRow, currentCol) = ... xc(currentRow, currentCol, 2) = ...
xb(1, fixedNearestCol - 1); xb(1, fixedNearestCol - 1);
else else
xc.green(currentRow, currentCol) = ... xc(currentRow, currentCol, 2) = ...
xb(fixedNearestRow, fixedNearestCol); xb(fixedNearestRow, fixedNearestCol);
end end
else else
xc.green(currentRow, currentCol) = ... xc(currentRow, currentCol, 2) = ...
xb(totalNearestRow(currentRow), ... xb(totalNearestRow(currentRow), ...
totalNearestCol(currentCol)); totalNearestCol(currentCol));
end end
@ -128,29 +125,29 @@ function xc = bayer2rgb(xb, M, N, method)
% Calculates the ordinate of the upper couple of nearest points % Calculates the ordinate of the upper couple of nearest points
% that will be used in the interpolation for the blue colour % that will be used in the interpolation for the blue colour
upperBlueY = flooredCoordinatesY; upperBlueY = flooredCoordinatesY;
upperBlueY(mod(upperBlueY, 2) ~= 0) = ... upperBlueY(mod(upperBlueY, 2) == 0) = ...
upperBlueY(mod(upperBlueY, 2) ~= 0) - 1; upperBlueY(mod(upperBlueY, 2) == 0) - 1;
upperBlueY = upperBlueY + 2; upperBlueY = upperBlueY + 2;
% Calculates the ordinate of the upper couple of nearest points % Calculates the ordinate of the upper couple of nearest points
% that will be used in the interpolation for the red colour % that will be used in the interpolation for the red colour
upperRedY = flooredCoordinatesY; upperRedY = flooredCoordinatesY;
upperRedY(mod(upperRedY, 2) == 0) = ... upperRedY(mod(upperRedY, 2) ~= 0) = ...
upperRedY(mod(upperRedY, 2) == 0) - 1; upperRedY(mod(upperRedY, 2) ~= 0) - 1;
upperRedY = upperRedY + 2; upperRedY = upperRedY + 2;
% Calculates the abscissa of the left couple of nearest points that % Calculates the abscissa of the left couple of nearest points that
% will be used in the interpolation for the blue colour % will be used in the interpolation for the blue colour
leftBlueX = flooredCoordinatesX; leftBlueX = flooredCoordinatesX;
leftBlueX(mod(leftBlueX, 2) == 0) = ... leftBlueX(mod(leftBlueX, 2) ~= 0) = ...
leftBlueX(mod(leftBlueX, 2) == 0) - 1; leftBlueX(mod(leftBlueX, 2) ~= 0) - 1;
leftBlueX = leftBlueX + 2; leftBlueX = leftBlueX + 2;
% Calculates the abscissa of the left couple of nearest points that % Calculates the abscissa of the left couple of nearest points that
% will be used in the interpolation for the red colour % will be used in the interpolation for the red colour
leftRedX = flooredCoordinatesX; leftRedX = flooredCoordinatesX;
leftRedX(mod(leftRedX, 2) ~= 0) = ... leftRedX(mod(leftRedX, 2) == 0) = ...
leftRedX(mod(leftRedX, 2) ~= 0) - 1; leftRedX(mod(leftRedX, 2) == 0) - 1;
leftRedX = leftRedX + 2; leftRedX = leftRedX + 2;
% Determines the indeces of the rows (even or odd) of the original % Determines the indeces of the rows (even or odd) of the original
@ -168,45 +165,45 @@ function xc = bayer2rgb(xb, M, N, method)
xbPadded = [xbPadded(1, :); xbPadded(2, :); xbPadded; ... xbPadded = [xbPadded(1, :); xbPadded(2, :); xbPadded; ...
xbPadded(end - 2, :); xbPadded(end - 1, :)]; xbPadded(end - 2, :); xbPadded(end - 1, :)];
for currentRow = 1:M lowerInterpPointBlue = ...
lowerInterpPointBlue = ... ((leftBlueX + 2 - gridPointsCoordinatesX) / 2)' .* ...
((leftBlueX + 2 - gridPointsCoordinatesX) / 2)' .* ... xbPadded(upperBlueY + 2, leftBlueX) + ...
xbPadded(upperBlueY(currentRow) + 2, leftBlueX) + ... ((gridPointsCoordinatesX - leftBlueX) / 2)' .* ...
((gridPointsCoordinatesX - leftBlueX) / 2)' .* ... xbPadded(upperBlueY + 2, leftBlueX + 2);
xbPadded(upperBlueY(currentRow) + 2, leftBlueX + 2);
upperInterpPointBlue = ...
((leftBlueX + 2 - gridPointsCoordinatesX) / 2)' .* ...
xbPadded(upperBlueY, leftBlueX) + ...
((gridPointsCoordinatesX - leftBlueX) / 2)' .* ...
xbPadded(upperBlueY, leftBlueX + 2);
upperInterpPointBlue = ... xc(:, :, 3) = ...
((leftBlueX + 2 - gridPointsCoordinatesX) / 2)' .* ... ((upperBlueY - ...
xbPadded(upperBlueY(currentRow), leftBlueX) + ... gridPointsCoordinatesY) / 2) .* ...
((gridPointsCoordinatesX - leftBlueX) / 2)' .* ... lowerInterpPointBlue + ...
xbPadded(upperBlueY(currentRow), leftBlueX + 2); ((gridPointsCoordinatesY - ...
upperBlueY + 2) / 2) .* ...
xc.blue(currentRow, :) = ... upperInterpPointBlue;
((upperBlueY(currentRow) - ...
gridPointsCoordinatesY(currentRow)) / 2) * ... lowerInterpPointRed = ...
lowerInterpPointBlue + ... ((leftRedX + 2 - gridPointsCoordinatesX) / 2)' .* ...
((gridPointsCoordinatesY(currentRow) - ... xbPadded(upperRedY + 2, leftRedX) + ...
upperBlueY(currentRow) + 2) / 2) * ... ((gridPointsCoordinatesX - leftRedX) / 2)' .* ...
upperInterpPointBlue; xbPadded(upperRedY + 2, leftRedX + 2);
lowerInterpPointRed = ...
((leftRedX + 2 - gridPointsCoordinatesX) / 2)' .* ...
xbPadded(upperRedY(currentRow) + 2, leftRedX) + ...
((gridPointsCoordinatesX - leftRedX) / 2)' .* ...
xbPadded(upperRedY(currentRow) + 2, leftRedX + 2);
upperInterpPointRed = ... upperInterpPointRed = ...
((leftRedX + 2 - gridPointsCoordinatesX) / 2)' .* ... ((leftRedX + 2 - gridPointsCoordinatesX) / 2)' .* ...
xbPadded(upperRedY(currentRow), leftRedX) + ... xbPadded(upperRedY, leftRedX) + ...
((gridPointsCoordinatesX - leftRedX) / 2)' .* ... ((gridPointsCoordinatesX - leftRedX) / 2)' .* ...
xbPadded(upperRedY(currentRow), leftRedX + 2); xbPadded(upperRedY, leftRedX + 2);
xc.red(currentRow, :) = ... xc(:, :, 1) = ...
((upperRedY(currentRow) - gridPointsCoordinatesY(currentRow)) / 2) * ... ((upperRedY - gridPointsCoordinatesY) / 2) .* ...
lowerInterpPointRed + ... lowerInterpPointRed + ...
((gridPointsCoordinatesY(currentRow) - upperRedY(currentRow) + 2) / 2) * ... ((gridPointsCoordinatesY - upperRedY + 2) / 2) .* ...
upperInterpPointRed; upperInterpPointRed;
for currentRow = 1:M
for currentCol = 1:N for currentCol = 1:N
if ((mod(centerPointRow(currentRow), 2) == 0 && ... if ((mod(centerPointRow(currentRow), 2) == 0 && ...
mod(centerPointCol(currentCol), 2) == 0) || ... mod(centerPointCol(currentCol), 2) == 0) || ...
@ -248,18 +245,12 @@ function xc = bayer2rgb(xb, M, N, method)
fixedCenterPointCol = centerPointCol(currentCol) + 1; fixedCenterPointCol = centerPointCol(currentCol) + 1;
end end
% if (fixedCenterPointRow < 1) xc(currentRow, currentCol, 2) = ...
% % Fix for the marginal first row case
% fixedCenterPointRow = 1;
% fixedCenterPointCol = fixedCenterPointCol - 1;
% end
xc.green(currentRow, currentCol) = ...
tiltedInterp(gridPointsCoordinatesX(currentCol), ... tiltedInterp(gridPointsCoordinatesX(currentCol), ...
gridPointsCoordinatesY(currentRow), ... gridPointsCoordinatesY(currentRow), ...
fixedCenterPointCol, fixedCenterPointRow, xbPadded); fixedCenterPointCol, fixedCenterPointRow, xbPadded);
else else
xc.green(currentRow, currentCol) = ... xc(currentRow, currentCol, 2) = ...
tiltedInterp(gridPointsCoordinatesX(currentCol), ... tiltedInterp(gridPointsCoordinatesX(currentCol), ...
gridPointsCoordinatesY(currentRow), ... gridPointsCoordinatesY(currentRow), ...
centerPointCol(currentCol), ... centerPointCol(currentCol), ...
@ -268,38 +259,10 @@ function xc = bayer2rgb(xb, M, N, method)
end end
end end
end end
% Combines colours to a single image array and shows the result
rgbImage = cat(3, xc.blue, xc.green, xc.red);
figure();
imshow(rgbImage);
end end
function value = tiltedInterp(xw, yw, xc, yc, xbPadded) function value = tiltedInterp(xw, yw, xc, yc, xbPadded)
% Rotates the nearest points by 45 degrees
x1 = (xc - 1) * cosd(45) - yc * sind(45);
y1 = (xc - 1) * sind(45) + yc * cosd(45);
x2 = (xc + 1) * cosd(45) - yc * sind(45);
y2 = xc * sind(45) + (yc + 1) * cosd(45);
lowerLeftInterpPoint = ...
((x2 - xw) / (x2 - x1)) * ...
xbPadded(yc + 2, xc - 1 + 2) + ...
((xw - x1) / (x2 - x1)) * ...
xbPadded(yc + 1 + 2, xc + 2);
upperRightInterpPoint = ...
((x2 - xw) / (x2 - x1)) * ...
xbPadded(yc - 1 + 2, xc + 2) + ...
((xw - x1) / (x2 - x1)) * ...
xbPadded(yc + 2, xc + 1 + 2);
value2 = ...
(y2 - yw) / (y2 - y1) * lowerLeftInterpPoint + ...
(yw - y1) / (y2 - y1) * upperRightInterpPoint;
% Calculates the vertical displacement of the main diagonal that % Calculates the vertical displacement of the main diagonal that
% crosses this point % crosses this point
bw = yw - xw; bw = yw - xw;
@ -332,11 +295,38 @@ function value = tiltedInterp(xw, yw, xc, yc, xbPadded)
(sqrt(2) - dist) / sqrt(2) * lowerLeftInterpPoint + ... (sqrt(2) - dist) / sqrt(2) * lowerLeftInterpPoint + ...
dist / sqrt(2) * upperRightInterpPoint; dist / sqrt(2) * upperRightInterpPoint;
value = (xbPadded(yc + 2, xc - 1 + 2) + ...
xbPadded(yc + 2, xc + 1 + 2) + ... % Tried to rotate the neighbors and then interpolate. It didn't
xbPadded(yc - 1 + 2, xc + 2) + ... % work well but I left it in here anyway.
xbPadded(yc + 1 + 2, xc + 2)) / 4;
% if (value ~= value2) % Rotates the nearest points by 45 degrees
% disp(1); % x1 = (xc - 1) * cosd(45) - yc * sind(45);
% end % y1 = (xc - 1) * sind(45) + yc * cosd(45);
%
% x2 = (xc + 1) * cosd(45) - yc * sind(45);
% y2 = xc * sind(45) + (yc + 1) * cosd(45);
%
% lowerLeftInterpPoint = ...
% ((x2 - xw) / (x2 - x1)) * ...
% xbPadded(yc + 2, xc - 1 + 2) + ...
% ((xw - x1) / (x2 - x1)) * ...
% xbPadded(yc + 1 + 2, xc + 2);
%
% upperRightInterpPoint = ...
% ((x2 - xw) / (x2 - x1)) * ...
% xbPadded(yc - 1 + 2, xc + 2) + ...
% ((xw - x1) / (x2 - x1)) * ...
% xbPadded(yc + 2, xc + 1 + 2);
%
% value = ...
% (y2 - yw) / (y2 - y1) * lowerLeftInterpPoint + ...
% (yw - y1) / (y2 - y1) * upperRightInterpPoint;
% Also tried averaging between the four neighbors which actually
% produces a better image... So I just left this in too.
% value = (xbPadded(yc + 2, xc - 1 + 2) + ...
% xbPadded(yc + 2, xc + 1 + 2) + ...
% xbPadded(yc - 1 + 2, xc + 2) + ...
% xbPadded(yc + 1 + 2, xc + 2)) / 4;
end end

9
Assignment_1/imagedequant.m

@ -10,9 +10,8 @@ function x = imagedequant(q, w1, w2, w3)
% Output % Output
% - x is the image with the dequantized values % - x is the image with the dequantized values
x = struct; x(size(q, 1), size(q, 2), 3) = 0;
x.red = mydequant(q.red, w1); x(:, :, 1) = mydequant(q(:, :, 1), w1);
x.green = mydequant(q.green, w2); x(:, :, 2) = mydequant(q(:, :, 2), w2);
x.blue = mydequant(q.blue, w3); x(:, :, 3) = mydequant(q(:, :, 3), w3);
end end

8
Assignment_1/imagequant.m

@ -10,8 +10,8 @@ function q = imagequant(x, w1, w2, w3)
% Output % Output
% - q is the image with the quantized values % - q is the image with the quantized values
q = struct; q(size(x, 1), size(x, 2), 3) = 0;
q.red = myquant(x.red, w1); q(:, :, 1) = myquant(x(:, :, 1), w1);
q.green = myquant(x.green, w2); q(:, :, 2) = myquant(x(:, :, 2), w2);
q.blue = myquant(x.blue, w3); q(:, :, 3) = myquant(x(:, :, 3), w3);
end end

2
Assignment_1/report/1.0.introduction.tex

@ -1,6 +1,6 @@
\section{Εισαγωγή} \section{Εισαγωγή}
Η παρούσα εργασία εκπονήθηκε στα πλαίσια του μαθήματος ``Ψηφιακή Επεξεργασία Εικόνας'' του όγδοου (8\textsuperscript{ου}) εξαμήνου του τμήματος Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Αριστοτέλειου Πανεπιστημίου Θεσσαλονίκης. Ζητούμενο του πρώτου παραδοτέου της εργασίας είναι η υλοποίηση, με χρήση του λογισμικού Matlab, έξι συνολικά συναρτήσεων που Η παρούσα εργασία εκπονήθηκε στα πλαίσια του μαθήματος ``Ψηφιακή Επεξεργασία Εικόνας'' του όγδοου (8\textsuperscript{ου}) εξαμήνου του τμήματος Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Αριστοτέλειου Πανεπιστημίου Θεσσαλονίκης. Ζητούμενο του πρώτου παραδοτέου της εργασίας είναι η υλοποίηση, με χρήση του λογισμικού Matlab, έξι συνολικά συναρτήσεων που:
\begin{itemize} \begin{itemize}
\item ανακατασκευάζουν μία τριχρωματική εικόνα RGB από εικόνα σε μορφή του προτύπου Bayer \item ανακατασκευάζουν μία τριχρωματική εικόνα RGB από εικόνα σε μορφή του προτύπου Bayer

66
Assignment_1/report/2.0.bayer_to_rgb.tex

@ -1,8 +1,18 @@
\section{Bayer σε RGB} \section{Bayer σε RGB}
Στο πρώτο κομμάτι της εργασίας ζητήθηκε η ανακατασκευή μίας RGB εικόνας από ένα πίνακα Bayer, όπως αυτός θα προέκυπτε από έναν αισθητήρα CCD ή CMOS μίας κάμερας. Ο αλγόριθμος αυτός υλοποιείται στη συνάρτηση \texttt{bayer2rgb}. Απαίτηση της εργασίας ήταν επίσης η ταυτόχρονη αλλαγή μεγέθους (resizing) της εικόνας και ο υπολογισμός των τιμών φωτεινότητας των καναλιών στις νέες θέσεις. Στο πρώτο κομμάτι της εργασίας ζητήθηκε η ανακατασκευή μίας RGB εικόνας από ένα πίνακα Bayer, όπως αυτός θα προέκυπτε από έναν αισθητήρα CCD ή CMOS μίας κάμερας. Ο αλγόριθμος αυτός υλοποιείται στη συνάρτηση \texttt{bayer2rgb}. Απαίτηση της εργασίας ήταν επίσης η ταυτόχρονη αλλαγή μεγέθους (resizing) της εικόνας και ο υπολογισμός των τιμών φωτεινότητας των καναλιών στις νέες θέσεις πλέγματος (interpolation).
Αρχικά υπολογίζονται οι τετμημένες και τεταγμένες των νέων θέσεων του πλέγματος (grid) της εικόνας. Γνωρίζουμε ότι τα σημεία που βρίσκονται στις τέσσερις γωνίες τις εικόνας αντιστοιχούν στα τέσσερα γωνιακά σημεία του αρχικού πλέγματος Bayer. Υπολογίζουμε την οριζόντια και κατακόρυφη απόσταση μεταξύ δύο διαδοχικών σημείων χρησιμοποιώντας τις εξισώσεις: Αρχικά υπολογίζονται οι τετμημένες και τεταγμένες των νέων θέσεων του πλέγματος (grid) της εικόνας. Γνωρίζουμε ότι τα σημεία που βρίσκονται στις τέσσερις γωνίες τις εικόνας αντιστοιχούν στα τέσσερα γωνιακά σημεία του αρχικού πλέγματος Bayer.
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\input{res/BayerToRGBGrids.pdf_tex}
}
\caption{Υπέρθεση των Bayer και RGB grids}
\end{figure}
Υπολογίζουμε την οριζόντια και κατακόρυφη απόσταση μεταξύ δύο διαδοχικών σημείων χρησιμοποιώντας τις εξισώσεις:
\begin{equation} \begin{equation}
h = \frac{M_0 - 1}{M - 1} h = \frac{M_0 - 1}{M - 1}
@ -14,8 +24,8 @@ l = \frac{N_0 - 1}{N - 1}
Οι τετμημένες και τεταγμένες μπορούν να υπολογιστούν εύκολα στη Matlab: Οι τετμημένες και τεταγμένες μπορούν να υπολογιστούν εύκολα στη Matlab:
\begin{lstlisting}[language=Octave] \begin{lstlisting}[language=Octave]
gridX = 1:l:M0 gridX = 1:l:N0
gridY = 1:h:N0 gridY = 1:h:M0
\end{lstlisting} \end{lstlisting}
Έπειτα πρέπει να υπολογιστούν οι τιμές φωτεινότητας κάθε καναλιού στις θέσεις του πλέγματος. Για τον υπολογισμό αυτό υλοποιήθηκαν δύο μέθοδοι, αυτή του κοντινότερου γείτονα (``Nearest neighbor'') και αυτή της διγραμμικής παρεμβολής (``Bilinear interpolation''). Έπειτα πρέπει να υπολογιστούν οι τιμές φωτεινότητας κάθε καναλιού στις θέσεις του πλέγματος. Για τον υπολογισμό αυτό υλοποιήθηκαν δύο μέθοδοι, αυτή του κοντινότερου γείτονα (``Nearest neighbor'') και αυτή της διγραμμικής παρεμβολής (``Bilinear interpolation'').
@ -26,7 +36,13 @@ gridY = 1:h:N0
Παρατηρώντας το μοτίβο Bayer βλέπουμε ότι κάθε τετράδα μετρήσεων αυτών των χρωμάτων ορίζει ένα τετράγωνο χώρο μέσα στον οποίο ο κοντινότερος γείτονας είναι πάντα μία από τις κορυφές του τετραγώνου. Ορίζεται ένα ορθοκανονικό σύστημα συντεταγμένων με κέντρο το κέντρο βάρους του τετραγώνου, έτσι σε κάθε τεταρτημόριο του συστήματος αυτού υπάρχει ακριβώς μία από τις κορυφές του τετραγώνου. Με αυτό το τρόπο, για να βρεθεί ο κοντινότερος γείτονας κόκκινης ή μπλε μέτρησης ενός σημείου, αρκεί να βρεθεί σε ποιο τεταρτημόριο ανήκει το σημείο. Παρατηρώντας το μοτίβο Bayer βλέπουμε ότι κάθε τετράδα μετρήσεων αυτών των χρωμάτων ορίζει ένα τετράγωνο χώρο μέσα στον οποίο ο κοντινότερος γείτονας είναι πάντα μία από τις κορυφές του τετραγώνου. Ορίζεται ένα ορθοκανονικό σύστημα συντεταγμένων με κέντρο το κέντρο βάρους του τετραγώνου, έτσι σε κάθε τεταρτημόριο του συστήματος αυτού υπάρχει ακριβώς μία από τις κορυφές του τετραγώνου. Με αυτό το τρόπο, για να βρεθεί ο κοντινότερος γείτονας κόκκινης ή μπλε μέτρησης ενός σημείου, αρκεί να βρεθεί σε ποιο τεταρτημόριο ανήκει το σημείο.
Σχήματα εδώ!! ====================================================================================== \begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\input{res/BayerRedBlueSpacing.pdf_tex}
}
\caption{Τετράδες γειτονικών κόκκινων και μπλε δειγμάτων στο Bayer pattern}
\end{figure}
Παρατηρούμε ότι στο Bayer pattern: Παρατηρούμε ότι στο Bayer pattern:
\begin{itemize} \begin{itemize}
@ -36,19 +52,25 @@ gridY = 1:h:N0
\item η \textbf{τεταγμένη} των \textbf{μπλε} σημείων είναι πάντα \textbf{περιττός} ακέραιος αριθμός \item η \textbf{τεταγμένη} των \textbf{μπλε} σημείων είναι πάντα \textbf{περιττός} ακέραιος αριθμός
\end{itemize} \end{itemize}
Βασιζόμενοι σε αυτή τη παρατήρηση υπολογίζουμε αρχικά, για κάθε σημείο πλέγματος RGB εικόνας, τον κοντινότερο περιττό και ζυγό ακέραιο της τεμτημένης και τεταγμένης του σημείου. Έπειτα η τιμή του κοντινότερου γείτονα στο πλέγμα Bayer είναι για κάθε χρώμα: Βασιζόμενοι σε αυτή τη παρατήρηση υπολογίζουμε αρχικά, για κάθε σημείο πλέγματος RGB εικόνας, τον κοντινότερο περιττό και ζυγό ακέραιο της τετμημένης και τεταγμένης του σημείου. Έπειτα η τιμή του κοντινότερου γείτονα στο πλέγμα Bayer είναι για κάθε χρώμα:
\begin{lstlisting}[language=Octave] \begin{lstlisting}[language=Octave]
red = bayerArray(nearestEvenRow, nearestOddCol); red = bayerArray(nearestEvenRow, nearestOddCol);
blue = bayerArray(nearestOddRow, nearestEvenCol); blue = bayerArray(nearestOddRow, nearestEvenCol);
\end{lstlisting} \end{lstlisting}
Σχήματα εδώ!! ======================================================================================
Το πράσινο χρώμα στο μοτίβο Bayer έχει διαφορετική χωροταξία, για αυτό και απαιτείται διαφορετική αντιμετώπιση στον υπολογισμό των συντεταγμένων του κοντινότερου γείτονα. Ωστόσο ο υπολογισμός βασίζεται και πάλι σε παρατήρηση των χωρικών ιδιοτήτων του πλέγματος. Το πράσινο χρώμα στο μοτίβο Bayer έχει διαφορετική χωροταξία, για αυτό και απαιτείται διαφορετική αντιμετώπιση στον υπολογισμό των συντεταγμένων του κοντινότερου γείτονα. Ωστόσο ο υπολογισμός βασίζεται και πάλι σε παρατήρηση των χωρικών ιδιοτήτων του πλέγματος.
Παρατηρούμε ότι τέσσερα πράσινα σημεία ορίζουν ένα ρόμβο. Ορίζουμε ένα ορθογώνιο σύστημα συντεταγμένων, περιστραμμένο κατά 45\textdegree{} αντιορολογιακά. Όμοια με πριν, σε κάθε τεταρτημόριο του συστήματος συντεταγμένων υπάρχει μόνο μία κορυφή του ρόμβου. Παρατηρούμε ότι τέσσερα πράσινα σημεία ορίζουν ένα ρόμβο. Ορίζουμε ένα ορθογώνιο σύστημα συντεταγμένων, περιστραμμένο κατά 45\textdegree{} αντιορολογιακά. Όμοια με πριν, σε κάθε τεταρτημόριο του συστήματος συντεταγμένων υπάρχει μόνο μία κορυφή του ρόμβου.
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\input{res/BayerGreenSpacing.pdf_tex}
}
\caption{Τετράδες γειτονικών πράσινων δειγμάτων στο Bayer pattern}
\end{figure}
Οι συντεταγμένες του πλέγματος των RGB σημείων στρογγυλοποιούνται στον κοντινότερο ακέραιο. Αν το σημείο που προκύπτει είναι ένα από τα σημεία του Bayer που περιέχουν τη πληροφορία του πράσινου, τότε αυτός είναι ο κοντινότερος γείτονας. Αν αυτή δεν είναι η περίπτωση σημαίνει ότι οι συντενταγμένες που υπολογίστηκαν είναι αυτές του κέντρου βάρους του ρόμβου. Για να βρούμε τις σωστές συντεταγμένες υπολογίζουμε τις ευθείες που περνούν από το κέντρο με κλίση 1 και -1: Οι συντεταγμένες του πλέγματος των RGB σημείων στρογγυλοποιούνται στον κοντινότερο ακέραιο. Αν το σημείο που προκύπτει είναι ένα από τα σημεία του Bayer που περιέχουν τη πληροφορία του πράσινου, τότε αυτός είναι ο κοντινότερος γείτονας. Αν αυτή δεν είναι η περίπτωση σημαίνει ότι οι συντενταγμένες που υπολογίστηκαν είναι αυτές του κέντρου βάρους του ρόμβου. Για να βρούμε τις σωστές συντεταγμένες υπολογίζουμε τις ευθείες που περνούν από το κέντρο με κλίση 1 και -1:
\begin{equation} \begin{equation}
@ -61,8 +83,6 @@ y = -x + b_2
\label{eq:green_rhombus_2} \label{eq:green_rhombus_2}
\end{equation} \end{equation}
Σχήματα εδώ!! ======================================================================================
Διακρίνονται τέσσερις περιπτώσεις: Διακρίνονται τέσσερις περιπτώσεις:
\begin{itemize} \begin{itemize}
@ -72,6 +92,14 @@ y = -x + b_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} \end{itemize}
\begin{figure}[H]
\centering
\resizebox{.4\textwidth}{!}{
\input{res/BayerGreenCenterLines.pdf_tex}
}
\caption{Τετράδα γειτονικών πράσινων δειγμάτων στο Bayer pattern και ευθείες}
\end{figure}
\subsection{Bilinear interpolation} \subsection{Bilinear interpolation}
Στη μέθοδο της διγραμμικής παρεμβολής απαιτείται η εύρεση των συντεταγμένων των τεσσάρων κοντινότερων σημείων και ύστερα η υλοποίηση της παρεμβολής. Στη μέθοδο της διγραμμικής παρεμβολής απαιτείται η εύρεση των συντεταγμένων των τεσσάρων κοντινότερων σημείων και ύστερα η υλοποίηση της παρεμβολής.
@ -82,20 +110,20 @@ y = -x + b_2
Αντίστοιχα για τις τετμημένες των σημείων, αυτές του κόκκινου καναλιού θα πρέπει να είναι μονός αριθμός ενώ του μπλε θα πρέπει να είναι ζυγός, αν αυτό δεν ισχύει αφαιρείται μία μονάδα από την εκάστοτε συντεταγμένη. Αντίστοιχα για τις τετμημένες των σημείων, αυτές του κόκκινου καναλιού θα πρέπει να είναι μονός αριθμός ενώ του μπλε θα πρέπει να είναι ζυγός, αν αυτό δεν ισχύει αφαιρείται μία μονάδα από την εκάστοτε συντεταγμένη.
Σχήματα εδώ!! ======================================================================================
Για άλλη μία φορά, όλα τα παραπάνω απορρέουν από τη χωρική δομή των μετρήσεων των καναλιών στο πλέγμα Bayer και αποδεικνύονται με απλή παρατήρηση των ιδιοτήτων του. Για άλλη μία φορά, όλα τα παραπάνω απορρέουν από τη χωρική δομή των μετρήσεων των καναλιών στο πλέγμα Bayer και αποδεικνύονται με απλή παρατήρηση των ιδιοτήτων του.
Γνωρίζοντας τις συντεταγμένες της μίας κορυφής, ο υπολογισμός των συντεταγμένων των υπόλοιπων κορυφών είναι απλός. Γνωρίζοντας τις συντεταμένες όλων των γειτόνων η παρεμβολή υλοποιείται σε δύο βήματα, πρώτα γίνονται δύο γραμμικές παρεμβολές στη μία διάσταση (οριζόντια) και έπειτα τα αποτελέσματα των παρεμβολών συνδυάζονται για τον τελικό υπολογισμό της φωτεινότητας. Γνωρίζοντας τις συντεταγμένες της μίας κορυφής, ο υπολογισμός των συντεταγμένων των υπόλοιπων κορυφών είναι απλός. Γνωρίζοντας τις συντεταμένες όλων των γειτόνων η παρεμβολή υλοποιείται σε δύο βήματα, πρώτα γίνονται δύο γραμμικές παρεμβολές στη μία διάσταση (οριζόντια) και έπειτα τα αποτελέσματα των παρεμβολών συνδυάζονται για τον τελικό υπολογισμό της φωτεινότητας.
Για το πράσινο κανάλι ο αλγόριθμος επιχειρεί την εύρεση των συντεταγμένων του κέντρου βάρους του ρόμβου που ορίζουν τέσσερα γειτονικά σημεία. Αρχικά οι συντεταγμένες του RGB πλέγματος στρογγυλοποιούνται στον κοντινότερο ακέραιο. Αν το σημείο που προκύπτει \textbf{δεν} περιέχει πληροφορία για το πράσινο χρώμα τότε έχει βρεθεί το κέντρο του ρόμβου. Αν το σημείο που προκύπτει περιέχει πληροφορία για το πράσινο χρώμα, σημαίνει ότι πρόκειται για μία από τις κορυφές του ρόμβου. Για να βρεθεί το κέντρο υπολογίζονται οι εξισώσεις των ευθειών που περνούν από το σημείο που βρέθηκε με συντελεστές κλίσης 1 και -1. Έπειτα, όμοια με πριν, διαχωρίζονται τέσσερις περιπτώσεις όπου με βάση τη σχετική θέση του αρχικού σημείου του RGB πλέγματος και των δύο ευθειών υποδεικνύεται η σωστή θέση του κέντρου του ρόμβου. Για το πράσινο κανάλι ο αλγόριθμος επιχειρεί την εύρεση των συντεταγμένων του κέντρου βάρους του ρόμβου που ορίζουν τέσσερα γειτονικά σημεία. Αρχικά οι συντεταγμένες του RGB πλέγματος στρογγυλοποιούνται στον κοντινότερο ακέραιο. Αν το σημείο που προκύπτει \textbf{δεν} περιέχει πληροφορία για το πράσινο χρώμα τότε έχει βρεθεί το κέντρο του ρόμβου. Αν το σημείο που προκύπτει περιέχει πληροφορία για το πράσινο χρώμα, σημαίνει ότι πρόκειται για μία από τις κορυφές του ρόμβου. Για να βρεθεί το κέντρο υπολογίζονται οι εξισώσεις των ευθειών που περνούν από το σημείο που βρέθηκε με συντελεστές κλίσης 1 και -1. Έπειτα, όμοια με πριν, διαχωρίζονται τέσσερις περιπτώσεις όπου με βάση τη σχετική θέση του αρχικού σημείου του RGB πλέγματος και των δύο ευθειών υποδεικνύεται η σωστή θέση του κέντρου του ρόμβου.
Αφού βρεθεί το κέντρο του ρόμβου, ο υπολογισμός των συντεταγμένων των τεσσάρων κορυφών είναι απλός. Τέλος υλοποιείται μία ειδική περίπτωση της διγραμμικής παρεμβολής στη συνάρτηση \texttt{tiltedInterp}, καθώς στο πράσινο κανάλι το σύστημα είναι περιστραμμένο και απαιτεί διαφορετική αντιμετώπιση κατά τη παρεμβολή. \begin{figure}[H]
\centering
Τέλος σημειώνεται ότι κατά τη παραπάνω διαδικασία μερικά σημεία θα βρεθούν έξω από τα όρια της εικόνας. Αυτό αφορά τα σημεία κοντά (1-2 pixels in) στα όρια της εικόνας. Για να αντιμετωπιστεί εύκολα αυτό, δημιουργήθηκε μία επεκτεταμένη έκδοση του Bayer πλέγματος στο οποίο οι δύο πρώτες και δύο τελευταίες γραμμές και στήλες έχουν αντιγραφεί με κατάλληλο τρόπο. Επίσης ιδιαίτερη προσοχή χρειάστηκε στους δείκτες του πίνακα του επεκταμένου πλέγματος, ώστε να \resizebox{0.7\textwidth}{!}{
\input{res/BayerGreenCenterIsGreen.pdf_tex}
}
ασδφασφασδφα \caption{Τετράδα γειτονικών πράσινων δειγμάτων στο Bayer pattern και ευθείες}
\end{figure}
Αφού βρεθεί το κέντρο του ρόμβου, ο υπολογισμός των συντεταγμένων των τεσσάρων κορυφών είναι απλός. Τέλος υλοποιείται μία ειδική περίπτωση της διγραμμικής παρεμβολής στη συνάρτηση \texttt{tiltedInterp}, καθώς στο πράσινο κανάλι το σύστημα είναι περιστραμμένο και απαιτεί διαφορετική αντιμετώπιση κατά τη παρεμβολή.
το σωστό στοιχείο του πίνακα κάθε φορά. Τέλος σημειώνεται ότι κατά τη παραπάνω διαδικασία μερικά γειτονικά σημεία θα έχουν συντεταγμένες έξω από τα όρια της εικόνας. Αυτό αφορά τα σημεία κοντά (1-2 pixels in) στα όρια της εικόνας. Για να αντιμετωπιστεί εύκολα αυτό, δημιουργήθηκε μία επεκτεταμένη έκδοση του Bayer πλέγματος στο οποίο οι δύο πρώτες και δύο τελευταίες γραμμές και στήλες έχουν αντιγραφεί με κατάλληλο τρόπο. Επίσης ιδιαίτερη προσοχή χρειάστηκε στους δείκτες του πίνακα του επεκταμένου πλέγματος, ώστε να γίνεται προσπέλαση του σωστού στοιχείου του πίνακα κάθε φορά.

3
Assignment_1/report/3.0.quantization.tex

@ -0,0 +1,3 @@
\section{Κβαντισμός}
Στα πλαίσια της εργασίας υλοποιήθηκαν επίσης ένας ομοιόμορφος, συμμετρικός κβαντιστής χωρίς νεκρή ζώνη, \texttt{myquant} και ο αντίστοιχος αποκβαντιστής, \texttt{mydequant}, καθώς επίσης και δύο συναρτήσεις που εφαρμόζουν τον κβαντιστή και αποκβαντιστή στο κάθε κανάλι της εικόνας ξεχωριστά, \texttt{imagequant} και \texttt{imagedequant} αντίστοιχα.

3
Assignment_1/report/4.0.ppm.tex

@ -0,0 +1,3 @@
\section{Πρότυπο PPM}
Τέλος υλοποιήθηκε η συνάρτηση \texttt{saveasppm} η οποία μετατρέπει την εικόνα σε μορφή που συμμορφώνεται με το πρότυπο PPM και την αποθηκεύει στο δίσκο.

52
Assignment_1/report/5.0.results.tex

@ -0,0 +1,52 @@
\section{Εκτέλεση και αποτελέσματα}
Οι συναρτήσεις που υλοποιήθηκαν χρησιμοποιήθηκαν σε συνδυασμό με την δοκιμαστική εικόνα που δόθηκε ώστε να παράξουν τις παρακάτω εικόνες:
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\includegraphics{res/nearest_3bit_960X1280.png}
}
\caption{RGB εικόνα με χρήση \textbf{κοντινότερου γείτονα}, διαστάσεις 960Χ1280 και \textbf{κβαντισμό 3bit} ανά κανάλι}
\end{figure}
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\includegraphics{res/nearest_8bit_960X1280.png}
}
\caption{RGB εικόνα με χρήση \textbf{κοντινότερου γείτονα}, διαστάσεις 960Χ1280 και \textbf{κβαντισμό 8bit} ανά κανάλι}
\end{figure}
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\includegraphics{res/linear_3bit_960X1280.png}
}
\caption{RGB εικόνα με χρήση \textbf{γραμμικής παρεμβολής}, διαστάσεις 960Χ1280 και \textbf{κβαντισμό 3bit} ανά κανάλι}
\end{figure}
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\includegraphics{res/linear_8bit_960X1280.png}
}
\caption{RGB εικόνα με χρήση \textbf{γραμμικής παρεμβολής}, διαστάσεις 960Χ1280 και \textbf{κβαντισμό 8bit} ανά κανάλι}
\end{figure}
Παρακάτω παρατίθενται ενδεικτικά οι χρόνοι εκτέλεσης των βασικών συναρτήσεων για επιλεγμένες διαστάσεις τελικής εικόνας 960Χ1280 καθώς:
\begin{table}[H]
\centering
\begin{tabular}{l l} \toprule
Συνάρτηση & Χρόνος (seconds) \\ \midrule
\texttt{bayer2rgb} (``nearest'') & 0.164 \\
\texttt{bayer2rgb} (``linear'') & 0.484 \\
\texttt{imagequant} & 0.0315 \\
\texttt{imagedequant} & 0.024 \\
\texttt{saveasppm} & 0.208 \\ \bottomrule
\end{tabular}
\caption{Χρόνοι βασικών συναρτήσεων}
\end{table}
Σημειώνεται ότι οι παραπάνω χρόνοι υπολογίστηκαν με χρήση των εντολών \texttt{tic} και \texttt{toc}, ενώ η χρήση της επιλογής ``Run and Time'' ανέφερε πολύ μεγαλύτερους χρόνους λόγω του overhead που προσθέτει στην εκτέλεση. Το μέγεθος του αρχείου PPM που παράχθηκε με κβάντιση 8bit είναι 3,7MB.

16
Assignment_1/report/report.tex

@ -10,9 +10,12 @@
\usepackage{authblk} \usepackage{authblk}
\usepackage{textcomp} \usepackage{textcomp}
\usepackage{listings} \usepackage{listings}
\usepackage{float}
\usepackage{color} \usepackage{color}
\usepackage{graphicx}
\usepackage{booktabs}
%\usepackage{booktabs} \graphicspath{{res/}}
%\usepackage{multirow} %\usepackage{multirow}
%\usepackage[all]{hypcap} %\usepackage[all]{hypcap}
@ -57,10 +60,10 @@
\date{\today} \date{\today}
\pagestyle{fancy} \pagestyle{fancy}
\lhead{Kefalida} % \lhead{Kefalida}
\rhead{Yposelido} % \rhead{Yposelido}
\renewcommand{\headrulewidth}{0.4pt} % \renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt} % \renewcommand{\footrulewidth}{0.4pt}
\setlength{\headheight}{14pt} \setlength{\headheight}{14pt}
\hypersetup{colorlinks=true, linkcolor=black, urlcolor=blue, citecolor=blue} \hypersetup{colorlinks=true, linkcolor=black, urlcolor=blue, citecolor=blue}
@ -71,5 +74,8 @@
\input{front_page.tex} \input{front_page.tex}
\input{1.0.introduction.tex} \input{1.0.introduction.tex}
\input{2.0.bayer_to_rgb} \input{2.0.bayer_to_rgb}
\input{3.0.quantization}
\input{4.0.ppm}
\input{5.0.results}
\end{document} \end{document}

66
Assignment_1/report/res/BayerGreenCenterIsGreen.pdf_tex

@ -0,0 +1,66 @@
%% Creator: Inkscape inkscape 0.92.3, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'BayerGreenCenterIsGreen.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{300.05419922bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.33224466)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{BayerGreenCenterIsGreen.pdf}}%
\put(0.06925507,0.00647344){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$y = x + b_1$\end{tabular}}}}%
\put(0.07425416,0.31141835){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$y = -x + b_2$\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{BayerGreenCenterIsGreen.pdf}}%
\put(0.7266363,0.26142738){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Bayer Grid Green samples\end{tabular}}}}%
\put(0.773,0.19893867){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}RGB Grid interpolation position\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=3]{BayerGreenCenterIsGreen.pdf}}%
\put(0.815,0.13644996){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Possible positions of rhombus center\end{tabular}}}}%
\put(0.78,0.0764608){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}True position of rhombus center\end{tabular}}}}%
\end{picture}%
\endgroup%

2
Assignment_1/report/res/BayerGreenCenterIsGreen.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.5 KiB

60
Assignment_1/report/res/BayerGreenCenterLines.pdf_tex

@ -0,0 +1,60 @@
%% Creator: Inkscape inkscape 0.92.3, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'BayerGreenCenterLines.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{120.8496377bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.62499426)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{BayerGreenCenterLines.pdf}}%
\put(0.85,0.54522435){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$y = x + b_1$\end{tabular}}}}%
\put(0.85,0.06115174){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$y = -x + b_2$\end{tabular}}}}%
\end{picture}%
\endgroup%

2
Assignment_1/report/res/BayerGreenCenterLines.svg

@ -0,0 +1,2 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="172px" height="104px" viewBox="-0.5 -0.5 172 104" content="&lt;mxfile modified=&quot;2019-03-25T18:57:35.029Z&quot; host=&quot;www.draw.io&quot; agent=&quot;Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0&quot; version=&quot;10.5.5&quot; etag=&quot;h4_qILG8pNpeBybFqcqJ&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;jmSVn6csSq2NoPtqK1Hq&quot;&gt;7Zddb5swFIZ/DZeV+AgfvWyTdrvZNC2Vdjm58QlYM5zIOCXpr99xsAOEpO2mNZOy3SDzco4/ntc+gBdNy80HxVbFJ+QgvdDnGy+aeWE4mVzT1QjbVgijsBVyJXgrBZ0wF89gRd+qa8GhHgRqRKnFaigusKpgoQcaUwqbYdgS5XDUFcthJMwXTI7Vb4LrolWzMO30jyDywo0cJHbBJXPBdiV1wTg2PSm686KpQtRtq9xMQRp2jkubd3/i6X5iCir9lgTL/YnJtV2bnZfeusUqXFccTLzvRbdNITTMV2xhnjbkLmmFLiXdBdRcCimnKFHtciMeQ8YnpNda4Q9wTyqswARjpe9ZKaTZBg+iJEtD/zM0dP2KJasoxE4PlIbNySUGe3C04QBL0GpLIS7BpdjNlmSWfdNZ5+woeq45jdnNku977nhSwyI9jje6fLzZkG4ano/u5PLpBsnfwxv/A3gPakOanA9v8jpeqPiNeV11WHo4kUALbSae+r8CDPjo5fYqrh6O+AgOpymQTIunYffHGNkRvqCggU+WkuyAco1rtQCb1H+pHfQTZCcqvutIM5WDHnW0c2y/6jeZmP438WUTR+x/18TRbvhzJmYjEw2uXYtmY846Ufcfvwcjb6ny6KGhCmrxzB53AcbRlZnfbsbxrRfPSGFrjXX7SWsSmBQ5+TqTsDRdmXIm6EvzxsoaTRWtzTap8gdzM7uanK8+ZuHQzTQb1cf0nerj9QuuXPVtGR+5y7fl4GzEyXvZQrfd30h7trpfuujuJw==&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="40" y="2" width="20" height="20" fill="#d5e8d4" stroke="none" pointer-events="none"/><rect x="0" y="42" width="20" height="20" fill="#d5e8d4" stroke="none" pointer-events="none"/><rect x="80" y="42" width="20" height="20" fill="#d5e8d4" stroke="none" pointer-events="none"/><rect x="40" y="82" width="20" height="20" fill="#d5e8d4" stroke="none" pointer-events="none"/><path d="M 0 102 L 100 2" fill="none" stroke="#000000" stroke-opacity="0.7" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 2 L 100 102" fill="none" stroke="#000000" stroke-opacity="0.7" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(102.5,2.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="55" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">y = x + b_1</div></div></foreignObject><text x="28" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Times New Roman">y = x + b_1</text></switch></g><g transform="translate(101.5,80.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Times New Roman; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">y = -x + b_2</div></div></foreignObject><text x="30" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Times New Roman">y = -x + b_2</text></switch></g></g></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

70
Assignment_1/report/res/BayerGreenSpacing.pdf_tex

@ -0,0 +1,70 @@
%% Creator: Inkscape inkscape 0.92.3, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'BayerGreenSpacing.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{366.75732422bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.25395318)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{BayerGreenSpacing.pdf}}%
\put(0.14622983,0.09172323){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.14622983,0.17761108){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k\end{tabular}}}}%
\put(0.14622983,0.00583537){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0.233,0.2369146){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k\end{tabular}}}}%
\put(0.32209543,0.2369146){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.425,0.2369146){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0.59611859,0.09376818){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0.59611859,0.17965603){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.59611859,0.00788032){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 3\end{tabular}}}}%
\put(0.685,0.2369146){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.785,0.2369146){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0.885,0.2369146){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 3\end{tabular}}}}%
\end{picture}%
\endgroup%

2
Assignment_1/report/res/BayerGreenSpacing.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

71
Assignment_1/report/res/BayerRedBlueSpacing.pdf_tex

@ -0,0 +1,71 @@
%% Creator: Inkscape inkscape 0.92.3, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'BayerRedBlueSpacing.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{414.12140625bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.28116392)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{BayerRedBlueSpacing.pdf}}%
\put(0.23,0.26532074){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.317,0.26532074){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0.405,0.26532074){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 3\end{tabular}}}}%
\put(0.13964564,0.11862463){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.12153501,0.19468928){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k\end{tabular}}}}%
\put(0.13964564,0.04255998){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{BayerRedBlueSpacing.pdf}}%
\put(0.72643009,0.26532074){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k\end{tabular}}}}%
\put(0.8000,0.26532074){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.89,0.26532074){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0.62682162,0.11862463){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 2\end{tabular}}}}%
\put(0.62682162,0.19468928){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 1\end{tabular}}}}%
\put(0.62682162,0.04255998){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2k + 3\end{tabular}}}}%
\end{picture}%
\endgroup%

2
Assignment_1/report/res/BayerRedBlueSpacing.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

65
Assignment_1/report/res/BayerToRGBGrids.pdf_tex

@ -0,0 +1,65 @@
%% Creator: Inkscape inkscape 0.92.3, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'BayerToRGBGrids.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{417.27082031bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.31229358)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{BayerToRGBGrids.pdf}}%
\put(0.86294136,0.22467423){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Bayer Grid Red samples\end{tabular}}}}%
\put(0.87372573,0.17254981){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Bayer Grid Green samples\end{tabular}}}}%
\put(0.86473876,0.11862799){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Bayer Grid Blue samples\end{tabular}}}}%
\put(0.83058827,0.06470618){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}RGB Grid sample\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{BayerToRGBGrids.pdf}}%
\put(0.12061771,0.1761446){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}h\end{tabular}}}}%
\put(0.22846134,0.29656998){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}l\end{tabular}}}}%
\end{picture}%
\endgroup%

2
Assignment_1/report/res/BayerToRGBGrids.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

BIN
Assignment_1/report/res/linear_3bit_960X1280.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

BIN
Assignment_1/report/res/linear_8bit_960X1280.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
Assignment_1/report/res/nearest_3bit_960X1280.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

BIN
Assignment_1/report/res/nearest_8bit_960X1280.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 KiB

17
Assignment_1/saveasppm.m

@ -11,29 +11,26 @@ function saveasppm(x, filename, K)
fwrite(file, 'P6'); fwrite(file, 'P6');
fwrite(file, ' '); fwrite(file, ' ');
fwrite(file, int2str(size(x.red, 1))); fwrite(file, int2str(size(x, 2)));
fwrite(file, ' '); fwrite(file, ' ');
fwrite(file, int2str(size(x.red, 2))); fwrite(file, int2str(size(x, 1)));
fwrite(file, ' '); fwrite(file, ' ');
fwrite(file, int2str(K)); fwrite(file, int2str(K));
fwrite(file, newline); fwrite(file, newline);
if K < 256 if K < 256
precision = 'integer*1'; precision = 'integer*1';
precisionBytes = 1;
machinefmt = 'l'; machinefmt = 'l';
else else
precision = 'integer*2'; precision = 'integer*2';
precisionBytes = 2;
machinefmt = 'b'; machinefmt = 'b';
end end
for row = 1:size(x.red, 1) for row = 1:size(x, 1)
for column = 1:size(x.red, 2) combinedRow(1:3:3 * size(x, 2)) = x(row, :, 1);
fwrite(file, x.blue(row, column), precision, machinefmt); combinedRow(2:3:3 * size(x, 2)) = x(row, :, 2);
fwrite(file, x.green(row, column), precision, machinefmt); combinedRow(3:3:3 * size(x, 2)) = x(row, :, 3);
fwrite(file, x.red(row, column), precision, machinefmt); fwrite(file, combinedRow, precision, machinefmt);
end
end end
fclose(file); fclose(file);

242
Assignment_1/try.ppm

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save