【问题标题】:How to split one contour into two using different shapes?如何使用不同的形状将一个轮廓分成两个?
【发布时间】:2020-05-27 22:52:03
【问题描述】:

我是 opencv 新手,但我需要分析小鼠的热图像(请参阅 example image)。这个想法是(1)只保留一个轮廓,例如整个鼠标(或多或少都很好)和(2)将此轮廓分成尾巴和身体的其余部分,以获得两个不同的轮廓。我尝试过使用阈值处理、边缘检测和分水岭,但结果远非良好。我想过使用尾巴和身体的不同形状,但我不知道如何实现。

有没有一种可靠的方法可以推广到相似的图像甚至视频?

提前致谢

【问题讨论】:

  • 我用阈值230,255 很好地得到了尾巴。它也会得到头部的小部分,如果所有图片都一致,则可以通过消除特定区域以下的轮廓来消除头部部分(因为头部轮廓非常小)。尽管我不是专家,但我能想到的其他任何事情都会非常复杂。
  • 不幸的是,由于表面温度随时间/测试对象的波动,图像并不一致。最终目标是在不修改每个图像的参数的情况下在多张图像上绘制两个轮廓。

标签: python opencv image-processing image-segmentation shapes


【解决方案1】:

使用 Cryckx 提到的形态是好的,但你也可以使用 距离变换,这会削弱薄的部分(如故事),因此可以轻松切割。这是我得到的结果(我裁剪图像只是为了更好地可视化):

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);

【讨论】:

  • 距离变换的巧妙运用。不错。
  • 感谢两位的解决方案。这两种方法都适用于单张图像,但 MH304 的解决方案也可以轻松地用于分析视频,至少对我而言 :-)
【解决方案2】:

形状分割的可靠方法是使用形状模型。本文给出了合理的介绍:https://pdfs.semanticscholar.org/ebc2/ceba03a0f561dd2ab27c97b641c649c48a14.pdf。 这个想法是从一组图像(平均鼠标形状和该平均形状周围的变形)中学习统计模型。然后您可以使用该模型通过将其注册到看不见的形状来进行分割。

只是为了好玩,我尝试了形态数学(侵蚀/膨胀),这似乎对您的图像效果很好:)

使用的 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多