作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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 度时,这种异常现象非常严重。我还不知道怎么处理...
关于c++ - 霍夫线变换 - 45 度角的伪影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33983389/
我是一名优秀的程序员,十分优秀!