2016-03-28 14 views
2

Ich stehe vor einem Problem. Ich schreibe ein Skript und wollte diesen Effekt auf ein weißes Bild anwenden.Zeichnen eines schwarzen Rechtecks ​​in einem Bild in MATLAB

enter image description here

Aber jetzt scheint mein Bild so.

enter image description here

Ich bin auf diese stecken i zwei für die Spalten für die Zeilen und die zweite für Schleifen eines schreiben, die nach schwarzen Linien ziehen, um die Bildgröße 800x450 aber, wie ich schwarze Kästen ziehen.

Script:

 clear all; 
     close all; 
     clc; 
     image = rgb2gray(imread('4.jpg')); 
     b = cast(image,'double'); 
     out = 60*((b)./(max(max(b)))); 

     out = out + 195; 

     [r,c,d] = size(out); 

     x = floor(r/80); 

     y = floor(c/160); 

     %x rows 
     for i = 1 : 88 : 450 
      % replaceable line 
      out(i:i+x,:,:) = 0; 

     end 



     %y columns 
     for i = 1 : 88 : 800 
      % replaceable line 
      out(:,i:i+y,:) = 0; 
     end 

     final = cast(out,'uint8'); 

     imshow(final); 

Antwort

0

Sie können uns e dieser Teil des Codes:

image = ones(450,800,3);%create white image 
[row_len,column_len,rgb] = size(image); 
side_vert = floor(row_len/5); 
side_hor = floor(column_len/9); 
color = 1; 
for(i = 1:side_vert:row_len) 
    for(j = 1:side_hor:column_len - side_hor) 
     if(color == 0) 
      image(i:side_vert - 1 + i,j:j + side_hor - 1,:) = 0; 
      color = 1; 
     else 
      color = 0; 
     end; 
    end; 
end; 
imshow(image); 
+0

können wir die Farbe von schwarz nach rot ändern –

+0

ja, natürlich. Ändern Sie einfach die 9te Zeile: image (i: side_vert - 1 + i, j: j + side_hor - 1,2: 3) = 0; – Vlad

+0

Wie'ones (450,800,3) 'Erstellen Sie das weiße Bild können Sie mir in kurzen Worten sagen –

0

Der Trick für ein Schachbrett zeichnen, ist Fälle zu finden, wo die x- und y-Indizes (wenn sie zusammen addiert) entweder gerade oder ungerade sind.

sz = size(img); 
[row, col] = ndgrid(1:sz(1), 1:sz(2)); 
checkers = logical(mod(row + col, 2)); 

Oder einfacher

checkers = bsxfun(@(x,y)mod(x + y, 2), 1:size(img, 1), (1:size(img, 2)).').'; 

Dies wird eine Matrix mit 0 (schwarz) zurückkehren und 1 (weiß) Kontrolleure.

enter image description here

Wenn Sie die Größe der Kontrolleure ändern wollen Sie so etwas tun könnte.

sz = size(img); 
checkersize = 10; 
[row, col] = ndgrid(1:sz(1), 1:sz(2)); 
checkers = logical(mod(ceil(row/checkersize) + ceil(col/checkersize)),2); 

Oder einfach

checkersize = 10; 
checkers = bsxfun(@(x,y)mod(ceil(x/checkersize) + ceil(y/checkersize), 2), 1:size(img, 1), (1:size(img, 2)).').'; 

enter image description here

Wenn Sie tatsächlich diesen Effekt auf ein Bild anwenden möchten, können Sie die checkers Matrizen oben Index in Ihrem Bild verwenden können und die eingestellten Werte similar to this answer

replacementColor = [0 0 0];       % RGB 
reshaped_image = reshape(img, [], 3);    % Flatten first two dims 
C = repmat(replacementColor, [sum(checkers(:)), 1]);% Make color correct size 
reshaped_image(checkers, :) = C;     % Replace color 
newImage = reshape(reshaped_image, size(img));  % Shape it back into original 
+0

was '' img' in Größe (img) ' –

+0

@HarveyClue I' img' anstelle Ihres Variable 'image' verwendet haben seit' image' ist der Name einer eingebauten Funktion und sollte vermieden werden. – Suever

0

können Sie auch die checkerboard Funktion:

k = 30; %// size of each square in the checkerboard 
img = checkerboard(k) < 0.5; 

die Funktion Hälfte des Schachbrett grau macht Aus irgendeinem Grund, so dass Sie < 0.5 (oder > 0.5 verwenden, abhängig von der Reihenfolge, die Sie wollen), um Ihnen nur das Schwarz-Weiß-Bild zu geben.

enter image description here

Verwandte Themen