gpt4 book ai didi

image - 如何删除精锐边缘图像中的长边缘?

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

在处理Canny边缘检测之后,我得到了边缘图像。
但是我只想保持短边(边缘来自角色)。
并且有一些长边(在这里,我定义的长跨度超过图片高度的一半)。示例图片如下所示:
sample picture

那么,如何去除超过图片高度一半的边缘呢?

相关问题:
remove horizontal/vertical long edges

最佳答案

您可以对包含边的minAreaRect施加一些约束。
您可以找到一个示例here,但是由于您的边缘接触到边框,您需要一个额外的技巧来使findContours正常工作,因此在改进的代码下方。

只需对宽高比进行限制,您将获得:

enter image description here

删除红色边缘的位置:

enter image description here

您可以添加其他约束,例如在height上,以适合您的特定目的。

这里的代码:

#include<opencv2/opencv.hpp>
using namespace cv;


int main()
{
// Load image
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

// Remove JPG artifacts
img = img > 200;

Mat1b result = img.clone();

// Create output image
Mat3b out;
cvtColor(img, out, COLOR_GRAY2BGR);

// Find contours
Mat1b padded;
copyMakeBorder(img, padded, 1, 1, 1, 1, BORDER_CONSTANT, Scalar(0));
vector<vector<Point>> contours;
findContours(padded, contours, RETR_LIST, CHAIN_APPROX_NONE, Point(-1, -1));

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_ar = 0.05f;

// Define other constraints

bool remove = false;
if (aspect_ratio < thresh_ar) {
remove = true;
}

// if(some_other_constraint) { remove = true; }

Vec3b color;
if (remove) {
// Almost straight line
color = Vec3b(0, 0, 255); // RED

// Delete edge
for (const auto& pt : contour) {
result(pt) = uchar(0);
}
}
else {
// Curved line
color = Vec3b(0, 255, 0); // GREEN
}

// Color output image
for (const auto& pt : contour) {
out(pt) = color;
}
}

imshow("Out", out);
imshow("Result", result);
waitKey();

return 0;
}

关于image - 如何删除精锐边缘图像中的长边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40127252/

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