/ / Ein Teil eines Bildes wurde entfernt, wenn ein Bild in Teilbilder in MATLAB aufgeteilt wird - matlab, Bildverarbeitung

Ein Teil eines Bildes wird beim Teilen eines Bildes in Unterbilder in MATLAB entfernt - Matlab, Bildverarbeitung

Ich habe ein Bild von 336 * 104 Pixeln und muss es tunTeilen Sie es in 35 * 35 Unterbilder auf. 336 und 104 sind jedoch nicht durch 35 teilbar, daher wird ein Teil des Bildes entfernt, wenn ich es teile. Ich bekomme ein neu zusammengesetztes Bild ohne die Teile, die nicht aus 35 * 35 Pixeln bestehen. Ich kann die Größe nicht ändern, da das Bild sehr unterschiedlich ist.

% Size of the image
[H W] = size(im);

% Each sub image has 35*35 pixels
size_sub_image = 35;

% Size of each sub image
H_divided = H/size_sub_image;
W_divided = W/size_sub_image;

% Reminders allowing to take the images which are not divided
R_H = rem(H,size_sub_image);
R_W = rem(W,size_sub_image);

%Variable which is incremented and stand for each sub image
nbr_sub_images = 1;

% Division of the image into sub images
for i = 1:floor(H_divided)
for j = 1:floor(W_divided)

% R_H and R_W allow to create the sub images reminding, which have not
%35*35 pixels.
%My idea was that when each i or j reach the max in the loop, the
%algorithm take the remindind images which have the size of R_H or R_W.
% R_H = 21 (336 = 35*9+21) and R_W = 34 (104 = 35*2+34)

if (i ~= floor(H_divided) && j ~= floor(W_divided))

nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );

end

if (i == floor(H_divided))

nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );

nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*i+1:size_sub_image*i + R_H,size_sub_image*(j-1)+1:size_sub_image*j);

end

if (j == floor(W_divided))

nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );

nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i,size_sub_image*j+1:size_sub_image*j + R_W);


end

end
end

Wenn ich es ausführe, erhalte ich die Fehlermeldung: "Untertitelte Zuordnung der Zuordnungsdimensionen", aber ich verstehe nicht warum, weil, wenn ich das entferne R_H und R_WDer Code funktioniert einwandfrei.

Antworten:

1 für die Antwort № 1

Soweit ich es verstehe, versuchen Sie, Teilbilder unterschiedlicher Größe in einem 3D-Array zu platzieren, was nicht funktionieren wird. Wenn Sie Ihrem Array 2D-Bilder hinzufügen im_dividedDie erste und die zweite Dimension müssen für alle Teilbilder gleich sein (d. h. 35x35). Weitere Informationen finden Sie im MATLAB-Dokumentation.

Es gibt zwei mögliche Lösungen: Entweder füllen Sie die Bildränder (mit Nullen oder einem anderen Wert) so auf, dass Breite und Höhe durch 35 teilbar sind, oder verwenden Sie ein Zellenarray zum Speichern Ihrer Unterbilder:

im_divided{nbr_sub_images} = im(rows, columns)

Zellenarrays sind in der Lage, Matrizen unterschiedlicher Größe (oder in der Tat alle Arten von verschiedenen Objekten) zu speichern.