Как разделить один контур на два, используя разные формы? - PullRequest
1 голос
/ 12 февраля 2020

Я новичок в opencv, но мне нужно проанализировать тепловые изображения мышей (см. пример изображения ). Идея состоит в том, чтобы (1) сохранить только один контур, например, всю мышь (которая работает более или менее хорошо), и (2) разделить этот контур на хвост и остальную часть тела, чтобы получить два различных контура. Я пробовал использовать пороговое значение, обнаружение краев и водораздел, но результаты далеко не хорошие Я думал об использовании различных форм хвоста против тела, но я не знаю, как это сделать.

Есть ли надежный способ сделать это, который также может быть обобщен на похожие изображения или даже видео?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Использование морфологии, как упоминалось в Cryckx, хорошо, но вы также можете использовать Преобразование расстояния , которое ослабит тонкие части (например, сказку), так что его можно будет легко разрезать. Вот результат, который я получил (я обрезал изображение только для лучшей визуализации):

enter image description here

Код OpenCV C ++:

Mat im1 = imread("E:/1/2.jpg", 0);
Mat im2, im3;

threshold(im1, im2, 250, 255, THRESH_OTSU);

imshow("Initial Thresholding", im2);

Mat dist;
distanceTransform(im2, dist, DIST_L2, 3);
normalize(dist, dist, 0, 255.0, NORM_MINMAX);
dist.convertTo(dist, CV_8U);

imshow("Distance Transform Image", dist);
Mat mask1, mask2, mask3;

threshold(dist, mask1, 50, 255,THRESH_BINARY); // A suitable threshold to cut the weak tale
dilate(mask1, mask1, Mat::ones(9,9, CV_8U));

imshow("Threshold on Distance Transform", mask1);

bitwise_and(im2, mask1, mask2);

imshow("mouse", mask2);

subtract(im2, mask2, mask3);

imshow("tale", mask3);
waitKey(0);
2 голосов
/ 12 февраля 2020

Надежные методы сегментации формы используют модели формы. Эта статья дает разумное введение: https://pdfs.semanticscholar.org/ebc2/ceba03a0f561dd2ab27c97b641c649c48a14.pdf. Идея состоит в том, чтобы изучить статистическую модель из набора изображений (средняя форма мыши и деформации вокруг этой средней формы). Затем вы можете использовать эту модель для сегментации, регистрируя ее в невидимых формах.

Просто для забавы я попробовал морфологическую математику (эрозию / дилатацию), которая, кажется, очень хорошо работает на вашем изображении :)

tail body

Python используемый код:

import numpy as np
import math
import cv2 as cv

mouse = cv.imread("mouse.jpg")
kernel7 = np.ones((7,7),np.uint8)
body = cv.morphologyEx(mouse, cv.MORPH_OPEN, kernel7)
bodyErrode = cv.dilate(body,kernel7)
mask= cv.bitwise_not( bodyErrode );
mask2, tr = cv.threshold(mask, 120, 255, cv.THRESH_BINARY) 
tail = cv.bitwise_and(mouse,tr)
cv.imshow("tail",tail)
cv.imshow('body',body)
cv.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...