我正在尝试将维基页面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
是
输出导致并发症来自于命令从 EstimateResolutionFromPsfImage
的第29行返回objectProperties
中的0x1结构的事实
objectProperties = regionprops( dilatedImage, ImageData, ...
'Area', 'Centroid', 'PixelList', 'PixelValues', 'MaxIntensity' );
我不明白在这种情况下如何为零。
我的工作区在开始时没问题,但是在传递objecProperties
语句之后,有一个0x1结构,它不应该在那里几乎为空
并最终导致错误
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结构,即导致复杂化。 麻省理工学院的代码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 );
当图像不是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] );
输出要好得多
其中BestFitData = 249.999999999989 249.999999999989 0.00713504020178639 5.31607106546232 -0.000392450463696062
;所以估计西格玛= 5.316,这比dhanushka的第二个例子更糟糕。
您将在Matlab中使用fspecial gaussian
获得容差级别的重大问题,但不会像dhanushka的第二个示例所示那样出现在Octave中。
输入时带有dhanushka代码的火星情况
以imgaussfilt
L2规范在这里还不够。
为什么regionprops的输出在这里是0x1 struct?
答案 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
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
使用psfSize=9
和psfSigma=5
在Matlab 2016a中输出,显示Matlab和Octave中fspecial
之间的显着差异
其中bestFitData = 250.000000000593 250.000000000593 0.0202577533025840 3.07726724108174 -0.000451857701021258
;这里估计西格玛= 3.077。