opencv-python如何找到最大的轮廓并提取该轮廓对应的mask部分以及opencv常见的问题

  • Post author:
  • Post category:python




opencv-python如何找到最大的轮廓并提取该轮廓对应的mask部分以及opencv常见的问题

一、如何找到最大的轮廓并提取该轮廓对应的mask部分

主要用到的函数:cv.threshold() cv.findContours() cv.drawContours()

首先要讲的是这三个函数的输入图像,这里很重要也很麻烦。

1.cv.threshold()函数输入的图像数据可以是单通道也可以是三通道,输出通道数和输入通道数是一致的。但是由于cv.findContours()函数的输入是单通道的,因此我们通常以单通道的形式输入。

2.cv.findContours()的输入是单通道的,且需要是2值图像。

3. cv.drawContours()函数将我们指定的轮廓画在我们要画的图片上,这里的输入图片是三通道的,因为函数的颜色添加形式是RGB形式。

4.提取过程:

#先用阈值获得我们的二值图像,这里maskcop是单通道的,所以输出也是单通道的。
_,Thresh_val  = cv.threshold(maskcop,val1-1,1,cv.THRESH_BINARY)
#再进行轮廓的提取,这里contours可能包括了多个轮廓
contours, _ = cv.findContours(maskcop, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)

#---------------------------
#按照轮廓的索引提取指定的轮廓,并绘制在背景图上,这里mask是3通道的
#---------------------------
background = np.zeros_like(mask)
#第三个参数是contour的索引,第四个参数是RGB颜色设置,最后的参数-1表示填充,其他表示用对应粗细的线条绘制轮廓
biggest_contour_mask = cv.drawContours(background, contours, 1, (255, 255, 255), -1)
#这里再还原到单通道,方便我们后续处理
biggest_contour_mask = cv.cvtColor(biggest_contour_mask, cv.COLOR_RGB2GRAY)

实际效果图(我们获取两个轮廓中的一个):

在这里插入图片描述

在这里插入图片描述

二、opencv常见的问题

平时常见的问题:

1.数据类型不匹配的问题。 我们使用numpy构建一个伪图片时数据格式可能是np.float64,但是cv很多函数使用的数据类型都是np.float32或者np.uint8。因此我们遇到问题时先考虑是不是数据格式的问题,使用image.astype(np.uint8)即可修改图片的数据格式

2.通道问题,就像上面提取轮廓一样。cv中三个函数的输入数据通道数不一致,我们需要注意通道数的问题。



版权声明:本文为weixin_44587732原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。