Augmented Reality: Wörterbuch: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(69 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 11: Zeile 11:
# Erkennen Sie die Schrift auf den Schildern
# Erkennen Sie die Schrift auf den Schildern
# Ersetzen Sie diese Schrift perspektivisch durch eine passende deutsche Beschriftung im Videobild.
# Ersetzen Sie diese Schrift perspektivisch durch eine passende deutsche Beschriftung im Videobild.
# Präsentieren Sie Ihr Ergebnis in der Form des [http://youtu.be/h2OfQdYrHRs| Videos von Word Lense].
== Lösung ==
Diese Lösung übersetzt Wörter in Beispielbildern. Diese Bilder zeigen rechteckige Schilder mit Text.
=== 1.Schritt: Einlesen der Daten ===
Zuerst müssen alle benötigten Daten eingelesen werden.
In dem Skrip "buchstaben_einlesen;" werden die Schwarz/Weiß Tamplates geladen.
Die Grundlage für die Übersetzung stellt das Cell Array "vokabeln", da der Schwerpunkt der Aufgabe in der Bildverarbeitung besteht, wird eine Wort für Wort Übersetzung angewendet.
<source lang="matlab">
%% Bild und Daten einlesen
buchstaben_einlesen;
load ('vokabeln.mat') ;
bild_org = imread('IMAG0460.jpg'); % Einlesen des Bildes
</source>
[[Datei:bild_org.png|400px|bild_org.png]]
=== 2.Schritt: Vorbereiten der Daten ===
Unter der Annahme eines rechteckigen Schildes welches sich gut von der Umgebung abhebt  kann das Bild auf ein Kantenbild reduziert werden.
Mit Hilfe dieser Reduzierung und der Trennung vom Hintergrund werden die Schild Informationen hervorgehoben.
<source lang="matlab">
%% Bilddaten umwandeln Ergebnis = Kanten Bild 
bild_grau = rgb2gray(bild_org); % umwandeln des Bildes in ein Graustufenbild
bild_grau= imadjust(bild_grau); % Kontrast erhöhen
thresh = graythresh(bild_grau); % automatische Bestimmung eines Schwellenwertes, um Vorder- und Hintergrund zu unterscheiden
bild_bw = im2bw(bild_grau,thresh); % Umwandeln des Graustufenbildes in ein b/w-Bild  in Abhängigkeit des vorherbestimmten Schwellenwertes
bild_bw_canny = edge(bild_bw, 'Canny'); % Kantenbild durch Canny 
</source>
[[Datei:Bild_bw_canny.png|400px|Kantenbild Canny]]
=== 3.Schritt: Wichtige Region finden ===
Alle Regionen im Kantenbild, die von Weiß umgeben sind werden auf Weiß (1) gesetzt.Danach werden zu kleine Regionen gelöscht und das Bild erneut gefüllt.
Danach werden die Informationen der noch übrigen Regionen gespeichert.
<source lang="matlab">
%% Roi erzeugen / finden  und Bild reduzieren
bild_bw_roi = imfill(bild_bw_canny,'holes');% Hier werden alle schwarzen Bereiche, die komplett von weißen Bereichen umgeben sind, auf weiß gesetzt und damit zu dem Objekt hinzugefügt
bild_bw_roi = bwareaopen(bild_bw_roi,6000,4);
bild_bw_roi = imfill(bild_bw_roi,'holes');
bild_grau_roi = bild_grau .* uint8(bild_bw_roi);% Graubild auf ROI reduzieren
stats = regionprops(bild_bw_roi); % weiße Regionen finden
</source>
[[Datei:Bild_bw_grau_roi.png|800px|Bild mit ROI]]
=== 4.Schritt: Entzerrung der RoI ===
Bei der Entzerrung der Perspektive des Bildes ergab sich folgendes Problem:  Die gefunden Bereiche haben abgerundete Ecken. Dadurch ist es nicht möglich die Ecken mit Hilfe der "Corner detection" zu finden.
Diese Ecken sind notwendig um die  Entzerrung der RoI durchführen zu können. Ansatz: Schnittpunkte der Geraden des Kantenbildes der Roi.
Für die Bestimmung der Transformationsmatrix werden 4 Punkte im verzerrten Bild(siehe Ansatz oben) und die zugehörigen 4 Punkte im unverzerrten Bild benötigt. Da diese nicht bekannt und auch die Abmessungen des Schildes nicht gegeben sind, werden diese 4 Punkte als Eckpunkte der umgebenden BoundingBox (vgl.Abb RoI mit BoundingBox) angenommen. 
 
<source lang="matlab">
%% Transformation / Entzerung des Bildes
bild_bw_roi_sobel = edge(bild_bw_roi,'Sobel'); % kanten der RoI
% Koordinaten der BoundingBox Ecken ergeben die unverzerrte Ecken --> Näherung an die Originalgröße des Schildes da nicht bekannt 
% Oben Links Ecke
corner_Bb{1} = [stats(1).BoundingBox(1,1),stats(1).BoundingBox(1,2)];
% oben Rechts Ecke
corner_Bb{2} = [stats(1).BoundingBox(1,1)+stats(1).BoundingBox(1,3) ,stats(1).BoundingBox(1,2)];
% Unten Rechts Ecke
corner_Bb{3} = [stats(1).BoundingBox(1,1)+stats(1).BoundingBox(1,3),stats(1).BoundingBox(1,2)+stats(1).BoundingBox(1,4)];
% Unten Links Ecke
corner_Bb{4} = [stats(1).BoundingBox(1,1),stats(1).BoundingBox(1,2)+stats(1).BoundingBox(1,4)];
</source>
[[Datei:Bild_grau_roi_BB.png|400px|RoI mit BoundingBox]]
<source lang="matlab">
% Geraden erzeugen um Ecken in der Perspektive zu berechnen
[H,theta,rho] = hough(bild_bw_roi_sobel); % Hough Transformation
P = houghpeaks(H,5,'threshold',ceil(0.2*max(H(:)))); % in der Hough Transformation  Maxima finden
lines = houghlines(bild_bw_roi_sobel,theta,rho,P,'FillGap',150,'MinLength',20); % Linen finden
</source>
[[Datei:Bild_bw_roi_sobel_lines.png|800px|Kantenbild der RoI mit Linien]]
<br />
Um auszuschließen, dass durch die Hough Transformation Geraden gefunden, werden die die gleiche Linie beschreiben (vgl. Abb. oben), müssen sobald mehr als 4 Geraden erkannt werden, "doppelte" aussortiert werden. 
<source lang="matlab">
% Parallelen finden doppelte Linien aussortieren
if (size(lines,2)>4)
    for cnt = 1 : size(lines,2)
        lines_diff(cnt) = abs(lines(cnt).rho) - abs(lines(cnt).theta);  % Differenz  erstellen um Gleich gerichtete Linien zu finden
    end
    for cnt = 1 : size(lines,2)
        for cnt2 = cnt : size(lines,2)
       
            lines_diff_each(cnt2,cnt)=min(abs(lines_diff(cnt)-lines_diff(cnt2))); % Alle Differenzen von einander Abziehen um Ähnlichkeit zu finden
       
      end
    end
    [lines_diff_row,lines_diff_colum ]= find (lines_diff_each<40&lines_diff_each>0); % Doppelte linen löschen
    lines(lines_diff_row)=[];
end
for cnt = 1 : size(lines,2)
        lines_theta(cnt) = lines(cnt).theta ; % theta ist der Winkel zur Achse bei ähnlichem winkel sind die Linien Paralle 
end
[b,ix] = sort(lines_theta);% Nach Größe sotieren
% Ecken berechnen aus den Schnittpunkten
corner{4} = schneide ([lines(ix(2)).point1(1,1);lines(ix(2)).point1(1,2)],...
                    [lines(ix(2)).point2(1,1);lines(ix(2)).point2(1,2)],...
                    [lines(ix(3)).point1(1,1);lines(ix(3)).point1(1,2)],...
                    [lines(ix(3)).point2(1,1);lines(ix(3)).point2(1,2)]);
               
corner{1} = schneide ([lines(ix(1)).point1(1,1);lines(ix(1)).point1(1,2)],...
                    [lines(ix(1)).point2(1,1);lines(ix(1)).point2(1,2)],...
                    [lines(ix(3)).point1(1,1);lines(ix(3)).point1(1,2)],...
                    [lines(ix(3)).point2(1,1);lines(ix(3)).point2(1,2)]);
corner{2} = schneide ([lines(ix(1)).point1(1,1);lines(ix(1)).point1(1,2)],...
                    [lines(ix(1)).point2(1,1);lines(ix(1)).point2(1,2)],...
                    [lines(ix(4)).point1(1,1);lines(ix(4)).point1(1,2)],...
                    [lines(ix(4)).point2(1,1);lines(ix(4)).point2(1,2)]);
               
corner{3} = schneide ([lines(ix(2)).point1(1,1);lines(ix(2)).point1(1,2)],...
                    [lines(ix(2)).point2(1,1);lines(ix(2)).point2(1,2)],...
                    [lines(ix(4)).point1(1,1);lines(ix(4)).point1(1,2)],...
                    [lines(ix(4)).point2(1,1);lines(ix(4)).point2(1,2)]);
</source>
[[Datei:Bild_bw_roi_lines_edge.png|400px|Kantenbild der RoI mit Ecken]]
<br />
Die Funktion transformation_Ecken bekommt die Ecken der BoundingBox und die Ecken der verzerrten RoI übergeben. Aus diesen wird die Transformationsmatrix und die inverse Transformationsmatrix berechnet.
Diese Funktion basiert auf dieser Quelle [http://www.mathworks.com/matlabcentral/fileexchange/35531-perspective-control--correction/content/usage_assistedMode.m] aus dem Matlab File Exchange.
Eine genauere Herleitung findet sich in dem Vorlesungsskript der Universität Münster. [ http://cvpr.uni-muenster.de/teaching/ss09/computerVisionSS09/script/CV14-Kalibrierung.pdf]
<source lang="matlab">
               
[T,invT] = transformation_Ecken (corner_Bb,corner); % Umrechnung der gegebenen Ecken in Transformationstrukturen                 
bild_rgb_entzert =imtransform(bild_org,T,'XData',[1 size(bild_org,2)],'YData',[1  size(bild_org,1)]);% Transformation des Bildes
bild_grau_entzert = rgb2gray(bild_rgb_entzert);
bild_bw_entzert = im2bw(bild_grau_entzert,thresh);
</source>
[[Datei:Bild_org_Bild_entzert.png|800px|Bild_org und Bild_rgb_entzerrt]]
=== 5.Schritt: Texterkennung , Übersetzung und Reintegration  ===
<source lang="matlab">
%% Text erkennung im entzerten Bild / Übersetzung und einfügen der Übersetzung ins Bild
text = ocr(bild_rgb_entzert,stats(1).BoundingBox); % Sucht nach Schrift in der ROI
schrift = text.Text;
</source>
[[Datei:Bild_org_entzert_worter.png|400px|Bild mit markierter Schrift]]
<br />
Um die gefunden Wörter zu ersetzen müssen diese verdeckt werden. Jede gefundene Wortboxen wird mit schwarz (0) gefüllt 
<source lang="matlab">
for cnt = 1 : size(text.Words)
    vokabel_englisch = text.Words(cnt,1);
    % Im Wörterbuch nach Vokabel suchen
    vokabel_ind = find(ismember(vokabeln,vokabel_englisch));
    if vokabel_ind > 0
        if vokabel_ind < size(vokabeln,1)
        % Vokabel einfügen wenn im Wörter Buchvorhanden
    vokabel_laenge = size (vokabeln{vokabel_ind,2},2);
    % Länge der Übersetzung bestimmen umGröße der Buchstaben zu berechen
    uebersetzungs_laenge = size (vokabeln{vokabel_ind,2},2);
    % Größe der Buchstaben ind der breite berechen / Höhe übernehmen
    breite_buchstaben = floor(text.WordBoundingBoxes(cnt,3)/uebersetzungs_laenge);
    hoehe_buchstaben= text.WordBoundingBoxes(cnt,4);
    % Bereich der Alten Wörter überdeken
    % im BW Bild
    bild_bw_entzert(text.WordBoundingBoxes(cnt,2):(text.WordBoundingBoxes(cnt,2)+text.WordBoundingBoxes(cnt,4)),...
                    text.WordBoundingBoxes(cnt,1):(text.WordBoundingBoxes(cnt,1)+text.WordBoundingBoxes(cnt,3)))= 0;
     
    bild_grau_entzert =  bild_grau_entzert.* uint8(bild_bw_entzert); 
</source>
[[Datei:Bild_grau_worter_entfernt.png |400px|Bild ohne Schrift]]
<br /> 
Die gefundenen Wörter werden 1 zu 1 in dem Wörterbuch (vokabeln)  nachgeschlagen. Die gefundene Übersetzung wird in der Breite an die  Breite der Wortbox des alten Wortes angepasst.
Diese werden dann in die geschwärzten Bereiche eingefügt.   
<source lang="matlab">
    % Vokabel ins Bild einfügen
        for cnt2 = 1 : vokabel_laenge
           
            bild_buchstabe_ind = find(ismember(buchstabe(:,1),vokabeln{vokabel_ind,2}(cnt2)));
           
            if bild_buchstabe_ind > 0
            % Buchstaben auf Größe anpassen
            buchstabe_uebersetzung = imresize(buchstabe{bild_buchstabe_ind,2},[hoehe_buchstaben breite_buchstaben]);
            % Buchstaben ins Bild integrienen
            bild_bw_entzert(text.WordBoundingBoxes(cnt,2):(text.WordBoundingBoxes(cnt,2)+hoehe_buchstaben)-1,...
                            text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben-breite_buchstaben:(text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben)-1)=buchstabe_uebersetzung;
            % Buchstaben ins Bild integrienen
            bild_grau_entzert(text.WordBoundingBoxes(cnt,2):(text.WordBoundingBoxes(cnt,2)+hoehe_buchstaben)-1,...
                            text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben-breite_buchstaben:(text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben)-1)= 255 * uint8(buchstabe_uebersetzung);
         
            end
        end
        end
    end
 
   
     
end
</source>
[[Datei:Bild_grau_worter_neu.png |400px|Bild mit neuer Schrift]]
=== 6.Schritt:Rücktransformation  ===
<source lang="matlab">
%% Rücktransformation und anpassen des Bildes
bild_grau_verzert =imtransform(bild_grau_entzert,invT,'XData',[1 size(bild_org,2)],'YData',[1  size(bild_org,1)]); % rücktransformation des BW Bildes
</source>
[[Datei:Ausgabe.png |800px|Ausgabe]]


<!--
<!--
== Video ==
Das Video des Funktionsnachweises findet sich auf [http://www.youtube.com/watch?v=UoZdHC8mgA8&feature=share&list=PLoyKJifb3ROe_sKfT3y3paswSyiQ8xqm1&index=9 YouTube].
-->
== Siehe auch ==
== Siehe auch ==
-->
[http://193.175.248.52/usvn/svn/DSB/trunk/SRC/Bilder/Warnschilder| Beispiele für Warnschilder]


== Weblinks ==
== Weblinks ==
[http://youtu.be/h2OfQdYrHRs YouTube: Introducing Word Lens ]
*[http://youtu.be/h2OfQdYrHRs YouTube: Introducing Word Lens ]
*[http://www.mathworks.de/de/help/vision/examples/automatically-detect-and-recognize-text-in-natural-images.html Automatically Detect and Recognize Text in Natural Images - Matlab R2014a]


----
----
→ zurück zum Hauptartikel: [[DSB_SoSe2014| Digitale Signal- und Bildverarbeitung SoSe2014]]
→ zurück zum Hauptartikel: [[DSB_SoSe2014| Digitale Signal- und Bildverarbeitung SoSe2014]]

Aktuelle Version vom 16. Dezember 2014, 09:53 Uhr

Autor: Christoph Wiegand
Betreuer: Prof. Schneider

Motivation

Word Lens ist ein geniales App, welches Schilder in alle Weltsprachen übersetzt.

Ziel

Programmieren Sie eine Schildererkennung und Übersetzung in Deutsch.

Aufgabe

  1. Erkennen Sie die Schrift auf den Schildern
  2. Ersetzen Sie diese Schrift perspektivisch durch eine passende deutsche Beschriftung im Videobild.
  3. Präsentieren Sie Ihr Ergebnis in der Form des Videos von Word Lense.

Lösung

Diese Lösung übersetzt Wörter in Beispielbildern. Diese Bilder zeigen rechteckige Schilder mit Text.

1.Schritt: Einlesen der Daten

Zuerst müssen alle benötigten Daten eingelesen werden. In dem Skrip "buchstaben_einlesen;" werden die Schwarz/Weiß Tamplates geladen. Die Grundlage für die Übersetzung stellt das Cell Array "vokabeln", da der Schwerpunkt der Aufgabe in der Bildverarbeitung besteht, wird eine Wort für Wort Übersetzung angewendet.

%% Bild und Daten einlesen
buchstaben_einlesen;
load ('vokabeln.mat') ;
bild_org = imread('IMAG0460.jpg'); % Einlesen des Bildes

bild_org.png

2.Schritt: Vorbereiten der Daten

Unter der Annahme eines rechteckigen Schildes welches sich gut von der Umgebung abhebt kann das Bild auf ein Kantenbild reduziert werden. Mit Hilfe dieser Reduzierung und der Trennung vom Hintergrund werden die Schild Informationen hervorgehoben.

%% Bilddaten umwandeln Ergebnis = Kanten Bild  
bild_grau = rgb2gray(bild_org); % umwandeln des Bildes in ein Graustufenbild 
bild_grau= imadjust(bild_grau); % Kontrast erhöhen 
thresh = graythresh(bild_grau); % automatische Bestimmung eines Schwellenwertes, um Vorder- und Hintergrund zu unterscheiden 
bild_bw = im2bw(bild_grau,thresh); % Umwandeln des Graustufenbildes in ein b/w-Bild  in Abhängigkeit des vorherbestimmten Schwellenwertes 
bild_bw_canny = edge(bild_bw, 'Canny'); % Kantenbild durch Canny

Kantenbild Canny

3.Schritt: Wichtige Region finden

Alle Regionen im Kantenbild, die von Weiß umgeben sind werden auf Weiß (1) gesetzt.Danach werden zu kleine Regionen gelöscht und das Bild erneut gefüllt. Danach werden die Informationen der noch übrigen Regionen gespeichert.

%% Roi erzeugen / finden  und Bild reduzieren 
bild_bw_roi = imfill(bild_bw_canny,'holes');% Hier werden alle schwarzen Bereiche, die komplett von weißen Bereichen umgeben sind, auf weiß gesetzt und damit zu dem Objekt hinzugefügt 
bild_bw_roi = bwareaopen(bild_bw_roi,6000,4);
bild_bw_roi = imfill(bild_bw_roi,'holes');
bild_grau_roi = bild_grau .* uint8(bild_bw_roi);% Graubild auf ROI reduzieren
stats = regionprops(bild_bw_roi); % weiße Regionen finden

Bild mit ROI

4.Schritt: Entzerrung der RoI

Bei der Entzerrung der Perspektive des Bildes ergab sich folgendes Problem: Die gefunden Bereiche haben abgerundete Ecken. Dadurch ist es nicht möglich die Ecken mit Hilfe der "Corner detection" zu finden. Diese Ecken sind notwendig um die Entzerrung der RoI durchführen zu können. Ansatz: Schnittpunkte der Geraden des Kantenbildes der Roi. Für die Bestimmung der Transformationsmatrix werden 4 Punkte im verzerrten Bild(siehe Ansatz oben) und die zugehörigen 4 Punkte im unverzerrten Bild benötigt. Da diese nicht bekannt und auch die Abmessungen des Schildes nicht gegeben sind, werden diese 4 Punkte als Eckpunkte der umgebenden BoundingBox (vgl.Abb RoI mit BoundingBox) angenommen.


%% Transformation / Entzerung des Bildes 
bild_bw_roi_sobel = edge(bild_bw_roi,'Sobel'); % kanten der RoI 

% Koordinaten der BoundingBox Ecken ergeben die unverzerrte Ecken --> Näherung an die Originalgröße des Schildes da nicht bekannt  
% Oben Links Ecke
corner_Bb{1} = [stats(1).BoundingBox(1,1),stats(1).BoundingBox(1,2)];
% oben Rechts Ecke
corner_Bb{2} = [stats(1).BoundingBox(1,1)+stats(1).BoundingBox(1,3) ,stats(1).BoundingBox(1,2)];
% Unten Rechts Ecke 
corner_Bb{3} = [stats(1).BoundingBox(1,1)+stats(1).BoundingBox(1,3),stats(1).BoundingBox(1,2)+stats(1).BoundingBox(1,4)];
% Unten Links Ecke
corner_Bb{4} = [stats(1).BoundingBox(1,1),stats(1).BoundingBox(1,2)+stats(1).BoundingBox(1,4)];

RoI mit BoundingBox

% Geraden erzeugen um Ecken in der Perspektive zu berechnen 

[H,theta,rho] = hough(bild_bw_roi_sobel); % Hough Transformation 
P = houghpeaks(H,5,'threshold',ceil(0.2*max(H(:)))); % in der Hough Transformation  Maxima finden 
lines = houghlines(bild_bw_roi_sobel,theta,rho,P,'FillGap',150,'MinLength',20); % Linen finden

Kantenbild der RoI mit Linien
Um auszuschließen, dass durch die Hough Transformation Geraden gefunden, werden die die gleiche Linie beschreiben (vgl. Abb. oben), müssen sobald mehr als 4 Geraden erkannt werden, "doppelte" aussortiert werden.

% Parallelen finden doppelte Linien aussortieren

if (size(lines,2)>4)
    for cnt = 1 : size(lines,2)
        lines_diff(cnt) = abs(lines(cnt).rho) - abs(lines(cnt).theta);  % Differenz  erstellen um Gleich gerichtete Linien zu finden 
    end

    for cnt = 1 : size(lines,2)
        for cnt2 = cnt : size(lines,2)
        
            lines_diff_each(cnt2,cnt)=min(abs(lines_diff(cnt)-lines_diff(cnt2))); % Alle Differenzen von einander Abziehen um Ähnlichkeit zu finden 
        
       end
    end
    [lines_diff_row,lines_diff_colum ]= find (lines_diff_each<40&lines_diff_each>0); % Doppelte linen löschen 

    lines(lines_diff_row)=[];
end

for cnt = 1 : size(lines,2)
        lines_theta(cnt) = lines(cnt).theta ; % theta ist der Winkel zur Achse bei ähnlichem winkel sind die Linien Paralle   
end

[b,ix] = sort(lines_theta);% Nach Größe sotieren 

% Ecken berechnen aus den Schnittpunkten

corner{4} = schneide ([lines(ix(2)).point1(1,1);lines(ix(2)).point1(1,2)],...
                     [lines(ix(2)).point2(1,1);lines(ix(2)).point2(1,2)],...
                     [lines(ix(3)).point1(1,1);lines(ix(3)).point1(1,2)],...
                     [lines(ix(3)).point2(1,1);lines(ix(3)).point2(1,2)]);
                 
corner{1} = schneide ([lines(ix(1)).point1(1,1);lines(ix(1)).point1(1,2)],...
                     [lines(ix(1)).point2(1,1);lines(ix(1)).point2(1,2)],...
                     [lines(ix(3)).point1(1,1);lines(ix(3)).point1(1,2)],...
                     [lines(ix(3)).point2(1,1);lines(ix(3)).point2(1,2)]);

corner{2} = schneide ([lines(ix(1)).point1(1,1);lines(ix(1)).point1(1,2)],...
                     [lines(ix(1)).point2(1,1);lines(ix(1)).point2(1,2)],...
                     [lines(ix(4)).point1(1,1);lines(ix(4)).point1(1,2)],...
                     [lines(ix(4)).point2(1,1);lines(ix(4)).point2(1,2)]);
                 
corner{3} = schneide ([lines(ix(2)).point1(1,1);lines(ix(2)).point1(1,2)],...
                     [lines(ix(2)).point2(1,1);lines(ix(2)).point2(1,2)],...
                     [lines(ix(4)).point1(1,1);lines(ix(4)).point1(1,2)],...
                     [lines(ix(4)).point2(1,1);lines(ix(4)).point2(1,2)]);

Kantenbild der RoI mit Ecken

Die Funktion transformation_Ecken bekommt die Ecken der BoundingBox und die Ecken der verzerrten RoI übergeben. Aus diesen wird die Transformationsmatrix und die inverse Transformationsmatrix berechnet. Diese Funktion basiert auf dieser Quelle [1] aus dem Matlab File Exchange. Eine genauere Herleitung findet sich in dem Vorlesungsskript der Universität Münster. [ http://cvpr.uni-muenster.de/teaching/ss09/computerVisionSS09/script/CV14-Kalibrierung.pdf]

                 
[T,invT] = transformation_Ecken (corner_Bb,corner); % Umrechnung der gegebenen Ecken in Transformationstrukturen                  

bild_rgb_entzert =imtransform(bild_org,T,'XData',[1 size(bild_org,2)],'YData',[1  size(bild_org,1)]);% Transformation des Bildes

bild_grau_entzert = rgb2gray(bild_rgb_entzert); 
bild_bw_entzert = im2bw(bild_grau_entzert,thresh);

Bild_org und Bild_rgb_entzerrt

5.Schritt: Texterkennung , Übersetzung und Reintegration

%% Text erkennung im entzerten Bild / Übersetzung und einfügen der Übersetzung ins Bild

text = ocr(bild_rgb_entzert,stats(1).BoundingBox); % Sucht nach Schrift in der ROI 
schrift = text.Text;

Bild mit markierter Schrift

Um die gefunden Wörter zu ersetzen müssen diese verdeckt werden. Jede gefundene Wortboxen wird mit schwarz (0) gefüllt

for cnt = 1 : size(text.Words)
    vokabel_englisch = text.Words(cnt,1);
    % Im Wörterbuch nach Vokabel suchen 
    vokabel_ind = find(ismember(vokabeln,vokabel_englisch));
    if vokabel_ind > 0 
        if vokabel_ind < size(vokabeln,1)
        % Vokabel einfügen wenn im Wörter Buchvorhanden 
    vokabel_laenge = size (vokabeln{vokabel_ind,2},2);
    % Länge der Übersetzung bestimmen umGröße der Buchstaben zu berechen 
    uebersetzungs_laenge = size (vokabeln{vokabel_ind,2},2);
    % Größe der Buchstaben ind der breite berechen / Höhe übernehmen 
    breite_buchstaben = floor(text.WordBoundingBoxes(cnt,3)/uebersetzungs_laenge);
    hoehe_buchstaben= text.WordBoundingBoxes(cnt,4);
    % Bereich der Alten Wörter überdeken 
    % im BW Bild 
    bild_bw_entzert(text.WordBoundingBoxes(cnt,2):(text.WordBoundingBoxes(cnt,2)+text.WordBoundingBoxes(cnt,4)),...
                    text.WordBoundingBoxes(cnt,1):(text.WordBoundingBoxes(cnt,1)+text.WordBoundingBoxes(cnt,3)))= 0;

       
    bild_grau_entzert =  bild_grau_entzert.* uint8(bild_bw_entzert);

Bild ohne Schrift

Die gefundenen Wörter werden 1 zu 1 in dem Wörterbuch (vokabeln) nachgeschlagen. Die gefundene Übersetzung wird in der Breite an die Breite der Wortbox des alten Wortes angepasst. Diese werden dann in die geschwärzten Bereiche eingefügt.

 
    % Vokabel ins Bild einfügen 
         for cnt2 = 1 : vokabel_laenge
             
             bild_buchstabe_ind = find(ismember(buchstabe(:,1),vokabeln{vokabel_ind,2}(cnt2)));
            
             if bild_buchstabe_ind > 0 
             % Buchstaben auf Größe anpassen
             buchstabe_uebersetzung = imresize(buchstabe{bild_buchstabe_ind,2},[hoehe_buchstaben breite_buchstaben]);
             % Buchstaben ins Bild integrienen
            bild_bw_entzert(text.WordBoundingBoxes(cnt,2):(text.WordBoundingBoxes(cnt,2)+hoehe_buchstaben)-1,...
                            text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben-breite_buchstaben:(text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben)-1)=buchstabe_uebersetzung; 
            % Buchstaben ins Bild integrienen
            bild_grau_entzert(text.WordBoundingBoxes(cnt,2):(text.WordBoundingBoxes(cnt,2)+hoehe_buchstaben)-1,...
                            text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben-breite_buchstaben:(text.WordBoundingBoxes(cnt,1)+cnt2*breite_buchstaben)-1)= 255 * uint8(buchstabe_uebersetzung); 
           
             end
 
         end
        end 
    end
   
    
      
end

Bild mit neuer Schrift

6.Schritt:Rücktransformation

%% Rücktransformation und anpassen des Bildes 

bild_grau_verzert =imtransform(bild_grau_entzert,invT,'XData',[1 size(bild_org,2)],'YData',[1  size(bild_org,1)]); % rücktransformation des BW Bildes

Ausgabe


Siehe auch

Beispiele für Warnschilder

Weblinks


→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2014