сегментирование исходного изображения в opencv на основе контура рельефа, полученного в результате обработки указанного исходного изображения

У меня есть исходное изображение. Мне нужна отдельная часть, которая будет отделена от нее и сохранена как другое изображение. У меня есть хитрый контур части, которую нужно сегментировать, но как мне использовать ее, чтобы вырезать часть из исходного изображения? Я приложил как исходное изображение, так и набросок обтекаемого края. Пожалуйста, помогите мне и предложите мне решение.

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

Canny edge

РЕДАКТИРОВАТЬ-1: Александр Кондрацкий, это то, что вы имели в виду, заполняя границу?введите описание изображения здесь

РЕДАКТИРОВАТЬ-2: в соответствии с Каннат, я сделал это
Исходное изображение с контуром

Теперь, как разделить области, которые находятся снаружи и внутри контура, на два отдельных изображения?

Редактировать 3 — Я думал о «И маске и исходной картинке с контурными линиями. Так как я использую C, у меня возникли небольшие трудности.
это код, который я использую и: —

            hsv_gray = cvCreateImage( cvSize(seg->width, seg->height), IPL_DEPTH_8U, 1 );
cvCvtColor( seg, hsv_gray, CV_BGR2GRAY );
hsv_mask=cvCloneImage(hsv_gray);
IplImage* contourImg =cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
IplImage* newImg=cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
cvAnd(contourImg, hsv_mask,newImg,NULL);

Я всегда получаю ошибку несоответствия размера или типа. Я отрегулировал размер, но не могу настроить тип, поскольку один (hsv_mask) — 1 канал, а остальные — 3 канала.

@ kanat- Я также попробовал твои ограничения, но, похоже, не смог правильно войти в C-формат.

3

Решение

использование cv::findContours на вашем втором изображении, чтобы найти контур сегмента. Тогда используйте cv::boundingRect найти ограничивающую рамку для этого сегмента. После этого вы можете создать матрицу и сохранить в ней обрезанную ограничивающую рамку из вашего второго изображения (как я вижу, это двоичное изображение). Для обрезки нужного региона используйте это:

cv::getRectSubPix(your_image, BB_size, cv::Point(BB.x + BB.width/2,
BB.y + BB.height/2), new_image)
,
Тогда вы можете сохранить new_image с помощью cv::imwrite, Вот и все.

РЕДАКТИРОВАТЬ:

Если вы нашли только один контур, используйте его (иначе вы будете перебирать элементы найденных контуров). Следующий код показывает шаги, но извините, я не могу проверить это сейчас:

std::vector<std::vector<cv::Point>> contours;
// cv::findContours(..., contours, ...);
cv::Rect BB = cv::boundingRect(cv::Mat(contours[0]));
cv::Mat new_image;
cv::getRectSubPix(your_image, BB.size(), cv::Point(BB.x + BB.width/2,
BB.y + BB.height/2), new_image);
cv::imwrite("new_image_name.jpg", new_image);
0

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

Вы можете заполнить границу, созданную детектором канни, и использовать ее в качестве альфа-маски на исходном изображении.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector