2016-06-09 59 views
0

我有以下代码将一个目录下的多个图像导入Matlab中的一个结构,下面是一个图像的例子。在Matlab中填充多个图像

enter image description here

myPath= 'E:\conduit_stl(smooth contour)\Collagen Contour Slices\'; %' 
fileNames = dir(fullfile(myPath, '*.tif')); 
C = cell(length(fileNames), 1); 

for k = 1:length(fileNames) 
    filename = fileNames(k).name; 
    C{k} = imread(filename); 
    se = strel('disk', 2, 0); 
    C = imclose(C, se); 
    filled = imfill(C,'holes'); 
end 

虽然现在我想对所有图像进行填充,后来找到了重心。然而,当试图这样做时,出现一个错误:“预期的输入数字1,I1或BW1是这些类型之一:double,... etc”我尝试将图像转换为双精度,但这只是导致:“从细胞转换为双倍是不可能的。“

这很可能是由于结构类型,图像被“安置”在里面,但我不知道这一点。

对此的帮助将不胜感激。

+0

'C'不是结构,而是一个单元阵列(如你初始化它)。将图像存储在“常规”数组中会更有效。另外,由于您对所有图像使用相同的结构元素,因此可以将其从循环中取出并仅定义一次。 –

+0

你是否也想把大括号改为正方括号?如果我这样做,我得到这个错误:“从uint8转换到单元格是不可能的。” – Idrawthings

回答

0

因此阐述我先前的评论,这里有几件事情与您的代码更改:

C不是结构,而是一个单元阵列。单元格数组的内容使用{大括号}进行访问。如果所有图像的大小相同,则将其存储到数字数组而非单元格数组中效率更高。因为他们似乎是合乎逻辑的图片,你的阵列有3个维度:

[height, width, numberofimages] 

因此,您可以用启动代码:

myPath= 'E:\conduit_stl(smooth contour)\Collagen Contour Slices\'; %' 
fileNames = dir(fullfile(myPath, '*.tif')); 

%// if your images are of type uint8 
C(height,width,length(fileNames)) = uint8(0); 
C_filled = C; %// initialize new array to stored filled images 

而且,因为你正在使用您的形态相同的结构元素对所有图像进行操作,您可以在循环外部定义一次。

所以,你的代码看起来是这样的:

se = strel('disk', 2, 0); 
for k = 1:length(fileNames) 

    C(:,:,k) = imread(fileNames(k).name);  
    C_filled(:,:,k) = imfill(imclose(C(:,:,k), se),'holes'); 

end 
+0

当我设置我的数组维度时,我得到此错误:错误:不平衡或意外的括号或括号。 for“C(256,256,3270(fileNames))= uint8(0);” – Idrawthings

+0

为什么3270?你可以留下'length(fileNames)'。也只是为了确保你的图像是灰度uint8的权利? –

+0

啊,这可能是问题所在。他们是二元的,我想这就是为什么我“从uint8转换到单元格是不可能的。” – Idrawthings