MATLAB Repetitorium - Bildverarbeitung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
(10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 6: | Zeile 6: | ||
| '''Termin:''' || 05.07.2024 | | '''Termin:''' || 05.07.2024 | ||
|} | |} | ||
== Aufgabe 7.1 | == Aufgabe 7.1: Bilder einlesen und anzeigen == | ||
[[Datei:Lena std.png|thumb|rigth| | [[Datei:Lena std.png|thumb|rigth|200px|Abb. 1: Lena std.png]] | ||
Lesen Sie das Bild „lena_std.png“ ein, indem Sie dies zunächst direkt über die Eingabe eines Pfades und anschließend über einen interaktiven Dialog vollziehen und ermitteln Sie die Größe des Bildes (Befehle: imread(), uigetfile()) | #Lesen Sie das Bild „lena_std.png“ ein, indem Sie dies zunächst direkt über die Eingabe eines Pfades und anschließend über einen interaktiven Dialog vollziehen und ermitteln Sie die Größe des Bildes (Befehle: <code>imread(), uigetfile()</code>). | ||
# Erzeugen Sie eine Ausgabe, in der die einzelnen Farbräume (R, G und B) und das Originalbild nebeneinander dargestellt werden und Erzeugen Sie zu jedem Bild ein Titel (Befehle: <code>imshow(), subplot()</code>) | |||
# Geben Sie das Grauwertbild in einem neuen Fenster aus. | |||
#Lesen Sie interaktiv aus dem Grauwertbild mit einem Fadenkreuz einen Pixel aus und geben Sie Pixelposition (x,y) und den Grauwert im Matlab Command Window aus (Befehle: <code>ginput(), num2str(), disp()</code>) | |||
#Speichern Sie das Grauwertbild als Bilddatei ab (Befehl: <code>imwrite()</code>). | |||
Notwendige Datei: [[Medium:Lena std.png]] | '''Notwendige Datei:''' [[Medium:Lena std.png|Lena std.png]] | ||
'''Nützliche Befehle:''' | '''Nützliche Befehle:''' <code>imread(), uigetfile()</code>,<code>imshow(), subplot()</code>,<code>ginput(), num2str(), disp()</code>, <code>imwrite()</code> | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong>Musterlösung | | <strong>Musterlösung 7.1 </strong> | ||
|- | |- | ||
| <source line lang="matlab" style="font-size:medium">%% Aufgabe | | <source line lang="matlab" style="font-size:medium">%% Aufgabe 7.1 - Bilder einlesen und anzeigen | ||
%% | %% Workspace reinigen | ||
clear all; close all; clc | |||
% | %% Teil 1: Bilder einlesen und ausgeben | ||
%% | %% a) | ||
[filename, path] = uigetfile('*.png'); | |||
readImage = [path, filename]; | |||
image = imread(readImage); | |||
%% b) | |||
figure | |||
subplot(2, 2, 1); | |||
imshow(image); | |||
title(filename); | |||
subplot(2, 2, 2); | |||
imshow(image(:,:,1)); | |||
title('Rotanteil'); | |||
subplot(2, 2, 3); | |||
imshow(image(:,:,2)); | |||
title('Grünanteil'); | |||
subplot(2, 2, 4); | |||
imshow(image(:,:,3)); | |||
title('Blauanteil'); | |||
%% | %% c) | ||
grayImage = rgb2gray(image); | |||
%% | %% d) | ||
figure | |||
imshow(grayImage); | |||
title('Grautwertbild'); | |||
hold on | |||
%% e) | |||
[x, y] = ginput(1); | |||
plot(x, y, 'rx'); | |||
hold off | |||
x = uint16(x); | |||
y = uint16(y); | |||
% Runden der Werte, alternativ: round() | |||
grayValue = grayImage(x, y); | |||
fprintf(['Der ausgelesene Grauwert ist: ', num2str(grayValue), '\n']); | |||
fprintf(['Die zugehörige Position ist: ', num2str(x),', ', num2str(y), ' (x, y)\n']); | |||
%% f) | |||
imwrite(grayImage, 'Lena_Grauwertbild.png'); | |||
%% Teil 2: Bildverarbeitung | |||
%% a) | |||
[filename, path] = uigetfile('*.tif'); | |||
readImage = [path, filename]; | |||
NoiseImage = imread(readImage); | |||
figure | |||
subplot(1, 4, 1); | |||
imshow(NoiseImage); | |||
title('Verrauschtes Bild'); | |||
%% b) | |||
% Filter für die Bildverarbeitung: | |||
% https://de.mathworks.com/help/images/referencelist.html?type=function&category=linear-filtering&s_tid=CRUX_topnav | |||
%% c) | |||
% Zweidimensionaler Median-Filter | |||
medianSize = [3, 3]; | |||
medianFilter = medfilt2(NoiseImage, medianSize); | |||
subplot(1, 4, 2); | |||
imshow(medianFilter); | |||
title(['Median-Filter mit ', num2str(medianSize(1)), 'x', num2str(medianSize(2)), ' Pixelnachbarschaft']); | |||
% Gauss-Filter | |||
sigma = 0.8; | |||
gaussFilter = imgaussfilt(NoiseImage, sigma); | |||
subplot(1, 4, 3); | |||
imshow(gaussFilter); | |||
title(['Gauss-Filter mit \sigma = ', num2str(sigma)]); | |||
% Tiefpass Wiener-Filter | |||
wienerSize = [3, 3]; | |||
wienerFilter = wiener2(NoiseImage, wienerSize); | |||
subplot(1, 4, 4); | |||
imshow(wienerFilter); | |||
title(['Wiener-Filter mit einer ', num2str(wienerSize(1)), 'x', num2str(wienerSize(2)), ' Pixelnachbarschaft']); | |||
%% d) | |||
[Datei, Pfad] = uigetfile('*.png'); | |||
Ente = imread([Pfad, Datei]); | |||
figure | |||
subplot(2, 1, 1); | |||
imshow(Ente); | |||
title('Foto einer Ente'); | |||
%% e) | |||
[x, y] = ginput(2); | |||
x = uint16(x); | |||
y = uint16(y); | |||
% Notwendige Abfrage aufgrund der Reihenfolge der eingelesenen Punkte mit | |||
% ginput(). Außerdem sind x- und y-Werte bei der Bildverarbeitung und der | |||
% normalen figure Darstellung vertauscht! | |||
if (y(1) < y(2)) && (x(1) < x(2)) | |||
Nummernschild = Ente(y(1):y(2), x(1):x(2)); | |||
elseif (y(1) < y(2)) && (x(1) > x(2)) | |||
Nummernschild = Ente(y(1):y(2), x(2):x(1)); | |||
elseif (y(1) > y(2)) && (x(1) < x(2)) | |||
Nummernschild = Ente(y(2):y(1), x(1):x(2)); | |||
elseif (y(1) > y(2)) && (x(1) > x(2)) | |||
Nummernschild = Ente(y(2):y(1), x(2):x(1)); | |||
end | |||
subplot(2, 1, 2); | |||
imshow(Nummernschild); | |||
title('Nummernschild'); | |||
%% Teil 3: Segmentierung | |||
%% a) | |||
% https://de.mathworks.com/help/images/ref/colorthresholder-app.html | |||
%% b) c) d) e) | |||
% Alle Aufgabenteile werden in der App selbst durchgeführt. Ein | |||
% dokumentiertes Beispiel lässt sich unter | |||
% https://de.mathworks.com/help/images/image-segmentation-using-the-color-thesholder-app.html | |||
% einsehen. Unter Aufgabenteil e) muss in der App unter Export 'Export | |||
% Function' ausgewählt werden. Diese wird dann als MATLAB Funktion | |||
% abgespeichert. | |||
%% Teil 4: Video einlesen und ausgeben | |||
%% a) | |||
[filename, path] = uigetfile('*.mpeg'); | |||
video = VideoReader([path, filename]); | |||
%% b) | |||
nFrames = video.NumFrames; | |||
FrameRate = video.FrameRate; | |||
%% c) | |||
figure('Name', 'Ausgabe jedes 5. Frames') | |||
for i = 1:(nFrames-1) | |||
image = read(video, i); | |||
if mod(i, 5) == 0 | |||
imshow(image); | |||
end | |||
end | |||
%% d) | |||
figure('Name', 'Ausgabe jedes 5. Grauwertframes') | |||
for j = 1:(nFrames - 1) | |||
image = read(video, j); | |||
if mod(j, 5) == 0 | |||
GrayImage = rgb2gray(image); | |||
imshow(GrayImage); | |||
end | |||
end | |||
% Alternative für c) und d) | |||
% | |||
% for k = 1:5:nFrames | |||
% | |||
% image = read(video, k); | |||
% | |||
% imshow(image); | |||
% | |||
% end | |||
</source> | </source> | ||
|} | |} | ||
---- | |||
== Aufgabe 7.2: Datenzugriff == | |||
# Checken Sie den SVN <code>trunk</code> aus (URL: https://svn.hshl.de/svn/MATLAB_Vorkurs/trunk/MATLAB_Repetitorium). | |||
# Wechseln Sie in Ihr Arbeitsverzeichnis (z. B. <code>\MATLAB_Repetitorium\User\SoSe24\Ulrich_Schneider\Lektion_07_Bildverarbeitung\</code>). | |||
# Laden Sie die Bilddatei <code>lena_std.png</code> aus dem Ordner <code>\MATLAB_Repetitorium\Daten</code> '''ohne''' die Datei zu kopieren. | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Musterlösung 7.2 </strong> | |||
|- | |||
| <source line lang="matlab" style="font-size:medium">%% Aufgabe 7.2: Datenzugriff | |||
</source> | |||
|} | |||
---- | |||
== Aufgabe 7.3: Videobild extrahieren == | |||
[[Datei:GeradeInKurve.mp4|thumb|rigth|200px|Abb. 2: Datei:GeradeInKurve.mp4]] | |||
Notwendige Datei: [[Medium:GeradeInKurve.mp4|GeradeInKurve.mp4]] |
Aktuelle Version vom 5. Juli 2024, 07:47 Uhr
Autor: | Prof. Dr.-Ing. Schneider |
Termin: | 05.07.2024 |
Aufgabe 7.1: Bilder einlesen und anzeigen
- Lesen Sie das Bild „lena_std.png“ ein, indem Sie dies zunächst direkt über die Eingabe eines Pfades und anschließend über einen interaktiven Dialog vollziehen und ermitteln Sie die Größe des Bildes (Befehle:
imread(), uigetfile()
). - Erzeugen Sie eine Ausgabe, in der die einzelnen Farbräume (R, G und B) und das Originalbild nebeneinander dargestellt werden und Erzeugen Sie zu jedem Bild ein Titel (Befehle:
imshow(), subplot()
) - Geben Sie das Grauwertbild in einem neuen Fenster aus.
- Lesen Sie interaktiv aus dem Grauwertbild mit einem Fadenkreuz einen Pixel aus und geben Sie Pixelposition (x,y) und den Grauwert im Matlab Command Window aus (Befehle:
ginput(), num2str(), disp()
) - Speichern Sie das Grauwertbild als Bilddatei ab (Befehl:
imwrite()
).
Notwendige Datei: Lena std.png
Nützliche Befehle: imread(), uigetfile()
,imshow(), subplot()
,ginput(), num2str(), disp()
, imwrite()
Musterlösung 7.1 |
%% Aufgabe 7.1 - Bilder einlesen und anzeigen
%% Workspace reinigen
clear all; close all; clc
%% Teil 1: Bilder einlesen und ausgeben
%% a)
[filename, path] = uigetfile('*.png');
readImage = [path, filename];
image = imread(readImage);
%% b)
figure
subplot(2, 2, 1);
imshow(image);
title(filename);
subplot(2, 2, 2);
imshow(image(:,:,1));
title('Rotanteil');
subplot(2, 2, 3);
imshow(image(:,:,2));
title('Grünanteil');
subplot(2, 2, 4);
imshow(image(:,:,3));
title('Blauanteil');
%% c)
grayImage = rgb2gray(image);
%% d)
figure
imshow(grayImage);
title('Grautwertbild');
hold on
%% e)
[x, y] = ginput(1);
plot(x, y, 'rx');
hold off
x = uint16(x);
y = uint16(y);
% Runden der Werte, alternativ: round()
grayValue = grayImage(x, y);
fprintf(['Der ausgelesene Grauwert ist: ', num2str(grayValue), '\n']);
fprintf(['Die zugehörige Position ist: ', num2str(x),', ', num2str(y), ' (x, y)\n']);
%% f)
imwrite(grayImage, 'Lena_Grauwertbild.png');
%% Teil 2: Bildverarbeitung
%% a)
[filename, path] = uigetfile('*.tif');
readImage = [path, filename];
NoiseImage = imread(readImage);
figure
subplot(1, 4, 1);
imshow(NoiseImage);
title('Verrauschtes Bild');
%% b)
% Filter für die Bildverarbeitung:
% https://de.mathworks.com/help/images/referencelist.html?type=function&category=linear-filtering&s_tid=CRUX_topnav
%% c)
% Zweidimensionaler Median-Filter
medianSize = [3, 3];
medianFilter = medfilt2(NoiseImage, medianSize);
subplot(1, 4, 2);
imshow(medianFilter);
title(['Median-Filter mit ', num2str(medianSize(1)), 'x', num2str(medianSize(2)), ' Pixelnachbarschaft']);
% Gauss-Filter
sigma = 0.8;
gaussFilter = imgaussfilt(NoiseImage, sigma);
subplot(1, 4, 3);
imshow(gaussFilter);
title(['Gauss-Filter mit \sigma = ', num2str(sigma)]);
% Tiefpass Wiener-Filter
wienerSize = [3, 3];
wienerFilter = wiener2(NoiseImage, wienerSize);
subplot(1, 4, 4);
imshow(wienerFilter);
title(['Wiener-Filter mit einer ', num2str(wienerSize(1)), 'x', num2str(wienerSize(2)), ' Pixelnachbarschaft']);
%% d)
[Datei, Pfad] = uigetfile('*.png');
Ente = imread([Pfad, Datei]);
figure
subplot(2, 1, 1);
imshow(Ente);
title('Foto einer Ente');
%% e)
[x, y] = ginput(2);
x = uint16(x);
y = uint16(y);
% Notwendige Abfrage aufgrund der Reihenfolge der eingelesenen Punkte mit
% ginput(). Außerdem sind x- und y-Werte bei der Bildverarbeitung und der
% normalen figure Darstellung vertauscht!
if (y(1) < y(2)) && (x(1) < x(2))
Nummernschild = Ente(y(1):y(2), x(1):x(2));
elseif (y(1) < y(2)) && (x(1) > x(2))
Nummernschild = Ente(y(1):y(2), x(2):x(1));
elseif (y(1) > y(2)) && (x(1) < x(2))
Nummernschild = Ente(y(2):y(1), x(1):x(2));
elseif (y(1) > y(2)) && (x(1) > x(2))
Nummernschild = Ente(y(2):y(1), x(2):x(1));
end
subplot(2, 1, 2);
imshow(Nummernschild);
title('Nummernschild');
%% Teil 3: Segmentierung
%% a)
% https://de.mathworks.com/help/images/ref/colorthresholder-app.html
%% b) c) d) e)
% Alle Aufgabenteile werden in der App selbst durchgeführt. Ein
% dokumentiertes Beispiel lässt sich unter
% https://de.mathworks.com/help/images/image-segmentation-using-the-color-thesholder-app.html
% einsehen. Unter Aufgabenteil e) muss in der App unter Export 'Export
% Function' ausgewählt werden. Diese wird dann als MATLAB Funktion
% abgespeichert.
%% Teil 4: Video einlesen und ausgeben
%% a)
[filename, path] = uigetfile('*.mpeg');
video = VideoReader([path, filename]);
%% b)
nFrames = video.NumFrames;
FrameRate = video.FrameRate;
%% c)
figure('Name', 'Ausgabe jedes 5. Frames')
for i = 1:(nFrames-1)
image = read(video, i);
if mod(i, 5) == 0
imshow(image);
end
end
%% d)
figure('Name', 'Ausgabe jedes 5. Grauwertframes')
for j = 1:(nFrames - 1)
image = read(video, j);
if mod(j, 5) == 0
GrayImage = rgb2gray(image);
imshow(GrayImage);
end
end
% Alternative für c) und d)
%
% for k = 1:5:nFrames
%
% image = read(video, k);
%
% imshow(image);
%
% end
|
Aufgabe 7.2: Datenzugriff
- Checken Sie den SVN
trunk
aus (URL: https://svn.hshl.de/svn/MATLAB_Vorkurs/trunk/MATLAB_Repetitorium). - Wechseln Sie in Ihr Arbeitsverzeichnis (z. B.
\MATLAB_Repetitorium\User\SoSe24\Ulrich_Schneider\Lektion_07_Bildverarbeitung\
). - Laden Sie die Bilddatei
lena_std.png
aus dem Ordner\MATLAB_Repetitorium\Daten
ohne die Datei zu kopieren.
Musterlösung 7.2 |
%% Aufgabe 7.2: Datenzugriff
|
Aufgabe 7.3: Videobild extrahieren
Notwendige Datei: GeradeInKurve.mp4