为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用不同的形状将一个轮廓分成两个?

如何使用不同的形状将一个轮廓分成两个?

MYYA 2022-07-26 15:53:38
我是 opencv 新手,但我需要分析小鼠的热图像(参见示例图像)。这个想法是(1)只保留一个轮廓,例如整个鼠标(工作或多或少都很好)和(2)将该轮廓分成尾巴和身体的其他部分以获得两个不同的轮廓。我尝试过使用阈值处理、边缘检测和分水岭,但结果远非良好。我想过使用尾巴和身体的不同形状,但我不知道如何实现。有没有一种可靠的方法可以推广到类似的图像甚至视频?提前致谢
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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

//img1.sycdn.imooc.com//62df9da00001b7d006560135.jpg

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


查看完整回答
反对 回复 2022-07-26
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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

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

//img1.sycdn.imooc.com//62df9db50001432a06531058.jpg

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


查看完整回答
反对 回复 2022-07-26
  • 2 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信