对于问题"在MATLAB中围绕数据的椭圆"这个问题,在Amro给出的答案中,他说:
"如果您希望椭圆表示特定的标准偏差水平,那么正确的做法是通过缩放协方差矩阵"
并且缩放它的代码给出为
STD = 2; %# 2 standard deviations
conf = 2*normcdf(STD)-1; %# covers around 95% of population
scale = chi2inv(conf,2); %# inverse chi-squared with dof=#dimensions
Cov = cov(X0) * scale;
[V D] = eig(Cov);
Run Code Online (Sandbox Code Playgroud)
我不明白上面代码片段的前3行.如何计算比例chi2inv(conf,2),以及将它与共变矩阵相乘背后的基本原理是什么?
附加问题:
我还发现如果我使用1.5 STD(即86%的瓷砖)进行缩放,椭圆可以覆盖所有点,我的点集在几乎所有情况下都会聚集在一起.另一方面,如果我使用3个STD(即99%的瓷砖)进行缩放,则椭圆太大.那么我怎样才能选择STD来紧紧覆盖丛生点呢?
这是一个例子:
内椭圆对应于1.5 STD,外对应于2.5 STD.为什么1.5 STD紧紧覆盖了丛生的白点?是否有任何方法或理由来定义它?

我在Matlab中实现标记控制分水岭时遇到了问题.
输入图像是具有两个聚类对象的二进制掩码.另一个图像是另一个二进制图像,其中白色区域表示标记.

然后我尝试使用标记控制的分水岭来分割聚类对象.代码如下:
bw=imread('Im.jpg'); % read image
bwMarker=imread('Marker.jpg');% read marker
bw(bwMarker)=0; % impose the marker on the image
L=watershed(bw);% do the watershed
%% plot
rgb = label2rgb(L,'jet',[.5 .5 .5]);
figure(2), imshow(rgb,'InitialMagnification','fit')
title('Marker Controlled Watershed transform ')
Run Code Online (Sandbox Code Playgroud)
结果显示为此图.

它将对象分成两部分,但形状并不完整.我想得到整个对象,但只是将两条线分开(如下图所示)任何人都可以帮助我吗?谢谢.

附加问题:感谢yoda提供的答案.然而,在这种情况下,使用"cityblock"的距离变换是好的,但如果我们使用"euclidean",它将导致过度分割.因为分水岭将取决于图像中的局部最小值,并且"城市街区"距离变换导致正确的局部最小数量是一致的.如果我们将"cityblock"应用于其他图片,也会导致过度细分.现在让我们看看yoda的代码:
img=im2bw(imread('http://i.stack.imgur.com/qrYCL.jpg'));
imgDist=-bwdist(~img,'cityblock');
imgDist(~img)=-inf;
% check local minimums
BW = imregionalmin(imgDist);
figure(1), imshow(BW);
title('Regional Minima in Original Image');
imgLabel=watershed(imgDist);
Run Code Online (Sandbox Code Playgroud)
局部最小值和结果如下所示:


请注意,在左图中,局部最小值显示为白色区域.据观察,只有两个局部最小值显示在聚类对象中.因此导致了良好的结果.
现在让我们来看看使用'euclidean'的距离变换.
imgDist=-bwdist(~img);
imgDist(~img)=-inf;
% check local minimums
BW = imregionalmin(imgDist);
figure(1), imshow(BW);
title('Regional Minima in Original Image');
imgLabel=watershed(imgDist);
imshow(imgLabel==0,'InitialMagnification','fit')
Run Code Online (Sandbox Code Playgroud)
局部最小值和结果如下所示:


请注意,在左图中,局部最小值显示为白色区域.观察到在聚类对象区域中显示了许多局部最小值.因此,这会导致过分割的结果. …
在Matlab中给出带有对象的二进制掩码.我将找到对象边界的凹度点.这里我所说的凹点是相对于凹陷区域B_1,B_2,B_3中分别与凸包壳弦K_1,K_2和K_3的欧几里德距离的最深凹点.红点表示我想要找到的凹度点,其中在凹陷区域B_1中我绘制垂直于弦K_1的三条线,最深的凹点是中间的,因为它具有最大的长度.

任何人都有有效的方式/代码来做到这一点?谢谢.
下图中的另一个图给出了凸包的示例,其中红点表示有效的凹度点.
