Opencv - контур эллипса не подходит - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу нарисовать контуры вокруг концентрических эллипсов, показанных на рисунке ниже.Я не получаю ожидаемый результат.

Я пробовал следующие шаги:

  1. Считывание изображения
  2. Преобразование изображения в оттенки серого.
  3. Применить GaussianBlur
  4. Получить края Канни
  5. Нарисовать контур эллипса

Вот исходный код:

import cv2

target=cv2.imread('./source image.png')

targetgs = cv2.cvtColor(target,cv2.COLOR_BGRA2GRAY)

targetGaussianBlurGreyScale=cv2.GaussianBlur(targetgs,(3,3),0)

canny=cv2.Canny(targetGaussianBlurGreyScale,30,90)


kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
close=cv2.morphologyEx(canny,cv2.MORPH_CLOSE,kernel)


_,contours,_=cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

if len(contours) != 0:
    for c in contours:
        if len(c) >= 50:
            hull=cv2.convexHull(c)
            cv2.ellipse(target,cv2.fitEllipse(hull),(0,255,0),2)

cv2.imshow('mask',target)
cv2.waitKey(0)
cv2.destroyAllWindows()

На изображении ниже показан ожидаемый и фактический результат: Expected & Actual Result Image

Исходное изображение:

Source Image

1 Ответ

0 голосов
/ 14 февраля 2019

Алгоритм может быть простым:

  1. Конвертировать RGB в HSV, разделить и работать с каналом V.

  2. Порог для удаления всех цветовлинии.

  3. HoughLinesP для удаления нецветных линий.

  4. расширение + эрозия для близких отверстий в эллипсах.

  5. findContours + fitEllipse.

Результат:

Result image

С новым изображением (добавлена ​​черная кривая) мой подход не работает.Похоже, вам нужно использовать обнаружение эллипса Хафа вместо «findContours + fitEllipse».В OpenCV нет реализации, но вы можете найти ее здесь или здесь .

Если вы не боитесь кода C ++ (для библиотеки OpenCV C ++ более выразителен)затем:

cv::Mat rgbImg = cv::imread("sqOOE.jpg", cv::IMREAD_COLOR);

cv::Mat hsvImg;
cv::cvtColor(rgbImg, hsvImg, cv::COLOR_BGR2HSV);

std::vector<cv::Mat> chans;
cv::split(hsvImg, chans);
cv::threshold(255 - chans[2], chans[2], 200, 255, cv::THRESH_BINARY);

std::vector<cv::Vec4i> linesP;
cv::HoughLinesP(chans[2], linesP, 1, CV_PI/180, 50, chans[2].rows / 4, 10);
for (auto l : linesP)
{
    cv::line(chans[2], cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar::all(0), 3, cv::LINE_AA);
}
cv::dilate(chans[2], chans[2], cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)), cv::Point(-1, -1), 4);
cv::erode(chans[2], chans[2], cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)), cv::Point(-1, -1), 3);

std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(chans[2], contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);

for (size_t i = 0; i < contours.size(); i++)
{
    if (contours[i].size() > 4)
    {
        cv::ellipse(rgbImg, cv::fitEllipse(contours[i]), cv::Scalar(255, 0, 255), 2);
    }
}

cv::imshow("rgbImg", rgbImg);
cv::waitKey(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...