gpt4 book ai didi

matlab - 霍夫变换 : Converted polar coordinates back to Cartesian, 但仍然无法绘制它们

转载 作者:行者123 更新时间:2023-12-02 01:01:16 27 4
gpt4 key购买 nike

所以我已经自己实现了 Hough 变换的每个部分,除了实际将线条绘制回原始图像。

我可以像这样设置我的数据数组。

points | theta | rho
-------|-------|----
[246,0] -90 -246
[128,0] -90 -128
[9,0] -90 -9
[0,9] 0 9
[0,128] 0 128
[0,246] 0 246

这些点是从极坐标中的峰转换而来的点。所以现在我需要绘制所有这六条线,但我没有运气。

编辑


所以我尝试根据建议更改我的代码。这是我想出的。

function help(img, outfile, peaks, rho, theta)
imshow(img);
x0 = 1;
xend = size(img,2);
peaks_len=length(peaks);
for i=1:peaks_len
peak=peaks(i,:);
r_ind=peak(1);
t_ind=peak(2);
r=rho(r_ind);
th=theta(t_ind);
%display([r,th,peak]);

%// if a vertical line, then draw a vertical line centered at x = r
% display([r, th]);

if (th == 0)
display('th=0');
display([1, size(img,1)]);
line([r r], [1 size(img,1)], 'Color', 'green');
else
%// Compute starting y coordinate
y0 = abs((-cosd(th)/sind(th))*x0 + (r / sind(th)))+11;%-25;

%// Compute ending y coordinate
yend = abs((-cosd(th)/sind(th))*xend + (r / sind(th)))+11;%-25;
display('y');
display([y0, yend]);
display('x');
display([x0 xend]);
%// Draw the line
line([x0 xend], [y0 yend], 'Color', 'green');
end
end
end

我必须将 r==0 更改为 th==0 因为 th=0 会给出 NAN 当 r 不为 0 时出错。

基于峰值,然后我用它来获取我需要的数据,然后计算一些值...但由于某些原因,这不是很好的绘制。

如果您注意到两个 y 值的 + 11。我必须这样做才能让线路到达他们需要的地方。我有一种感觉出了什么问题。

我确实改变了它,所以我的 Rho 值现在都是正的。

最佳答案

如果你记忆一下霍夫空间的参数化,rhothetax,y 之间的直接关系是:

rho = x*cos(theta) + y*sin(theta)

请记住,x,y 分别代表 位置。此外,原点定义在图像的左上角。现在您想要绘制直线方程,您已经有了 rhotheta。只需重新排列方程式,即可解出形式为 y = mx + b 的直线方程式:

因此,只需遍历您拥有的每个 rhotheta 并绘制一条从原点开始的线 x = 0 向上到图像的极限 x = width-1。但是,因为 MATLAB 是从 1 开始索引的,所以我们需要从 x = 1x = width。假设您的 rhotheta 存储在相同长度的不同数组中,并且您将边缘图像存储在 im 中,您可以做一些事情像这样:

imshow(im); %// Show the image
hold on; %// Hold so we can draw lines
numLines = numel(rho); %// or numel(theta);

%// These are constant and never change
x0 = 1;
xend = size(im,2); %// Get the width of the image

%// For each rho,theta pair...
for idx = 1 : numLines
r = rho(idx); th = theta(idx); %// Get rho and theta
%// Compute starting y coordinate
y0 = (-cosd(th)/sind(th))*x0 + (r / sind(th)); %// Note theta in degrees to respect your convention

%// Compute ending y coordinate
yend = (-cosd(th)/sind(th))*xend + (r / sind(th));

%// Draw the line
line([x0 xend], [y0 yend], 'Color', 'blue');
end

上面的代码非常简单。首先,使用 imshow 显示图像在 MATLAB 中。接下来,使用 hold on 以便我们可以在图像中绘制将位于图像顶部的线条。接下来,我们计算有多少对 rho,theta,然后我们将两个 x 坐标定义为 1 和 width给定这些 x 坐标,使用这些来确定开始和结束 y 坐标的位置。接下来,对于我们拥有的每个 rho,theta 对,确定相应的 y 坐标,然后使用 line从起始和结束 (x,y) 坐标绘制一条蓝色线。我们重复这个直到我们用完行。

如果生成的 y 坐标超出图像范围,请不要 panic 。 line 将足够智能,可以简单地限制结果。

theta = 0

假设您在 Hough 变换中没有检测到垂直线,或者当 theta = 0 时,上面的代码就可以工作。如果 theta = 0(就像您的情况一样),这意味着我们有一条垂直 线,因此会产生无限斜率和我们的公式 y = mx + b 无效。如果 theta = 0,直线方程变为 x = rho。因此,您将需要在循环中添加一个额外的 if 语句来检测这一点:

imshow(im); %// Show the image
hold on; %// Hold so we can draw lines
numLines = numel(rho); %// or numel(theta);

%// These are constant and never change
x0 = 1;
xend = size(im,2); %// Get the width of the image

%// For each rho,theta pair...
for idx = 1 : numLines
r = rho(idx); th = theta(idx); %// Get rho and theta

%// if a vertical line, then draw a vertical line centered at x = r
if (th == 0)
line([r r], [1 size(im,1)], 'Color', 'blue');
else
%// Compute starting y coordinate
y0 = (-cosd(th)/sind(th))*x0 + (r / sind(th)); %// Note theta in degrees to respect your convention

%// Compute ending y coordinate
yend = (-cosd(th)/sind(th))*xend + (r / sind(th));

%// Draw the line
line([x0 xend], [y0 yend], 'Color', 'blue');
end
end

为了绘制垂直线,我需要知道图像的高度,以便我们可以从图像的顶部绘制垂直线 (y = 1) 到图像底部 (y = height),锚定在 x = rho。因此,上面的代码现在应该可以正确处理任何直线,以及斜率无限大的退化情况。因此,第二个版本的代码就是您所追求的。


祝你好运!

关于matlab - 霍夫变换 : Converted polar coordinates back to Cartesian, 但仍然无法绘制它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351804/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com