WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

normxcorr2 macht probleme -.-!

 

alexanderdubinin
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 30.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2014, 18:34     Titel: normxcorr2 macht probleme -.-!
  Antworten mit Zitat      
Hallo liebes Forum,

ich habe ein kleies Problem mit meinem Program. Ich habe ein Template matching programm geschrieben, welches Zahlen in Bildern erkennen "sollte". Jedoch habe ich ein Problem mit der correlation. Ich wüsste gerne was ich falsch mache.

Code:

% main file

close all
clear all








%Das Bild
I = imread('21.jpg');

% die Schablone
I2 = imread('1.bmp');

%Das Bild wird Schwarzweeiß gemacht
IGray = rgb2gray(I);
IGray2 = rgb2gray(I2);
IGray = medfilt2(IGray,[3 3]);
IGray2 = medfilt2(IGray2,[3 3]);
figure(1);
imshow(IGray);
imshow(IGray2);

%Das Bild wird zu einem binären Bild umgewandelt
Ibw = im2bw(IGray,graythresh(IGray));
Ibw2 = im2bw(IGray,graythresh(IGray2));
figure(2);
imshow(Ibw);
imshow(Ibw2);

conc=strel('disk',1);
gi=imdilate(Ibw,conc);
ge=imerode(Ibw,conc);
gdiff=imsubtract(gi,ge);
gdiff=mat2gray(gdiff);
gdiff=conv2(gdiff,[1 1;1 1]);
gdiff=imadjust(gdiff,[0.5 0.7], [0 1],.1);
B=logical(gdiff);

figure(2);
imshow(B);

conc2=strel('disk',1);
gi2=imdilate(Ibw2,conc2);
ge2=imerode(Ibw2,conc2);
gdiff2=imsubtract(gi2,ge2);
gdiff2=mat2gray(gdiff2);
gdiff2=conv2(gdiff2,[1 1;1 1]);
gdiff2=imadjust(gdiff2,[0.5 0.7], [0 1],.1);
B2=logical(gdiff2);

figure(2);
imshow(B2);

er=imerode(B,strel('line', 100,0));
figure(3);
imshow(er);
out1=imsubtract(B,er);
F=imfill(out1,'holes');
H=bwmorph(F,'thin',1);
H=imerode(H,strel('line',3,90));
figure(4);
imshow(H);

er2=imerode(B2,strel('line', 100,0));
figure(3);
imshow(er2);
out12=imsubtract(B2,er2);
F2=imfill(out12,'holes');
H2=bwmorph(F2,'thin',1);
H2=imerode(H2,strel('line',3,90));
figure(4);
imshow(H2);

[Ilabel, num] = bwlabel(H);
disp(num);
Iprops = regionprops(Ilabel, 'BoundingBox','Image');
Ibox = [Iprops.BoundingBox];
Ibox = reshape(Ibox,[4 4]);

[Ilabel, num2] = bwlabel(H2);
disp(num2);
Iprops2 = regionprops(Ilabel, 'BoundingBox','Image');
Ibox2 = [Iprops2.BoundingBox];



hold on;
for cnt = 1:4
rectangle('position',Ibox(:,cnt),'edgecolor','b');
end

figure(5);
imshow(I);

imshowpair(I,I2, 'montage');

c= normxcorr2(I,I2);
figure(6);
surf(c);
shading flat;

[ypeak, xpeak] = find(c==max(c(:)));

yoffSet = ypeak-size(I,1);
xoffSet = xpeak-size(I,2);

hFig = figure;
hAx  = axes;
imshow(I2,'Parent', hAx);
imrect(hAx, [xoffSet, yoffSet, size(I,2), size(I,1)]);
%---
 


das Problem was ich hier bekomme ist

Code:
Error using normxcorr2
Expected input number 1, T, to be two-dimensional.

Error in normxcorr2>ParseInputs (line 239)
validateattributes(T,{'logical','numeric'},{'real','nonsparse','2d','finite'},mfilename,'T',1)

Error in normxcorr2 (line 61)
[T, A] = ParseInputs(varargin{:});

Error in main (line 109)
c= normxcorr2(I,I2);
 


vielleicht habt ihr eine Idee was ich machen kann damit, es funktioniert.

Danke schonmal im vorraus und noch ein angenehmes Wochenende.
lg alex
Private Nachricht senden Benutzer-Profile anzeigen


Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 28.11.2014, 19:43     Titel:
  Antworten mit Zitat      
Moin,

die Fehlermeldung ist doch eindeutig: I und I2 müssen uint8(m*n) sein. Kann deinen Code im Moment nicht prüfen, an welcher Stelle sich dein Datenformat ändert. Aber im workspace findest du die Fehlerstelle.

Grüße - Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
alexanderdubinin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 30.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2014, 21:24     Titel:
  Antworten mit Zitat      
hallo Hubertus,

danke erstmal für die schnelle Antwort. Da ich aber nicht so die Granate bin, was Matlab angeht, wäre es echt ne coole sache, wenn du mir eine genaue beschreibung geben könntest falls du zeit hast, was ich machen kann. Weil mir das doch nicht so sehr einleuchtend ist.
lg alex
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.11.2014, 22:22     Titel:
  Antworten mit Zitat      
Der Aufruf muss denke ich anders herum sein.

Code:

%Das Bild
I = imread('21.jpg');

% die Schablone
I2 = imread('1.bmp');
...
c= normxcorr2(I2,I);

% SIEHE DOKU: C = normxcorr2(template, A) computes the normalized cross-correlation of the matrices template and A. The matrix A must be larger than the matrix template for the normalization to be meaningful. The values of template cannot all be the same. The resulting matrix C contains the correlation coefficients, which can range in value from -1.0 to 1.0.
 


Ansonsten werden nach dem Einlesen I und I2 nicht verändert. Wenn I und I2 nicht das gleiche Datenformat haben, versuch mal ein Typecast.

Code:
I2 = uint8(I2); % Format unsigned integer 8bit -> Werte 0 - 255
I = uint8(I);
c= normxcorr2(I2,I);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
alexanderdubinin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 30.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2014, 22:41     Titel:
  Antworten mit Zitat      
Smile hey,

leider kommt immernoch die selbe Fehlermeldung. Ich habe die Schablone in 42x24pixel und das Bild in normalgröße gehabt. Hab jetzt aus dem Bild mal den Bereich den ich haben will ausgeschnitten. Dachte vielleicht liegt das an der Größe die falsch ist. Das Funktioniert aber leider auch nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.11.2014, 22:54     Titel:
  Antworten mit Zitat      
Dann versuch es mal mit

Code:

c= normxcorr2(IGray2,IGray);  
 


Das Bild muss auf jeden Fall Größer als die Schablone sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.11.2014, 09:40     Titel:
  Antworten mit Zitat      
Ich habe mir das jetzt noch einmal angesehen und verstehe den ganzen Code nicht. Normxcorr2 wird nur auf die Varibalen I und I2 angewendet. Der ganze Code hat auf normxcor2 doch keine Wirkung - oder habe ich was übersehen? Und am Anfang waren es m*n*3 Bilder und dann kommt diese Fehlermeldung.

Wenn die Templategröße nicht stimmt gibt Matlab eine entsprechende Fehlermeldung aus.
Private Nachricht senden Benutzer-Profile anzeigen
 
alexanderdubinin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 30.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2014, 13:11     Titel:
  Antworten mit Zitat      
So Very Happy danke für die ganzen Antworten.#

DSP: Also der Code so funktioniert. Danke jedoch liefer er mir nur einen Graphen mit erhöhten Variablen an den Stellen wo es traffic gibt. Jedoch wollte ich keinen Graphen sondern ein Bild mit einer BoundingBox um das Objekt was ich suche.

Hubertus: Das könnte evtl. das Problem sein, das es meinen code nicht bis zum Ende ausführt. Aber was währe den eine Alternative oder besser gesagt die Lösung für mein Problem?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 29.11.2014, 13:20     Titel:
  Antworten mit Zitat      
alexanderdubinin hat Folgendes geschrieben:

DSP: Also der Code so funktioniert. Danke jedoch liefer er mir nur einen Graphen mit erhöhten Variablen an den Stellen wo es traffic gibt. Jedoch wollte ich keinen Graphen sondern ein Bild mit einer BoundingBox um das Objekt was ich suche.


Das liefert normxcorr2 aber schlicht weg nicht. Diese Funktion zeigt dir Übereinstimmungen von Bild und Template auf und erstellt eine 3D Karte. Du musst nun diese Werte nutzen und dem höchsten Peak in der 3D Karte die Position im Bild zuordnen.

Schau dir die Doku zu dem Befehl normxcorr2...dort ist doch dann erklärt wie das Ergebnis der Funktion zu nutzen ist.

Code:

c = normxcorr2(onion,peppers);

% Find peak in cross-correlation.
[ypeak, xpeak] = find(c==max(c(:)));

% Account for the padding that normxcorr2 adds.
yoffSet = ypeak-size(onion,1);
xoffSet = xpeak-size(onion,2);

% Move data back to CPU for display.
yoffSet = gather(ypeak-size(onion,1));
xoffSet = gather(xpeak-size(onion,2));

% Display matched area.
hFig = figure;
hAx  = axes;
imshow(peppers,'Parent', hAx);
imrect(hAx, [xoffSet, yoffSet, size(onion,2), size(onion,1)]);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.11.2014, 13:38     Titel:
  Antworten mit Zitat      
Ich verstehe nicht, dass nicht einmal hinterfragt wird, was die ganzen Codezeilen bewirken solle. Du hast den Code auch nicht zu Ende geführt, wie du schreibst, sondern nicht einmal angefangen.

Man muss doch zunächst erst einmal nachfragen, was dieser ganze Code bewirken soll und nicht irgendwo in der Mitte hinein Lösungsansätze vorschlagen. Im Code wird außerdem der Datentyp logical erzielt, der später bei normxcorr2 Probleme macht. So ist kein zusammenhängender Faden ersichtlich!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 29.11.2014, 13:55     Titel:
  Antworten mit Zitat      
@Hubertus: Bezieht sich dein Post auf mich?
Private Nachricht senden Benutzer-Profile anzeigen
 
alexanderdubinin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 30.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2014, 14:57     Titel:
  Antworten mit Zitat      
Hey, ja das stimmt, die methode wie mit normxcorr2 so wie ich sie benutze, habe ich in einem tutorial gesehen auf mathworks. Ich habe gedacht das ich das so übernehmen kann, jedoch funktioniert das alles nicht so ganz wie ich mir das vorgestellt habe und da ich komplett neu im Themenbereich "Matlab" bin verstehe ich auch die zusammenhänge noch nicht so gut wie ich es mir wünsche.

Ich habe vor eine Zahl in einem Bild zu suchen und dann eine Bounding box um das best erzielte Ergebnis des matches zu legen. Mir wurde gesagt das es auf jedenfall mit einer correlation funktioniert. So jetzt gibt es aber einen haufen von dennen xD jetzt habe ich versucht random eine zu wählen was mir so auf den ersten Blick logisch vorkam aber das ist es warscheinlich noch nicht ganz, gibt es da einen besseren correlationstypen den ihr mir empfehlen könntet?
Oder ist das schon gut nur ich setze das Ergebnis falsch ein oder sogar noch garnicht? das währen jetzt mal meine Fragen Smile
Danke für die aktive Hilfe von euch
Private Nachricht senden Benutzer-Profile anzeigen
 
alexanderdubinin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 30.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2014, 12:39     Titel:
  Antworten mit Zitat      
Hey Leute, ich hab das jetzt mal soweit "verbessert" und er sollte eigentlich mal endlich eine boundingbox um das objekt was ich suche machen, tut er jedoch nicht. Die frage ist wieso bleibt er immerwieder in der Schleife hängen?

hier ist der neue Code:
Code:

% main file

close all
clear all


% read Template image

%im1=imread('1.bmp');
%im1=imread('S.bmp');
%im1=imread('image1.jpg');


% read Traget Image
%im2=imread('21.jpg');
%im2=imread('image2.jpg');

%---
%Das Bild ansicht
I = imread('21.jpg');
I2 = imread('1,2.jpg');

%Das Bild wird Schwarzweeiß gemacht
IGray = rgb2gray(I);
IGray2 = rgb2gray(I2);
IGray = medfilt2(IGray,[3 3]);
IGray2 = medfilt2(IGray2,[3 3]);
figure(1);
imshow(IGray);
imshow(IGray2);

%Das Bild wird zu einem binären Bild umgewandelt
Ibw = im2bw(IGray,graythresh(IGray));
Ibw2 = im2bw(IGray,graythresh(IGray2));
figure(2);
imshow(Ibw);
imshow(Ibw2);

conc=strel('disk',1);
gi=imdilate(Ibw,conc);
ge=imerode(Ibw,conc);
gdiff=imsubtract(gi,ge);
gdiff=mat2gray(gdiff);
gdiff=conv2(gdiff,[1 1;1 1]);
gdiff=imadjust(gdiff,[0.5 0.7], [0 1],.1);
B=logical(gdiff);
%[a1 b1]=size(B);
figure(2);
imshow(B);

conc2=strel('disk',1);
gi2=imdilate(Ibw2,conc2);
ge2=imerode(Ibw2,conc2);
gdiff2=imsubtract(gi2,ge2);
gdiff2=mat2gray(gdiff2);
gdiff2=conv2(gdiff2,[1 1;1 1]);
gdiff2=imadjust(gdiff2,[0.5 0.7], [0 1],.1);
B2=logical(gdiff2);
%[a1 b1]=size(B);
figure(2);
imshow(B2);

er=imerode(B,strel('line', 100,0));
figure(3);
imshow(er);
out1=imsubtract(B,er);
F=imfill(out1,'holes');
H=bwmorph(F,'thin',1);
H=imerode(H,strel('line',3,90));
figure(4);
imshow(H);

er2=imerode(B2,strel('line', 100,0));
figure(3);
imshow(er2);
out12=imsubtract(B2,er2);
F2=imfill(out12,'holes');
H2=bwmorph(F2,'thin',1);
H2=imerode(H2,strel('line',3,90));
figure(4);
imshow(H2);

[Ilabel, num] = bwlabel(H);
disp(num);
Iprops = regionprops(Ilabel, 'BoundingBox','Image');
Ibox = [Iprops.BoundingBox];
Ibox = reshape(Ibox,[4 4]);

[Ilabel, num2] = bwlabel(H2);
disp(num2);
Iprops2 = regionprops(Ilabel, 'BoundingBox','Image');
Ibox2 = [Iprops2.BoundingBox];
%Ibox2 = imresize(Ibox2,[42 24]);
%Ibox2 = reshape(Ibox2,[4 1]);

%figure(5);
%imshow(I);
hold on;
for cnt = 1:4
rectangle('position',Ibox(:,cnt),'edgecolor','b');
end

figure(5);
imshow(I);

imshowpair(I,I2, 'montage');

%result1= abc(I,I2);
%function result=abc(image1, image2)

%c= normxcorr2(I2,I);
c= normxcorr2(IGray2,IGray);  
figure(6);
surf(c);
shading flat;

[ypeak, xpeak] = find(c==max(c(:)));

yoffSet = ypeak-size(I,1);
xoffSet = xpeak-size(I,2);

hFig = figure;
hAx  = axes;
imshow(I2,'Parent', hAx);
imrect(hAx, [xoffSet, yoffSet, size(I,2), size(I,1)]);
%---

[r1,c1]=size(I);
[r2,c2]=size(I2);

image22= IGray2 - mean(mean(IGray2));

 IGray=double(IGray);
 IGray2=double(IGray2);

corrMat=[];
for i=1:(r1-r2+1)
    for j=1:(c1-c2+1)
        Nimage=IGray(i:i+r2-1,j:j+c2-1);
        Nimage=Nimage-mean(mean(Nimage));  % mean of image part under mask
        corr=sum(sum(Nimage.*image22));
        %corrMat(i,j)=corr;
        corrMat(i,j)=times(corr);
    end
end

result(I,I2,corrMat);

[r1,c1]=size(IGray);
[r2,c2]=size(IGray2);

[r,c]=max(corrMat);
[r3,c3]=max(maxcorrMat);

i=c(c3);
j=c3;
result=IGray;
for x=i:i+r2-1
   for y=j
       result(x,y)=255;
   end
end
for x=i:i+r2-1
   for y=j+c2-1
       result(x,y)=255;
   end
end
for x=i
   for y=j:j+c2-1
       result(x,y)=255;
   end
end
for x=i+r2-1
   for y=j:j+c2-1
       result(x,y)=255;
   end
end
% apply templete matching using power of the image
%result1=tmp(I,I2);
%result1=corr2(I,I2);
%figure,
%subplot(2,2,1),imshow(I);title('Template');
%subplot(2,2,2),imshow(I2);title('Target');
%subplot(2,2,3),imshow(result1);title('Matching Result using tmp');


% apply templete matching using DC components of the image
%result2=tmc(I,I2);
[Ilabel, num3] = bwlabel(c);
disp(num3);
Iprops3 = regionprops(Ilabel, 'BoundingBox','Image');
Ibox3 = [Iprops3.BoundingBox];
Ibox3 = reshape(Ibox3,[1 4]);

figure(8),
subplot(2,2,1),imshow(I);title('Template');
subplot(2,2,2),imshow(I2);title('Target');
subplot(2,2,3),imshow(result);title('Matching Result using tmc');
%result=plotbox(Target,Template,corrMat);
%imshow(I2, result);


und hier die Fehlermeldung:

Code:
Error using  .*
Matrix dimensions must agree.

Error in new (line 142)
        corr=sum(sum(Nimage.*image22));


Ich würd mich um hilfe richtig freuen Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.