Modellbildung und Simulation - Grundlagen der Bildverarbeitung
| Autor: | Prof. Dr.-Ing. Schneider |
| Termin: | 06.06.2025 |
Aufgabe 10.1
Erzeugen Sie ein bmp-Bild-Array mit 3 Zeilen und 8 Spalten, das einen waagrechten blauen Strich enthält, und geben Sie diese Daten mit der image-Funktion aus.
Versuchen Sie, andere geometrische Figuren in unterschiedlichen Farben zu erzeugen.
| Musterlösung 10.1 |
% Aufgabe 10.1: verschiedene bmp-Bilder
% bmpFiguren()
function bmpFiguren()
figure;
% Strich:
% weisse Zeile
a1( 1, 1:8, 1:3 ) = 255;
% blaue Zeile
a1( 2, 1:8, 1:2 ) = 0;
a1( 2, 1:8, 3 ) = 255;
% weisse Zeile
a1( 3, 1:8, 1:3 ) = 255;
% Ausgabe
subplot( 2, 1, 1 ),
image( uint8(a1) ); axis image;
% Rechteck, farbig
% roter Rand (bzw. alles erst mal Rot)
a2( 1:4, 1:10, 1 ) = 255;
a2( 1:4, 1:10, 2:3 ) = 0;
% gelbes Inneres (³berschreibt dort das Rot)
a2( 2:3, 2:9, 1:2 ) = 255;
a2( 2:3, 2:9, 3 ) = 0;
% Ausgabe
subplot( 2, 1, 2 ),
image( uint8(a2) ); axis image;
end
|
Aufgabe 10.2
Schreiben Sie eine Funktion, die ein RGB-Bild mit 255 Zeilen und 255 Spalten erzeugt, also mit exakt 255x255 Pixeln, wobei der Rot-Wert eines Pixels P(z,s) den Wert z der Zeile hat, der Grün-Wert den Wert s der Spalte und der Blau-Wert für alle Pixel 100 ist.
| Musterlösung 10.2 |
%
% createImage erzeugt ein RGB-Bild mit 255 Zeilen und 255 Spalten,
% also mit exakt 255x255 Pixeln, wobei der Rot-Wert eines Pixels P(z,s)
% den Wert z der Zeile hat, der Gr³n-Wert den Wert s der Spalte und
% der Blau-Wert f³r alle Pixel 100 ist.
%
function createImage()
% Array vorbelegen, bringt Geschwindigkeitsvorteil
A( 1:255, 1:255, 1:3 ) = 0;
% alle Zeilen und Spalten definieren
for( z=1:255 )
for( s=1:255 )
A(z,s,1) = z; % Rot-Wert
A(z,s,2) = s; % Gr³n-Wert
A(z,s,3) = 100; % Blau-Wert
end
end
% Daten in uint8 wandeln, zur Sicherheit
A = uint8(A);
% Bild anzeigen
image( uint8(A) );
axis image;
% Dateinamen zum Speichern holen
[f,p] = uiputfile( 'createImage.bmp' );
if( f == 0 )
return;
end
% Dateinamen aus Pfad p und File-Namen f zusammenbauen
datei = [p,f];
% Daten abspeichern
imwrite( A, datei )
end
|
Aufgabe 10.3
Schreiben Sie eine Funktion, mit der man die Helligkeit eines bmp-Bildes variieren kann. Ändern Sie dazu die drei Farbkanäle jeweils um exakt denselben Prozentsatz.
Wie sieht das Bild aus, wenn Sie anstelle einer prozentualen Änderung die Farbkanäle um jeweils einen identischen festen Wert abwandeln?
Beispielbild: Katze.jpg
| Musterlösung 10.3 |
% Aufgabe 10.3: verändert die Helligkeit von bmp-Bildern
% helligkeit( A )
% A : übergebenes bmp-Array, z.B. von Katze.jpg, Typ uint8
% proz : prozentuale Hellikeitsänderung
% Beispielaufruf:
% >> A = imread( 'Katze.bmp' );
% >> helligkeit( A, -20 );
function helligkeit( A, proz )
figure;
% links das Original anzeigen
subplot(1,2,1)
image( A );
axis image
% geändertes Bild
subplot(1,2,2)
% zum Rechnen A von uint8 nach double wandeln
% Bild von 100% auf (100+proz)% abõndern
% f³r alle Pixel und alle 3 Farbkanõle B(:,:,:)
B = double( A ) * ( 100.0 + proz ) / 100.0;
% vor dem Zeichnen wieder in das Format uint8 wandeln
image( uint8(B) );
axis image
end
|
Aufgabe 10.4
Schreiben Sie eine Funktion B = verkleinern(file). Diese Funktion lädt das Bild A aus der bmp-Datei file und berechnet daraus ein verkleinertes Bild B in der Art, dass B nur noch die Hälfte der Zeilen und die Hälfte der Spalten des Ursprungsbildes
A besitzt. Die Farbwerte eines Pixels von B sind definiert als die Mittelwerte aus den vier Pixeln, die um eine Position P = (z,s) liegen, also aus dem Pixel A(z,s,:) und den drei vorherigen Pixeln A(z-1,s,:), A(z,s-1,:) und A(z-1,s-1,:). Das berechnete
Bild B wird zurückgegeben.
| Musterlösung 10.4 |
%
% >> B = verkleinern( 'Katze.bmp' );
% >> image( B ); axis image
%
function B = verkleinern( file )
A = imread( file );
sz = size( A );
D = double(A);
for( z = 1: sz(1)/2 )
for( s = 1: sz(2)/2 )
B(z,s,:) = uint8( ( D(2*z,2*s,:) + D(2*z-1,2*s,:) + ...
D(2*z,2*s-1,:) + D(2*z-1,2*s-1,:) ) / 4.0 );
end
end
end
|
Aufgabe 10.5: Bilder einlesen und ausgeben
Schreiben Sie ein Matlab Skript, in dem Sie folgende Aufgaben bewältigen:
- Lesen Sie das Bild
lena_std.pngein, 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()) - Erzeugen Sie aus dem Bild eine Grauwertbild (Befehle:
rgb2gray()) - 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 (Befehle:
imwrite())
| Musterlösung 10.5 |
%% 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');
|
Aufgabe 10.6: Bildverarbeitung
Schreiben Sie ein Matlab Skript, in dem Sie folgende Aufgaben bewältigen:
- Lesen Sie das Bild
noisylena.tifein und erzeugen Sie eine Ausgabe - Recherchieren Sie, welche Filteroperationen es in Matlab zur Verringerung von Rauschen in einem Bild gibt. Ermitteln Sie dabei experimentell die optimalen Filterkonstanten. Welche negativen Nebeneffekte tauchen dabei auf?
- Wenden Sie die Filteroperationen auf das eingelesene Bild an. Stellen Sie die Ergebnisse nebeneinander dar.
- Lesen Sie das Bild
EnteUnscharf.pngein und erzeugen Sie eine Ausgabe - Wählen Sie für dieses Bild über ein interaktives Fadenkreuz den Bereich des Nummernschildes aus und erzeugen Sie eine Ausgabe des Nummernschildes
| Musterlösung 10.6 |
Aufgabe 10.7: Segmentierung
Schreiben Sie ein Matlab Skript, in dem Sie folgende Aufgaben bewältigen:
- Machen Sie sich mit der Matlab-App
Color Thresholdervertraut. - Laden Sie in die Anwendung das Bild
smarties.jpgund wählen Sie den RGB-Raum aus. - Wählen Sie mit dem Auswahl-Werkzeug eine blaue Schokolinse aus und stellen Sie die Segmentierung als Binärbild dar
- Verbessern Sie die Segmentierung mithilfe der RGB Slider (als Ergebnis sollen nur die blauen Schokolinsen zu sehen sein)
- Exportieren Sie eine Funktion
- Schreiben Sie ein Matlab Skript, in welchem Sie folgende Aufgaben bewältigen:
- Laden Sie das Bild
smarties.jpgein - Erzeugen Sie ein Binärbild, welches nur die blauen Schokolinsen enthält, mithilfe der zuvor erstellten Funktion
- „Bereinigen“ Sie das Binärbild unter folgenden Anforderungen: Füllen der „Löcher“ in den einzelnen Schokolinsen, Löschen aller Schokolinsen am Rand des Bildes, Löschen kleiner nicht zugehöriger Pixelbereiche (Befehle:
imfill(), imclearborder(), bwareaopen()) - Zählen Sie die Anzahl der vollständig zu sehenden blauen Schokolinsen (Befehle:
bwlabel()) - Erzeugen Sie in einem Fenster eine Ausgabe des Originalbildes, des unbereinigten Binärbildes und des bereinigten Binärbildes, welches als Titel die Anzahl der blauen Schokolinsen enthält
- Erzeugen Sie in einem neuen Fenster eine Ausgabe jeder einzelnen Schokolinse (Befehle:
ismember()) - Zusatzaufgabe: Erstellen Sie aus den einzelnen Schokolinsen ein GIF (siehe:
imwrite)
- Laden Sie das Bild
| Musterlösung 10.7 |
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe25