2012-04-15 14 views
2

Ich habe ein Bild mit 3 Farben in Matlab die Wert 0, 128 und 255. zum Beispiel:Überprüfen von Pixeln in Matlab

255 255 255 255 128 255 0 255 255 128 0 255 
255 0 255 255 128 255 255 0 255 128 255 255 
255 0 255 0 128 255 255 255 255 128 255 0  
255 255 0 255 128 255 255 0 255 128 255 255 
255 0 0 255 128 0 255 255 0 128 255 0  

Zuerst möchte ich die Pixel des Index (1,1)-(1,5) überprüfen.

Wenn Pixelwert 0 (schwarz) ist, dann werden die Bildpunkte des Index zu (1,1)(1,5) zu 128 (grau) geändert wird, wenn keine, dann werden die Pixel auf 0 (Weiß) verändert.

Zweitens, ich möchte noch einmal diese Schritte tun, der Index (2,1)-(2,5), (3,1)-(3,5), bis zum Boden überprüft, dann weiter mit dem nächsten, dem Index (1,6)-(1,10), (2,6)-(2,10) bis hin zu der Boden, ging dann auf den Index (1,11) zu (1,end), (2,11) zu (2,end).

Antwort

3

Müssen Sie dies unbedingt der Reihe nach tun? Es hört sich so an, als müssten Sie das für jede Gruppe des Formulars tun (n, (5 * m: 5 * m +1)). Wenn dies der Fall ist, können Sie alle Tests gleichzeitig durchführen, indem Sie die Matrix in eine 3D-Matrix aus Blöcken umwandeln, die 5 Elemente breit sind. Auch ich gehe davon aus, dass du gemeint hast "wenn keine, dann werden die Pixel in 255 (weiß)" geändert, nicht 0.

Angenommen, das Bild myImage aufgerufen wird, dann

numBlocks = numel(myImage)/(5*size(myImage,1)); 
% Generate a 3D matrix each of which is 5 elements long in dimension 2. Note reshape will throw an error if numblocks is fractional 
foo = reshape(myImage,size(myImage,1),5,numBlocks); 
blackTest = any(foo==0,2); 
result = blackTest * 128 + ~blackTest*255; % result for each block 
output = reshape(repmat(result,[1 5 1]),size(myImage)); 

Dies reorganisiert Ihr Bild in eine 3D-Matrix, wobei jeder Submatrix auf jede „Schicht“ der 3D-Matrix 5 entsprechenden Elemente breit ist. Für die gesamte 3d-Matrix wird geprüft, ob eines der Elemente in Dimension 2 Null ist und eine logische Matrix foo der Länge 1 in Dimension 2 übrigbleibt. foo besteht aus logischen Einsen und Nullen, die in MATLAB auch als numerische Einsen und Nullen behandelt werden können . Es multipliziert also foo mit 128 (für den Grauwert) und addiert die logische Inverse foo multipliziert mit 255, um die Weißwerte zu erhalten. Schließlich wiederholt es die Matrix zurück zu Blöcken mit 5 Elementen und stellt sie auf ihre ursprünglichen Dimensionen wieder her.

Bearbeiten: Beachten Sie, dass dieser Code wie im Codekommentar erwähnt nicht funktioniert, wenn das ursprüngliche Bild kein Vielfaches von 5 Pixel breit ist. Um dies zu beheben, müssen Sie einen speziellen Fall erstellen oder eine Schleife verwenden, um durch jeden Block mit 5 Elementen zu gehen. In der Tat das könnte einen besseren Ansatz alle rund sein:

index = 1; 
output = zeros(size(myImage)); 

while index < size(myImage,2) 
blockEnd = min(index+4,size(myImage,2)); 
blackTest = any(myImage(:,index:blockEnd)==0,2); 
blackTest = blackTest(:,ones(1,5)); 
output(1:end,index:blockEnd) = blackTest * 128 + ~blackTest*255; 
index = index+5; 
end 
+0

ich genug rep nicht zur Kommentierung Privilegien haben, also werde ich hier erwähnen, dass zenpoy Antwort ähnlich ist, aber eleganter als meine erste Lösung über. Soweit ich das beurteilen kann, leidet es auch unter der gleichen Mehrfach-5-Beschränkung. –

+0

danke für die hilfe. Ich habe einen Weg gefunden für den Fall ist kein Vielfaches von 5 Pixel breit. Ich füge die Spalte hinzu, um ein Vielfaches von 5 zu sein, dann das Endergebnis nahm ich nur den Anfang der Matrix. – Wahyu

+0

Ja, das funktioniert, aber Sie müssen sicherstellen, dass die hinzugefügten Spalten keine Nullen enthalten oder dass Sie das Ergebnis verfälschen. –

1
% generate matrix 
rand_data = randi(10,10); 
I = zeros(10); 
I(rand_data < 6 & rand_data > 3) = 128; 
I(rand_data >= 6) = 255; 

% here's the code 
I = reshape(I',5,[])'; 
mask = repmat(any(I == 0,2),5,1); 
I(mask) = 128; 
I(~mask) = 255; 
I = reshape(I',10,[])'; 
+0

Danke, dir ist mir wirklich geholfen. – Wahyu

Verwandte Themen