如何去除 canny 图像中的直线或非曲线
how to remove straight lines or non-curvical lines in a canny image
我有一个精明的边缘图像
我想删除所有行,除了看起来像 semi-circle/ellipse 或 'C' 的行。尝试了 Hough Circle 变换,它检测到所有 curves.Don 不需要那个。
一个简单的方法是:
- 求连通分量
- 找到最小方向边界框
- 计算盒子的纵横比,检查它是否过分拉长。
在你的图片上,我用红色标记了几乎是直的线,用绿色标记了曲线。您可以在宽高比上玩阈值:
代码:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
// Load image
Mat1b img = imread("path_to_img", IMREAD_GRAYSCALE);
// Create output image
Mat3b out;
cvtColor(img, out, COLOR_GRAY2BGR);
// Find contours
vector<vector<Point>> contours;
findContours(img.clone(), contours, RETR_LIST, CHAIN_APPROX_NONE);
for (const auto& contour : contours)
{
// Find minimum area rectangle
RotatedRect rr = minAreaRect(contour);
// Compute aspect ratio
float aspect_ratio = min(rr.size.width, rr.size.height) / max(rr.size.width, rr.size.height);
// Define a threshold on the aspect ratio in [0, 1]
float thresh = 0.2f;
Vec3b color;
if (aspect_ratio < thresh) {
// Almost straight line
color = Vec3b(0,0,255); // RED
}
else {
// Curved line
color = Vec3b(0, 255, 0); // GREEN
}
// Color output image
for (const auto& pt : contour) {
out(pt) = color;
}
}
imshow("Out", out);
waitKey();
return 0;
}
- 从边缘查找轮廓。
- 获取边界框。
- 计算边界框对角线尺寸与轮廓尺寸的比值。
对于直边,该值将接近“1”。这个比率的值越高,边缘就越弯曲。它可以粗略但相当准确地估计边缘的卷曲度。
编码愉快
我有一个精明的边缘图像
我想删除所有行,除了看起来像 semi-circle/ellipse 或 'C' 的行。尝试了 Hough Circle 变换,它检测到所有 curves.Don 不需要那个。
一个简单的方法是:
- 求连通分量
- 找到最小方向边界框
- 计算盒子的纵横比,检查它是否过分拉长。
在你的图片上,我用红色标记了几乎是直的线,用绿色标记了曲线。您可以在宽高比上玩阈值:
代码:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
// Load image
Mat1b img = imread("path_to_img", IMREAD_GRAYSCALE);
// Create output image
Mat3b out;
cvtColor(img, out, COLOR_GRAY2BGR);
// Find contours
vector<vector<Point>> contours;
findContours(img.clone(), contours, RETR_LIST, CHAIN_APPROX_NONE);
for (const auto& contour : contours)
{
// Find minimum area rectangle
RotatedRect rr = minAreaRect(contour);
// Compute aspect ratio
float aspect_ratio = min(rr.size.width, rr.size.height) / max(rr.size.width, rr.size.height);
// Define a threshold on the aspect ratio in [0, 1]
float thresh = 0.2f;
Vec3b color;
if (aspect_ratio < thresh) {
// Almost straight line
color = Vec3b(0,0,255); // RED
}
else {
// Curved line
color = Vec3b(0, 255, 0); // GREEN
}
// Color output image
for (const auto& pt : contour) {
out(pt) = color;
}
}
imshow("Out", out);
waitKey();
return 0;
}
- 从边缘查找轮廓。
- 获取边界框。
- 计算边界框对角线尺寸与轮廓尺寸的比值。
对于直边,该值将接近“1”。这个比率的值越高,边缘就越弯曲。它可以粗略但相当准确地估计边缘的卷曲度。
编码愉快