- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我已经自己实现了 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 值现在都是正的。
最佳答案
如果你记忆一下霍夫空间的参数化,rho
、theta
与 x,y
之间的直接关系是:
rho = x*cos(theta) + y*sin(theta)
请记住,x,y
分别代表列 和行 位置。此外,原点定义在图像的左上角。现在您想要绘制直线方程,您已经有了 rho
和 theta
。只需重新排列方程式,即可解出形式为 y = mx + b
的直线方程式:
因此,只需遍历您拥有的每个 rho
和 theta
并绘制一条从原点开始的线 x = 0
向上到图像的极限 x = width-1
。但是,因为 MATLAB 是从 1 开始索引的,所以我们需要从 x = 1
到 x = width
。假设您的 rho
和 theta
存储在相同长度的不同数组中,并且您将边缘图像存储在 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/
我是一名优秀的程序员,十分优秀!