- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个如图 1 所示的图像。 我试图用一个带帽的矩形(图 2) 来拟合这个二值图像弄清楚:
最佳答案
我解决了这两种不同的方法,并在下面对每种方法都有注释。每种方法的复杂性各不相同,因此您需要为您的应用程序决定最佳交易。
第一种方法:最小二乘优化:
这里我通过 Matlab 的 fminunc() 函数使用了无约束优化。查看 Matlab 的帮助以查看您可以在优化之前设置的选项。我做了一些相当简单的选择,只是为了让这种方法适合你。
总之,我设置了一个带帽矩形的模型,作为参数 L、W 和 theta 的函数。如果您愿意,您可以包含 R,但我个人认为您不需要它;通过检查每个边缘的半圆的连续性,我认为通过检查模型几何形状,让 R = W 可能就足够了。这也将优化参数的数量减少了一个。
我使用 bool 图层制作了一个带帽矩形的模型,请参阅下面的 chedRectangle() 函数。因此,我需要一个函数来计算模型关于 L、W 和 theta 的有限差分梯度。如果您不向 fminunc() 提供这些梯度,它将尝试估计这些梯度,但我发现 Matlab 的估计不适用于此应用程序,因此我提供了自己的作为 fminunc 调用的误差函数的一部分() (见下文)。
我最初没有你的数据,所以我只是右键点击你上面的图片并下载:'aRIhm.png'
为了读取您的数据,我这样做了(创建了变量 cdata
):
image = importdata('aRIhm.png');
vars = fieldnames(image);
for i = 1:length(vars)
assignin('base', vars{i}, image.(vars{i}));
end
data = im2double(cdata);
data = data / max(data(:));
figure(1); imshow(data); % looks the same as your image above
nY = size(data,1);
nX = size(data,2);
L = 25;
W = L;
theta = 90;
params0 = [L W theta];
capRect0 = reshape(cappedRectangle(params0,nX,nY),nX,nY);
figure(2); imshow(capRect0);
f = @(x)errorFunc(x,data);
% Define several optimization parameters for fminunc():
options = optimoptions(@fminunc,'GradObj','on','TolX',1e-3, 'Display','iter');
% Call the optimizer:
tic
[x,fval,exitflag,output] = fminunc(f,params0,options);
time = toc;
disp(['convergence time (sec) = ',num2str(time)]);
% Results:
disp(['L0 = ',num2str(L),'; ', 'L estimate = ', num2str(x(1))]);
disp(['W0 = ',num2str(W),'; ', 'W estimate = ', num2str(x(2))]);
disp(['theta0 = ',num2str(theta),'; ', 'theta estimate = ', num2str(x(3))]);
capRectEstimate = reshape(cappedRectangle(x,nX,nY),nX,nY);
figure(3); imshow(capRectEstimate);
Iteration f(x) step optimality CG-iterations
0 0.911579 0.00465
1 0.860624 10 0.00457 1
2 0.767783 20 0.00408 1
3 0.614608 40 0.00185 1
.... and so on ...
15 0.532118 0.00488281 0.000962 0
16 0.532118 0.0012207 0.000962 0
17 0.532118 0.000305176 0.000962 0
Convergence time (sec) = 16.1053
L0 = 25; L estimate = 58.5773
W0 = 25; W estimate = 104.0663
theta0 = 90; theta estimate = 36.9024
function result = cappedRectangle(params, nX, nY)
[x,y] = meshgrid(-(nX-1)/2:(nX-1)/2,-(nY-1)/2:(nY-1)/2);
L = params(1);
W = params(2);
theta = params(3); % units are degrees
R = W;
% Define r1 and r2 for the displaced rounded edges:
x1 = x - L;
x2 = x + L;
r1 = sqrt(x1.^2+y.^2);
r2 = sqrt(x2.^2+y.^2);
% Capped Rectangle prior to rotation (theta = 0):
temp = double( (abs(x) <= L) & (abs(y) <= W) | (r1 <= R) | (r2 <= R) );
cappedRectangleRotated = im2double(imrotate(mat2gray(temp), theta, 'bilinear', 'crop'));
result = cappedRectangleRotated(:);
return
function [error, df_dx] = errorFunc(params,data)
nY = size(data,1);
nX = size(data,2);
% Anonymous function for the model:
model = @(params)cappedRectangle(params,nX,nY);
% Least-squares error (analogous to chi^2 in the literature):
f = @(x)sum( (data(:) - model(x) ).^2 ) / sum(data(:).^2);
% Scalar error:
error = f(params);
[df_dx] = finiteDiffGrad(f,params);
return
function [df_dx] = finiteDiffGrad(fun,x)
N = length(x);
x = reshape(x,N,1);
% Pick a small delta, dx should be experimented with:
dx = norm(x(:))/10;
% define an array of dx values;
h_array = dx*eye(N);
df_dx = zeros(size(x));
f = @(x) feval(fun,x);
% Finite Diff Approx (use "centered difference" error is O(h^2);)
for j = 1:N
hj = h_array(j,:)';
df_dx(j) = ( f(x+hj) - f(x-hj) )/(2*dx);
end
return
data = im2double(cdata);
data = round(data / max(data(:)));
s = regionprops(data, 'Orientation', 'MajorAxisLength', ...
'MinorAxisLength', 'Eccentricity', 'Centroid');
>> s
s =
Centroid: [345.5309 389.6189]
MajorAxisLength: 365.1276
MinorAxisLength: 174.0136
Eccentricity: 0.8791
Orientation: 30.9354
Iteration f(x) step optimality CG-iterations
0 0.911579 0.00465
1 0.859323 10 0.00471 2
2 0.742788 20 0.00502 2
3 0.530433 40 0.00541 2
... and so on ...
28 0.0858947 0.0195312 0.000279 0
29 0.0858947 0.0390625 0.000279 1
30 0.0858947 0.00976562 0.000279 0
31 0.0858947 0.00244141 0.000279 0
32 0.0858947 0.000610352 0.000279 0
Convergence time (sec) = 96.0418
L0 = 25; L estimate = 89.0784
W0 = 25; W estimate = 80.4379
theta0 = 90; theta estimate = 31.614
xc = -22.9107
yc = 35.9257
function result = cappedRectangle(params, nX, nY)
[X,Y] = meshgrid(-(nX-1)/2:(nX-1)/2,-(nY-1)/2:(nY-1)/2);
% Extract params to make code more readable:
L = params(1);
W = params(2);
theta = params(3); % units are degrees
xc = params(4); % new param: image center in x
yc = params(5); % new param: image center in y
% Shift coordinates to the image center:
x = X-xc;
y = Y-yc;
% Define R = W as a constraint:
R = W;
% Define r1 and r2 for the rounded edges:
x1 = x - L;
x2 = x + L;
r1 = sqrt(x1.^2+y.^2);
r2 = sqrt(x2.^2+y.^2);
temp = double( (abs(x) <= L) & (abs(y) <= W) | (r1 <= R) | (r2 <= R) );
cappedRectangleRotated = im2double(imrotate(mat2gray(temp), theta, 'bilinear', 'crop'));
result = cappedRectangleRotated(:);
L = 25;
W = L;
theta = 90;
% set image center to zero as intial guess:
xc = 0;
yc = 0;
params0 = [L W theta xc yc];
关于matlab - 找出加盖矩形物体的方向、长度和半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11371328/
找出/计算符号的宽度 panel.add(textfield,BorderLayout.SOUTH); system.out.println(textfield.getWidth()); System
嘿,所以我正在制作一个因式分解程序,我想知道是否有人可以给我任何想法,让我知道如何找到一个有效的方法来找到两个数字乘以指定数字的倍数,以及添加到指定数字。 例如我可能有 (a)(b) = 6 a +
我以以下方式将 GWT 方法导出到 native javascript: public class FaceBookGalleryEntryPoint implements EntryPoint {
通常,当您在 Web 上找到 Silverlight 代码示例时,它可能只包含一段代码,而不是使其工作所需的完整代码集。当我试图确定在 xaml 文件顶部使用什么命名空间和/或程序集声明时,这让我感到
我对 Dojo 工具包有点陌生。有些问题我想得到启发(我用谷歌搜索,但没有得到任何合适且令人满意的答案) 我已经在运行的应用程序(由另一个软件开发人员开发)中有一个 dojo.js(也许是下载的未压缩
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to detect which row [ tr ] is clicked? 我有一个这样的表:
我目前正在尝试找出特定应用程序使用的数据保护类别。 我的第一个方法是使用未加密的 iTunes 备份来确定所使用的保护类别。我用过this提取备份。但现在我要陷入困境了。 此外,我不太确定 iTune
我有一个 NSRangeException 错误,该错误并不总是发生(尤其是在调试时)。它是随机出现的,我无法弄清楚它来自哪里。我有很多数组操作,因此很难以这种方式消除它。 我的问题是我是否可以从调试
我有一个控制台程序,它链接到 Mac 上的 Foundation 框架。如何找到可执行文件所在的文件夹? 最佳答案 即使该工具不在 bundle 中,您仍然可以使用一些 NSBundle 方法。例如:
简单的问题是:如何找出 Cocoa 应用程序中可执行文件的位置。 请记住,在许多类 Unix 操作系统中,人们使用 PATH 环境来为其可执行文件分配首选位置,特别是当他们的系统中有同一应用程序的多个
如何找出 TGridPanel 内控件的位置(行和列索引)?我想对按钮数量使用常见的 OnClick 事件,并且需要知道按钮的 X、Y 位置。 我使用的是 Delphi 2007。 最佳答案 不幸的是
我试图找到一种方法来确定 .NET 应用程序中任意文件夹中的总磁盘空间和可用磁盘空间。文件夹中的“总磁盘空间”和“可用磁盘空间”是指如果您对其执行“dir”命令,该文件夹将报告的总磁盘空间和可用磁盘空
我希望能够通过 shell 脚本判断任何 POSIX 系统上是否存在命令。 在 Linux 上,我可以执行以下操作: if which ; then ...snip... fi 但是,Solar
如何找到不同 Haskell 函数的复杂性(以 big-O 表示)? 例如, subsequences 的复杂度是多少? ? 最佳答案 您只能通过查看代码来计算函数的确切复杂度。但是,您可以使用 cr
我试图找出我的对象占用了多少内存来查看有多少对象最终出现在 Large Object Heap 上。 (超过 85,000 字节)。 是否像为每个对象添加 4(表示 int)、添加 8(表示 long
一旦我在 Vim 中加载任何文件,它就会尝试检测该文件,并在可能的情况下用颜色突出显示它。 我想知道一个 Vim 命令,它会告诉我 Vim 认为哪个 ftplugin 或文件类型插件/文件类型会突出显
是否有可能找出 querySelector 的哪一部分与 DOM 中的特定元素匹配? 假设您有以下查询: 'h1,h2,h3,h4.custom-bg,div' 如果您使用 document.quer
我遇到一个问题,用户设置的区域设置(德语)与安装的语言 Windows(英语)不同。有没有办法发现安装的 Windows 语言与用户设置的区域设置?我应该注意的问题是我正在创建共享,并且根据区域设置设
我正在写入应用程序中的文件。我想找到该文件以检查该文件是否已正确写入(以便我可以通过 Web View 访问该文件)。这是我用来编写文件的代码: try { FileOutputStream
我有一个从 JSON 文件填充的 HashMap。键值对中的值可以是两种不同的类型 - 字符串或其他键值对。 例如: HashMap hashMap = new Map(); JSON 文件看起来有点
我是一名优秀的程序员,十分优秀!