2015-04-04 110 views
0

我试图做一个单元格数组中存储的20个PNG图像的逐像素比较。对于每个像素位置(i,j),我想从20个图像中找出具有最大值和最小值的像素。在matlab中比较多个图像

我目前的实现似乎工作,但因为它只是一堆嵌套for循环,它需要几分钟才能完成执行。我正在寻找更有效的方法,有没有人有建议?我目前的代码如下。

min = 256; 
max = -1; 

for j = 1: xMax 
    for k = 1: yMax 
     for p = 1: 20 
      if imageArray{p}(j,k) > max 
       max = imageArray{p}(j,k); 
      end 
      if imageArray{p}(j,k) < min 
       min = imageArray{p}(j,k); 
      end 
     end 
     minImg(j,k) = min; 
     maxImg(j,k) = max; 
     min = 256; 
     max = -1; 
    end 
end 

回答

2

假设所有这些图像的大小是一样的,这里是一个有效的办法 - 由寻找最小/最大的结果

%// Get dimensions of each image 
[nrows,ncols] = size(imageArray{1}) 

%// Convert the cell array to a 3D numeric array for vectorized operations 
im = reshape(cell2mat(imageArray),nrows,ncols,[]) 

%// Use MATLAB builtins min and max along the third dimension for final output 
minImg = min(im,[],3) 
maxImg = max(im,[],3) 
+0

所以minImg/maxImg是NROWS * NCOLS矩阵所有nrows * ncols像素位置的像素值? I.e minImg(1,1)是我们比较的20(1,1)像素中最小的那个?对不起,我是matlab新手,无法弄清楚最后两行的内容。 – Adam 2015-04-04 03:32:58

+0

@Adam准确地说,这就是你在这些矢量化操作中必须要得到的结果。 'maxImg'也一样,即maxImg'中的每个元素将是所有20幅图像中每个像素的最大值。 – Divakar 2015-04-04 03:34:25