我正在做一些骨骼分割,而这个分割的结果是在这个骨骼周围放置一个圆形图案的点然而,由于它是使用qCT扫描,有相当多的噪音(例如,从肉)上的点,我有所以总的问题是如何去除这些噪音。
我现在要做的是把它转换成极坐标,这样我就可以得到从骨骼中心到点的距离,这取决于角度。
[THETA,RHO] = car2pol(N(1,:),N(2,:),center);
[THETA, id] = unique(THETA);
一旦我有了这些数据,我做了一个高阶(30)多项式回归,它很好地去除了噪声,并产生了一个很好的平滑曲线。
[p,~,mu] = polyfit(THETA,RHO,30);
RHO = polyval(p,THETA,[],mu);
在我把它转换回笛卡尔坐标之后:
[x,y] = pol2car(THETA,RHO,center);
我这里唯一的问题是,回归后的起点和终点不一定是同一点,它们应该是同一点所以我的问题是,你能做一种约束多项式回归吗,在这里我能强制第一个点的y值和另一个端点的y值有相同的值或者还有别的办法吗?
最佳答案
我推荐傅里叶回归,而不是多项式回归,即。
rho = a0 + a1 * cos(theta) + a2 * cos(2*theta) + a3 * cos(3*theta) + ...
b1 * sin(theta) + b2 * sin(2*theta) + b3 * sin(3*theta) + ...
例如,给出以下几点
>> plot(x, y, '.')
可以转换为极坐标
>> [theta, r] = cart2pol(x, y);
创建一个正弦和余弦数组
>> X = ones(size(theta, 1), 1);
>> for n = 1:N
X(:, end+1) = cos(n * theta);
X(:, end+1) = sin(n * theta);
end
并进行标准线性回归
>> b = regress(r, X);
然后你可以得到预测并转换回笛卡尔坐标来绘制它
>> rhat = X * b;
>> [xhat,yhat] = pol2cart(theta, rhat);
它给予
>> plot(x, y, '.');
>> hold on;
>> plot(xhat, yhat, 'r', 'LineWidth', 2)