2016-04-12 9 views
0

Ich habe 3 480 Zeilen x 640 Spaltenbilder. Jedes Pixel enthält einen Intensitätswert.Kombinieren Matlab Zelle Elemente zu einem einzigen Vektor

I lese sie in Matlab mit diesem:

object_intensities = cell(1,6); 
    for pat=1:3 
     file1 = sprintf('image%d.pgm',pat-1); 
     dummy = double(imread(file1)); 
     object_intensities{pat} = dummy; 
    end 

Nun zu pat = 1 bis 3, object_intensities eine Zellenanordnung derart ist, dass jede Zelle Element object_intensities {pat} jedes Bild in einer 480x640-Matrix Array enthält .

Nun, was ich brauche, ist eine einzige Struktur, die 480 Zeilen x 640 Säule so ist, dass jede Zelle Element die drei Intensitäten jedes Bildpixel in einem einzigen Vektor wie folgt enthält:

structure{row 1, column 1} = [image1_intensity @ row1 column1 image2_intensity @ row1 column1 image3_intensity @ row1 column1] 
structure{row 1, column2} = [image1_intensity @ row1 column2 image2_intensity @ row1 column2 image3_intensity @ row1 column2] 
. 
. 
structure{row 480, column 640} = [image1_intensity @ row480 column640 image2_intensity @ row480 column640 image3_intensity @ row480 column640] 

Jede Art und Weise zu tun, dies ohne Schleifen, sondern durch Vektorisierung?

+0

Sind die drei Bilder Intensitäten für RGB-Kanäle? Oder hält jede Zelle von "object_intenities" tatsächlich eine * 480 * by-* 640 * by * 3 * Matrix? Wenn es tatsächlich ein Single-Channel-Bild enthält (was ich bezweifle, dass du 'imread' verwendest, musst du es vielleicht zuerst in Graustufen konvertieren), dann versuche 'cat (3, object_intensities {:}) 'und du wirst es bekommen eine nette * 480 * -By- * 640 * -By * 3 * -Matrix. Aber dann denke ich, dass du das einfach getan haben könntest, wenn du die Bilder liest, im Grunde, warum willst du die Datenstruktur, die du sagst, die du willst? Es wird sehr schwierig sein, mit einer normalen Matrix zu arbeiten. – Dan

+0

Die Bilder sind bereits Graustufen. Ich möchte es in dieser Datenstruktur beschrieben, da ich die Intensitätsabfolge jedes Bildpixels benötige. – user1431515

+0

Eine 3D-Matrix wird immer noch besser sein, mit Zellenarrays ist es viel schwieriger zu arbeiten. Außerdem bin ich mir ziemlich sicher, dass "imread" Ihr Bild standardmäßig RGB macht, unabhängig davon, ob es Graustufen ist oder nicht. Sie müssen die Konvertierung dennoch durchführen. – Dan

Antwort

1

Die Datenstruktur, die Sie wollen, fragt nach Ärger. Verwenden Sie stattdessen eine 3D-Matrix, in der die dritte Dimension Ihre Intensitäten (in der Reihenfolge) abbildet. Es wird viel einfacher sein, mit der ganzen Linie zu arbeiten.

Ich schlage vor, Sie es wie folgt erstellen:

object_intensities = zeros(480,640,3); 
for pat=1:3 
    file1 = sprintf('image%d.pgm',pat-1); 
    object_intensities(:,:,pat) = rgb2gray(imread(file1)); 
end 

Jetzt hätte, was object_intensities{i,j} auf Ihrer Struktur gewesen ist nur object_intensities(i,j,:) und wenn Sie wirklich benötigen Sie squeeze oder permute oder (:)' nennen kann es sich um eine Reihe zu machen Vektor. Aber denken Sie nur, wie viel einfacher es jetzt so etwas wie das Finden der durchschnittlichen Intensität pro Pixel zu tun ist,

mean(object_intensities,3) 

verglichen mit dem Zellenfeld

cellfun(@mean,object_intensities,'uni',0) %// Just a loop in disguise 

Und was ist, wenn Sie die durchschnittliche pro Zeile

wollte
mean(object_intensities,2) 

Versuchen Sie dies für das Zellenfeld und Sie werden sehen, warum Sie es vermeiden wollen.

Aber wenn Sie wirklich wollen, um Ihre Struktur wirklich, dann meinen Code wie oben verwenden und mat2cell auf der 3D-Matrix nennen:

mat2cell(object_intensities, ones(size(object_intensities,1),1), ones(1,size(object_intensities,2)),3) 
+0

Ich schätze die Antwort, aber ich werde keine gemeine oder andere Operation finden. In dem Legacy-Code, mit dem ich es zu tun habe, wäre die Datenstruktur, die in meinem ursprünglichen Post gewünscht wird, am besten dafür. – user1431515

+0

@ user1431515 Ich bezweifle das noch.Aber benutze meinen Code oben zusammen mit ['mat2cell'] (http://www.mathworks.com/help/matlab/ref/mat2cell.html), um zu deiner gewünschten Struktur zu gelangen. Offensichtlich war der "Mittelwert" nur anschaulich, er würde für fast alles gelten, was Sie mit diesen Daten machen wollen. – Dan

+0

Nehmen wir an, ich verwende Zeile 250 der 480x640x3-Matrix. Ist eine 3x640-Matrix, die die Zeile 250 meiner Bildsequenz darstellt, möglich? – user1431515