MATLAB Repetitorium - Bildverarbeitung
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