Это выглядит, как вы пытаетесь построить масштабирование пространства и отображения результатов пользователю. Это не проблема. Имейте в виду, что вам придется делать это с помощью циклов for
, так как я не вижу, как вы сможете это сделать, если не скопируете и не вставьте несколько строк кода. На самом деле, я собираюсь использовать цикл while
, и я скажу вам, почему скоро.
В любом случае вам нужно объявить выходное изображение с таким количеством строк, как исходное изображение, но столбцы будут 1.5
раз оригинальное изображение для размещения изображений справа.
Во-первых, напишите код, который помещает исходное изображение с левой стороны, и версию, которая вдвое меньше размера справа. Как только вы это сделаете, вы пишете цикл for
, используйте индексирование, чтобы поместить изображения в правильные места, пока не закончите масштаб, и вам нужно отслеживать, где начинается следующее изображение и заканчивается следующее изображение. Имейте в виду, что происхождение того, где записывать следующие изображения после первого подвыборки, начинается с местоположения столбца исходного изображения, а строка справа, где заканчивается предыдущий. В качестве примера воспользуемся изображением cameraman.tif
, которое равно 256 x 256
, но я напишу код так, чтобы он соответствовал любому разрешению изображения. Когда я подзапрос изображения, я буду использовать imresize
в MATLAB, чтобы помочь с изменением размера изображения, и я укажу коэффициент выборки 0.5
, чтобы обозначить подвыборку на 2. Причина, по которой я бы использовал цикл while
, потому что мы можем продолжать циклизацию и изменение размера до. Один из размеров измененного размера - 1
. Когда это так, больше нет масштабов для обработки, и поэтому мы можем выйти.
Как таковой:
%// Read in image and get dimensions
im = imread('cameraman.tif');
[rows,cols] = size(im);
%// Declare output image
out = zeros(rows, round(1.5*cols), 'uint8');
out(:,1:cols) = im; %// Place original image to the left
%// Find first subsampled image, then place in output image
im_resize = imresize(im, 0.5, 'bilinear');
[rows_resize, cols_resize] = size(im_resize);
out(1:rows_resize,cols+1:cols+cols_resize) = im_resize;
%// Keep track of the next row we need to write at
rows_counter = rows_resize + 1;
%// For the rest of the scales...
while (true)
%// Resize the image
im_resize = imresize(im_resize, 0.5, 'bilinear');
%// Get the dimensions
[rows_resize, cols_resize] = size(im_resize);
%// Write to the output
out(rows_counter:rows_counter+rows_resize-1, cols+1:cols+cols_resize) = ...
im_resize;
%// Move row counter over for writing the next image
rows_counter = rows_counter + rows_resize;
%// If either dimension gives us 1, there are no more scales
%// to process, so exit.
if rows_resize == 1 || cols_resize == 1
break;
end
end
%// Show the image
figure;
imshow(out);
Это изображение я получаю:
Я получаю черное изображение на выходе. Более того, все масштабированные изображения присутствуют в массиве L {}. Я добавил ваш код с моим в вышеупомянутом сообщении. Не могли бы вы рассказать об этом? – nikhilk
@nikhilk - Ваш код работает. Но причина, по которой вы получаете полностью черный цвет, - это то, что ваши изображения «двойные» и нормализованы между «[0,1]». Я предположил, что ваши изображения были 'uint8', и поэтому ожидаемый диапазон находится между' [0,255] '. Если вы сделаете вывод 'uint8', и если ваши интенсивности находятся между' [0,1] ', то вы ничего не увидите! Таким образом, вместо этого вместо этого измените выражение 'out':' out = zeros (rows, round (1.5 * cols)); '. – rayryeng
Ой, понял. Спасибо :) – nikhilk