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

Spaltenzahl eines bestimmten Wertes in einer Matrize

 

kojoteKarl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2015, 16:50     Titel: Spaltenzahl eines bestimmten Wertes in einer Matrize
  Antworten mit Zitat      
Hallo,

bis jetzt konnte ich mich über die Forensuch gut retten, aber jetzt steh ich vor einem Problem, bei dem ich nicht weiter komme.

Hintergrund ist ein Programm für einen automatisierten Zugversuch. Auf einem Probekörper befinden sich zwei Farbpunkte, über die die Dehnung berechnet werden, soll (hab ich mir zumindest so ausgedacht). Ich lese also als erstes das Video ein und zerlege es dann, in einer Schleife, in einzelne Bilder.


xyloObj = mmreader('MVI_7034 - Kopie.MOV'); %Video wird eingelesen

nFrames = xyloObj.NumberOfFrames; %Anzahl der Bilder im Video
vidHeight = xyloObj.Height; %Höhe des Videos in Pixel
vidWidth = xyloObj.Width; %Breite des Videos in Pixel

for k = 1 : nFrames
B{k} = read( xyloObj, [k] ); %videoframe einlesen

Wenn sich jetzt ein grüner Farbpunkt mit den Wert 250-255 auf dem Körper befindet, würde ich gern wissen, in welchen Spalten sich diese Werte befinden.

Ein Farbbild ist ja im Prinzip eine dreidimensionale Matrix, sprich mxn und das ganze drei mal für die Werte RGB.

Also die Frage: Wie kann ich auf die G-Matrix zugreifen und mir die Zeilen mit den bestimmten Wert ausgeben lassen?


kojoteKarl
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.05.15
Wohnort: Freiberg
Version: R2013
     Beitrag Verfasst am: 23.05.2015, 20:36     Titel:
  Antworten mit Zitat      
Für das Durchsuchen habe ich jetzt erst mal folgende Lösung.

Code:
clear all
A = [1 255 253 255 5 6; 7 8 2 1 2 3; 1 2 3 2 5 6; 7 8 9 1 2 3];
b = size(A);
c = b(1,2)
d = b(1,1)
f = 0
s = 0
for n = 1 : c;
    for m = 1 : d;
        Wert=A(m,n);
        if Wert >= 250;
            f = f + 1
        end
    end
end
f
M = zeros(1,f)
for n = 1 : c;
    for m = 1 : d;
        Wert=A(m,n);
        if Wert >= 250;
            s = s + 1
            M(1,s)= n
        end
    end
end


Somit ist meine neue 0-Matrix mit meinen Zeilennummern gefüllt die die Werte > 250 beinhalten.
Vielleicht hat aber jemand eine elegantere Lösung.

Jetzt hätte ich nur noch das Problem auf die Matrixebene zu zugreifen?

Jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
kojoteKarl
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.05.15
Wohnort: Freiberg
Version: R2013
     Beitrag Verfasst am: 24.05.2015, 09:27     Titel:
  Antworten mit Zitat      
Also versucht habe ich auch die find funktion, aber die spukt nichts aus.

Code:
clear all;
close all;


xyloObj = VideoReader('MVI_7034 - Kopie.MOV'); %Video wird eingelesen

nFrames = xyloObj.NumberOfFrames;   %Anzahl der Bilder im Video (Frames)
nFrames
vidHeight = xyloObj.Height;         %Höhe des Videos in Pixel
vidHeight
vidWidth = xyloObj.Width;           %Breite des Videos in Pixel
vidWidth
T = xyloObj.Duration;
T


 for k = 1 : 2   %nFrames
     B{k} = read( xyloObj, [k] ); %videoframe einlesen
     [row col]=find(B{k}(:,:,2)>=250);
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.05.2015, 17:24     Titel:
  Antworten mit Zitat      
hallo
clear all ist mist. warum wurde schon oft genug erklärt. Wink
Zitat:

Ein Farbbild ist ja im Prinzip eine dreidimensionale Matrix, sprich mxn und das ganze drei mal für die Werte RGB.

Also die Frage: Wie kann ich auf die G-Matrix zugreifen und mir die Zeilen mit den bestimmten Wert ausgeben lassen?

meinst du sowas?
Code:
A = imread('ngc6543a.jpg');
isx=find(any(A(:,:,2)>=250,1))

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
kojoteKarl
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.05.15
Wohnort: Freiberg
Version: R2013
     Beitrag Verfasst am: 24.05.2015, 19:55     Titel:
  Antworten mit Zitat      
mmmmmhhhhhh danke, das sieht schon so aus, wie ich mir das vorgestellt habe. Bis jetzt habe ich den Code geschrieben, aber irgendwas stimmt nicht. Ich möchte die Länge eines blauen Streifens in einem Bild ermitteln mit folgenden Code. Die Anzahl der Pixel sind aber viel zu groß (soll=ca 230 ist=338). Wenn man sich die einzelnen Matrizen für r, g, b anschaut, fällt, auf das bei z.b. Blau in jeder Spalte ein wert zwischen 120-130 vorkommen soll. Oder beschreiben die zahlen etwas anderes? Video liegt hier https://www.dropbox.com/s/fwv6x60ch8shznq/CAM00241.mp4?dl=0
Code:
xyloObj = VideoReader('CAM00241.mp4'); %Video wird eingelesen

nFrames = xyloObj.NumberOfFrames;   %Anzahl der Bilder im Video (Frames)
nFrames
vidHeight = xyloObj.Height;         %Höhe des Videos in Pixel
vidHeight
vidWidth = xyloObj.Width;           %Breite des Videos in Pixel

vidWidth
T = xyloObj.Duration;
T
B = read( xyloObj, [1] ); %videoframe einlesen
RV=find(any(B(:,:,3) >= 40 & B(:,:,3) <= 50   ,1))
GV=find(any(B(:,:,2) >= 65 & B(:,:,2) <= 75   ,1))
BV=find(any(B(:,:,2) >= 120 & B(:,:,2) <= 130   ,1))
BV
StreifenM = 0
for n = 1 : length(RV)
    for nn = 1 : length(GV)
        if RV(n) == GV(nn)
            for nnn = 1 : length(BV)
                if RV(n)== BV(nnn)
                    StreifenM = StreifenM + 1
                   
                end
            end
        end
    end
end
Bs = 0
BM = zeros(1,StreifenM)

for n = 1 : length(RV)
    for nn = 1 : length(GV)
        if RV(n) == GV(nn)
            for nnn = 1 : length(BV)
                if RV(n)== BV(nnn)
                    Bs = Bs + 1
                    BM(1,Bs)= RV(n)
                end
            end
        end
    end
end

Streifen = max(BM)- min(BM) %entspricht 5 cm in Pixeln

 
Private Nachricht senden Benutzer-Profile anzeigen
 
kojoteKarl
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.05.15
Wohnort: Freiberg
Version: R2013
     Beitrag Verfasst am: 25.05.2015, 14:06     Titel:
  Antworten mit Zitat      
Alles cool es ist genau das was ich gesucht habe.
Danke ich hatte nur die Intervalle falsch gesetzt.
Eine letzte Frage noch. Die Zahlen der Matrixebene also 1, 2, 3 ist da die Zuordnung 1=r, 2=g und 3=b?

Vielen Dank

MfG
kojo
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.