gpt4 book ai didi

c++ - 霍夫线变换 - 45 度角的伪影

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:14 25 4
gpt4 key购买 nike

我在 OpenCV (c++) 中实现了霍夫线变换,我在霍夫空间中得到了奇怪的伪像。下图显示了霍夫空间。距离 rho 在行中描绘,而 180 列表示从 0 到 179 度的角度。如果放大第 45 列和第 135 列,您会看到一条垂直线,其中有交替的暗像素和亮像素。 http://imgur.com/NDtMn6S

对于较高的阈值,可以很好地检测到栅栏线,但当我降低阈值时,在最终图片中可以将伪影视为 45° 或 135° 旋转线: Detected lines for medium threshold

起初我认为这是我实现霍夫线方法的错误,但使用 OpenCV 的霍夫线方法得到了类似的中等阈值线。我在使用 Canny 而不是 Sobel 时也遇到了同样的问题。

所以问题是:为什么我会得到这些人工制品,我怎样才能摆脱它们?我找不到任何关于此的信息,如有任何帮助,我们将不胜感激。

这是我使用 OpenCV 霍​​夫线方法的代码:

// read in input image and convert to grayscale
Mat frame = imread("fence.png", CV_LOAD_IMAGE_COLOR);
Mat final_out;
frame.copyTo(final_out);

Mat img, gx, gy, mag, angle;
cvtColor(frame, img, CV_BGR2GRAY);

// get the thresholded maggnitude image
Sobel(img, gx, CV_64F, 1, 0);
Sobel(img, gy, CV_64F, 0, 1);
cartToPolar(gx, gy, mag, angle);

normalize(mag, mag, 0, 255, NORM_MINMAX);
mag.convertTo(mag, CV_8U);
threshold(mag, mag, 55, 255.0, THRESH_BINARY);

// apply the hough lines transform and draw the lines
vector<Vec2f> lines;
HoughLines(mag, lines, 1, CV_PI / 180, 240);
for( size_t i = 0; i < lines.size(); i++ )
{
float rho = lines[i][0], theta = lines[i][1];
Point pt1, pt2;

pt1.x = 0;
pt1.y = (rho - pt1.x * cos(theta))/sin(theta);
pt2.x = mag.cols;
pt2.y = (rho - pt2.x * cos(theta))/sin(theta);

line(final_out, pt1, pt2, Scalar(0,0,255), 1, CV_AA);
}

// show the image
imshow("final_image", final_out);
cvWaitKey();

最佳答案

回答这个问题 - 你无法摆脱这种伪影 - 由于图像的离散性和像素的网格正交性,它本质上是数学的。唯一的方法是从分析中排除精确的 45 度角。

我找到了源头——异常的亮像素是下一期产生的:

  • 红点 - 恰好 45 度的明亮异常 - 你可以看到它们加倍形成阶梯图案 - 这使参与累积的像素数量加倍。
  • 蓝点 - 恰好 45 度暗淡异常 - 制作棋盘图案
  • 绿点 - 44 度线 - 你可以看到它是交替的加倍和国际象棋模式 - 调节异常。

如果查看霍夫变换矩阵的全图,您会看到亮度如何在整个图片中缓慢移动 - 表示交替比率根据角度缓慢变化。然而,由于像素网格的性质,恰好在 45 度时,这种异常现象非常严重。我还不知道怎么处理...

关于c++ - 霍夫线变换 - 45 度角的伪影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33983389/

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