为什么这个regionprops返回0x1 struct?

时间:2016-03-13 13:12:14

标签: matlab image-processing struct

我正在尝试将维基页面course中MIT的here 生物仪器和测量的代码从Matlab 7.3转换为Matlab R2016a。 我的输入数据的特征是方形L2范数的标度。 高斯核应该使用平方L2范数,但我看到Matlab和Octave中高斯函数之间存在显着差异,请参阅答案here。 代码是关于估算PSF幻灯片图像的分辨率以及关于函数 EstimateResolutionFromPsfImage 的函数,默认值为matlab 2016a中的[0.7 1.3]

resolutionEstimate = EstimateResolutionFromPsfImage(im2bw(imgRGB), [0.7 1.3]); 

其中imgRGB

enter image description here

输出导致并发症来自于命令从 EstimateResolutionFromPsfImage

的第29行返回objectProperties中的0x1结构的事实
objectProperties = regionprops( dilatedImage, ImageData, ...
    'Area', 'Centroid', 'PixelList', 'PixelValues', 'MaxIntensity' );

我不明白在这种情况下如何为零。 我的工作区在开始时没问题,但是在传递objecProperties语句之后,有一个0x1结构,它不应该在那里几乎为空

enter image description here

并最终导致错误

Index exceeds matrix dimensions.

Error in EstimateResolutionFromPsfImage (line 108)
    Resolution = mean( allPeakData(:,4) ) ./ 0.336;

Error in masi (line 272)
resolutionEstimate = EstimateResolutionFromPsfImage(im2bw(imgRGB), [0.7 1.3]);

可能的原因

  • 输入。 ImageData可能是错的。
  • 更改为regionprops。我认为在regionprops中有一些我不太了解的东西。 命令imagesc(dilatedImage)显示矩阵dilatedImage为空,即矩阵中的每个单元格都为空,如Shai注释。 这证实问题出在objectProperties,因为dilatedImage依赖于objectProperties,即0x1结构,即导致复杂化。
  • 从Matlab 7.3到2016a的转换。我没有在代码中找到任何只对Matlab 7.3唯一的东西。它应该适用于Matlab 2016a,就像Matlab 7.3一样。

基于dhanushka的提示生成的Psf图像

麻省理工学院的代码SimulatePsfSlide似乎在某种程度上有助于生成psfImg。 我正在审查不同参数对结果的影响并确认结果,但是对于过度曝光的图像有一些困难,并且最终会出现像

这样的警告
Warning: Rank deficient, rank = 4, tol =  1.979466e-12. 
> In nlinfit>LMfit (line 579)
  In nlinfit (line 276)
...
Warning: Rank deficient, rank = 1, tol =  1.979466e-12. 
Warning: Some columns of the Jacobian are effectively zero at the solution,
indicating that the model is insensitive to some of its parameters.  That may be
because those parameters are not present in the model, or otherwise do not
affect the predicted values.  It may also be due to numerical underflow in the
model function, which can sometimes be avoided by choosing better initial
parameter values, or by rescaling or recentering.  Parameter estimates may be
unreliable. 

这里有一些导致并发症的行,我不理解为什么16以及为什么用im2double进行转换

simulatedPsfImage = im2double( simulatedPsfImage * 16 );

dhanushka在Matlab 2016a中的代码

当图像不是PSF时,Matlab不能与均匀变化的输入一起工作,就像第一张图像一样。

由于种种原因,不建议使用Dhanushka的过滤器here。 我得到了一个更好的模型,其代码具有更大的容差(甚至1.00)。用一个更好的替换dhanushka的不推荐的过滤器并使用此

im = im2double( imgGray ); % zeros( ImageSize ) );
sigma = 5;
simulatedPsfImage = imgaussfilt(im, sigma); 
simulatedPsfImage = im2double( simulatedPsfImage );
[ measuredResolution, standardError, bestFitData ] = ...
    EstimateResolutionFromPsfImage( simulatedPsfImage, [1.00 1.00] ); 

输出要好得多

enter image description here

其中BestFitData = 249.999999999989 249.999999999989 0.00713504020178639 5.31607106546232 -0.000392450463696062;所以估计西格玛= 5.316,这比dhanushka的第二个例子更糟糕。 您将在Matlab中使用fspecial gaussian获得容差级别的重大问题,但不会像dhanushka的第二个示例所示那样出现在Octave中。

扩展到火星

输入时带有dhanushka代码的火星情况

enter image description here

imgaussfilt

输出

enter image description here

最终结论

L2规范在这里还不够。

为什么regionprops的输出在这里是0x1 struct?

1 个答案:

答案 0 :(得分:3)

据我了解,您的输入图像不是PSF图像。从您提供的link引用,PSF图像 暗背景上的近似点源图像 ,例如星形字段或子图像分辨荧光微球。您可以使用给定代码中的SimulatePsfSlide函数生成此类图像以进行测试。

修改

我没有Matlab。我使用简单的PSF图像在Octave中运行代码,该图像在从下面的代码生成的图像中间具有单个点源。您可以先尝试使用简单的已知图像并检查结果。

在下面的代码中,您可以改变高斯PSF大小和西格玛,并了解nlinfit如何估计西格玛。

过度曝光应该不是问题,这些值会根据链接中的测试代码进行裁剪。

 clear all
 close all

 psfSize = 9;
 psfSigma = 5;

 % single point source in the middle: this is the object
 ImageSize = [500 500];
 im = im2double( zeros( ImageSize ) );
 im( int32(ImageSize(1)/2), int32(ImageSize(2)/2) ) = 1;
 % gaussian psf: this is the psf of our imaging system
 h = fspecial('gaussian', [psfSize psfSize], psfSigma);
 % convolve the object with psf: the image, this is what we see
 simulatedPsfImage = imfilter(im, h, 'same');
 simulatedPsfImage = im2double( simulatedPsfImage );
 % estimating resolution
 [ measuredResolution, standardError, bestFitData ] = ...
        EstimateResolutionFromPsfImage( simulatedPsfImage );

输入数据和nlinfit输出(仅限beta和MSE):请注意,在第二种情况下,MSE较小,表示输入数据与模型非常匹配。我们也得到了正确的西格玛。

psfSize = 9,sigma = 5,估计sigma = 3.0730

beta = 
2.5000e+002
2.5000e+002
2.0275e-002
3.0730e+000
-4.4688e-004

mse =   1.6114e-006

size9

psfSize = 25,sigma = 5,估计sigma = 5.0000

beta = 
2.5000e+002
2.5000e+002
6.5254e-003
5.0000e+000
7.3796e-010

mse =   2.2996e-020

size25

使用psfSize=9psfSigma=5在Matlab 2016a中输出,显示Matlab和Octave中fspecial之间的显着差异

enter image description here

其中bestFitData = 250.000000000593 250.000000000593 0.0202577533025840 3.07726724108174 -0.000451857701021258;这里估计西格玛= 3.077。