обработка изображений

#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, Которое можно легко прочитать.