Image 图像处理

Image 图像处理,image,matlab,Image,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(Im

这组图像如图所示,我使用下面的代码找到了每个图像的质心,现在我将新图像存储在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);
我的挑战是如何使用迭代添加这些图像,因为我有一个很大的图像集(不是jst的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中

您可以使用和迭代图像的名称

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函数将在字符串“Im0”后面添加数字i,因此您将首先获得Im01,然后是Im02,以此类推。。需要eval函数将这些字符串解释为Matlab变量

编辑:我认为避免此类问题的最佳方法是从一开始就将图像保存在单元格中。也就是说,当读取图像时,将它们读入一个单元格

Im{1} = imread('Im01.xxx')
Im{2} = imread('Im02.xxx')
etc...

然后,无需使用字符串即可轻松迭代不同的图像。

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

我在第Im\u name=sprinft('Im0%I',I'行上得到错误;当我尝试第一个选项时,对于第二个选项,matlab无法读取图像,因为它不再是目录中的原始图像,它已被编辑,因此它现在存储为Im01,等等,与Im1 wch不同,可以轻松读取。第一个选项非常完美。第二个不起作用,因为每个图像的CirchShift x和y值不同。[x,y]=ait_形心(Im01);我这样做是为了在添加图像之前验证所有图像的质心值是否相同。非常感谢