#image #matlab
#изображение #matlab
Вопрос:
У меня есть этот набор изображений, как показано, я нашел центроид каждого, используя приведенный ниже код, теперь я сохранил новые изображения в Im01, Im02, Im03, и все они представляют собой изображения матрицы N на N.
Im1 = imread('image1.png');
[x,y] = ait_centroid(Im1);
Im01=circshift(Im1, [-1 -5]);
[x,y] = ait_centroid(Im01);
Im01=uint16(Im01);
Im2 = imread('image2.png');
[x,y] = ait_centroid(Im2);
Im02=circshift(Im2, [-2 -4]);
[x,y] = ait_centroid(Im02);
Im02=uint16(Im02);
Im3 = imread('image3.png');
[x,y] = ait_centroid(Im3);
Im03=circshift(Im3, [-3 -5]);
[x,y] = ait_centroid(Im03);
Im03=uint16(Im03);
моя задача заключается в том, как добавить эти изображения с помощью итерации, потому что у меня есть большой набор изображений (не только 3 изображения), над которыми я работаю.Я смог добавить их вручную и показать, что это значит
G=imadd(Im01,Im02,'uint16');
G=imadd(G,Im03,'uint16');
imshow(uint8(G/3),[]);
и это сработало.Но когда я попытался выполнить итерацию, выполнив это
G=imadd(Im01,Im02,'uint16');
for i=1:1:3
G=imadd(G,Im(i),'uint16');
end
Я получаю ошибку, я также устал определять изображения как матрицу матрицы с помощью
H = [ [Im01] [Im02] [Im03] ]
G=imadd(Im01,Im02,'uint16');
for i=1:1:3
G=imadd(G,H(i),'uint16');
end
ошибка указана в H (i).
Код находится в Matlab
Ответ №1:
H = [ [Im01] [Im02] [Im03] ]
не создает массив матриц в Matlab. Вместо этого он объединяет три изображения в единый массив. Что вы хотите сделать, это создать массив ячеек, т. Е. будет работать следующее:
%# curly brackets to construct cell array
H = {Im01, Im02, Im03 };
G=H{1}; %# initialize G
for i=2:1:3 %# start at img#2
G=imadd(G,H{i},'uint16');
end
В качестве альтернативы, если все, что вы хотите сделать с изображениями, это добавить их, вы можете сделать следующее:
%# in case you want to store the images
images = cell(numberOfImages,1);
%# loop over all images
for iImg = 1:numberOfImages
tmp = imread(sprintf('image%i.png',iImg));
[x,y] = ait_centroid(tmp);
Im01=circshift(tmp, [x y]); %# I assume that's what you want?
[x,y] = ait_centroid(Im01); %# not sure what you do this for
if iImg ==1
G = uint16(tmp);
else
G = imadd(G,uint16(tmp));
end
%# maybe you want to store your images
images{iImg} = uint16(tmp);
end
Комментарии:
1. Первый вариант просто идеален. Второе не сработало, потому что значения circshift x и y для каждого изображения различаются. [x, y] = ait_centroid (Im01); Я сделал это, чтобы убедиться, что центр тяжести имеет одинаковое значение для всех изображений, прежде чем добавлять их. Большое спасибо
Ответ №2:
Вы можете использовать sprintf и eval для перебора названий ваших изображений.
G=imadd(Im01,Im02,'uint16');
for i=1:1:3
Im_name = sprinft('Im0%i',i);
G=imadd(G,eval(Im_name),'uint16');
end
Функция sprintf добавит число i за строкой ‘Im0’, так что сначала вы получите Im01, затем Im02 и т.д.. Функция eval необходима для интерпретации этих строк в переменные Matlab.
РЕДАКТИРОВАТЬ: Я думаю, что лучший способ избежать подобных проблем — сохранить ваши изображения в ячейке с самого начала. То есть при чтении изображений считывайте их в одну ячейку
Im{1} = imread('Im01.xxx')
Im{2} = imread('Im02.xxx')
etc...
затем вы можете легко перебирать различные изображения без использования строк.
Комментарии:
1. Я получаю сообщение об ошибке в строке Im_name = sprinft (‘Im0%i’, i); когда я попробовал первый вариант и для второго варианта, matlab не может прочитать изображение, потому что оно больше не является исходным изображением в каталоге, оно было отредактировано, поэтому теперь оно хранится как Im01 и т.д. В отличие от Im1, Которое можно легко прочитать.