как удалить прямые или не изогнутые линии в хитром изображении

У меня есть образ хитрый край
введите описание изображения здесь

Я хочу удалить все линии, кроме линий, которые выглядят как полукруг / эллипс или «С». Tried Hough Circle трансформируется, он обнаруживает все кривые. Это не нужно.

1

Решение

Простой подход был бы:

  1. Найти подключенные компоненты
  2. Найдите минимально ориентированную ограничивающую рамку
  3. Вычислите соотношение сторон окна и проверьте, не слишком ли это много вытянутый.

На вашем изображении я отмечен красным почти прямо линии, а зелеными — изогнутые линии. Вы можете играть с порогом по соотношению сторон:

введите описание изображения здесь

Код:

#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;
}
6

Другие решения

  1. Найти контуры от края.
  2. Получите ограничивающую рамку.
  3. Рассчитайте отношение размера диагонали ограничительной рамки к размеру контура.

Это значение будет близко к ‘1’ для прямых ребер. Чем выше значение этого соотношения, тем пышнее будет край. Это может примерно, но довольно точно оценить завитость края.

Удачного кодирования

2

По вопросам рекламы [email protected]