<tfoot id='YTMfX'></tfoot>

      <small id='YTMfX'></small><noframes id='YTMfX'>

    1. <legend id='YTMfX'><style id='YTMfX'><dir id='YTMfX'><q id='YTMfX'></q></dir></style></legend>
      <i id='YTMfX'><tr id='YTMfX'><dt id='YTMfX'><q id='YTMfX'><span id='YTMfX'><b id='YTMfX'><form id='YTMfX'><ins id='YTMfX'></ins><ul id='YTMfX'></ul><sub id='YTMfX'></sub></form><legend id='YTMfX'></legend><bdo id='YTMfX'><pre id='YTMfX'><center id='YTMfX'></center></pre></bdo></b><th id='YTMfX'></th></span></q></dt></tr></i><div id='YTMfX'><tfoot id='YTMfX'></tfoot><dl id='YTMfX'><fieldset id='YTMfX'></fieldset></dl></div>
          <bdo id='YTMfX'></bdo><ul id='YTMfX'></ul>

      1. Python+OpenCV绘制多instance的Mask图像

        时间:2023-12-16
            <tbody id='UGpli'></tbody>

              <bdo id='UGpli'></bdo><ul id='UGpli'></ul>

            • <legend id='UGpli'><style id='UGpli'><dir id='UGpli'><q id='UGpli'></q></dir></style></legend>

              1. <small id='UGpli'></small><noframes id='UGpli'>

                <tfoot id='UGpli'></tfoot>
                <i id='UGpli'><tr id='UGpli'><dt id='UGpli'><q id='UGpli'><span id='UGpli'><b id='UGpli'><form id='UGpli'><ins id='UGpli'></ins><ul id='UGpli'></ul><sub id='UGpli'></sub></form><legend id='UGpli'></legend><bdo id='UGpli'><pre id='UGpli'><center id='UGpli'></center></pre></bdo></b><th id='UGpli'></th></span></q></dt></tr></i><div id='UGpli'><tfoot id='UGpli'></tfoot><dl id='UGpli'><fieldset id='UGpli'></fieldset></dl></div>

                  请看以下详细讲解。

                  概述

                  在图像处理中,我们有时候需要对图像的不同区域进行处理,这就需要我们进行实例分割——把同一张图中不同的物体分为多个实例,并对每个实例进行操作。OpenCV提供了一些实例分割方法,如GrabCut等。在某些场景下,我们还需要绘制每个实例的Mask图像,以便更直观地查看实例分割效果。本文将介绍如何使用Python+OpenCV绘制多instance的Mask图像。

                  示例一

                  首先,我们需要导入一些库:

                  import cv2 as cv
                  import numpy as np
                  import random
                  

                  接下来,我们创建一张大小为(500,500,3)的彩色图像,并在上面随机生成10个不重叠的圆形,作为10个实例。我们定义每个实例的Mask图像大小和颜色,并在原图上用不同颜色填充各自的Mask图像。代码如下:

                  img = np.zeros((500,500,3), np.uint8)
                  masks = []
                  for i in range(10):
                      x,y = random.randint(50,450), random.randint(50,450)
                      radius = random.randint(20,50)
                      mask = np.zeros((500,500), np.uint8)
                      cv.circle(mask, (x,y), radius, 255, -1)
                      masks.append(mask)
                      color = tuple(np.random.randint(0, 255, size=3).tolist())
                      img[mask == 255] = color
                  

                  这里我们用了numpy库的random.randint和random.uniform方法,来随机生成圆的位置和大小。同时,我们定义了多个列表,用于保存每个实例的Mask图像和颜色。

                  绘制完成后,我们可以通过imshow方法查看原图和各实例的Mask图像:

                  cv.imshow('img', img)
                  for i,mask in enumerate(masks):
                      cv.imshow(f'mask{i}', mask)
                  cv.waitKey(0)
                  

                  可以看到,我们成功地生成了一张带有10个实例的彩色图像和相应的Mask图像。

                  示例二

                  在实际场景中,我们可能需要从图像或视频中自动进行实例分割和Mask图像绘制。OpenCV为我们提供了相应的API:cv.grabCut和cv.drawContours。下面我们给出一个从图像中提取前景的例子。

                  首先,我们读入一张图像,并使用cv.grabCut函数进行前景提取。下面的代码展示了如何使用cv.grabCut进行前景提取:

                  img = cv.imread("example.jpg")
                  mask = np.zeros(img.shape[:2], np.uint8)
                  bgdModel = np.zeros((1,65),np.float64)
                  fgdModel = np.zeros((1,65),np.float64)
                  rect = (50,50,400,300)
                  cv.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv.GC_INIT_WITH_RECT)
                  mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
                  img = img*mask2[:,:,np.newaxis]
                  

                  可以看到,我们首先创建了与原图像大小相同的纯黑图像作为Mask。然后,我们通过cv.grabCut对前景进行提取。其中要传入的参数为图像、Mask、前景/背景模型、矩形区域和迭代次数。在迭代结束后,grabCut会根据Mask将前景提取出来。接下来,我们将二值化的Mask映射到原图上,得到前景图像。

                  最后,我们使用cv.drawContours绘制前景和背景的Mask图像。代码如下:

                  contours, hierarchy = cv.findContours(mask2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
                  mask3 = np.zeros(img.shape[:2], np.uint8)
                  for i in range(len(contours)):
                      c = (np.random.randint(0, 255), np.random.randint(0, 255), np.random.randint(0, 255))
                      cv.drawContours(mask3, [contours[i]], -1, c, -1)
                  cv.imshow('img', img)
                  cv.imshow('mask', mask3)
                  cv.waitKey(0)
                  

                  在这里,我们使用cv.findContours函数找到轮廓,并使用cv.drawContours函数绘制多个轮廓。对于每个轮廓,我们使用不同的颜色绘制,以便更好地观察。

                  通过以上步骤,我们成功地从图像中提取出了前景,并绘制了对应的Mask图像。

                  总结

                  本文介绍了如何使用Python+OpenCV绘制多instance的Mask图像,提供了两个示例,并展示了如何从图像中提取前景并绘制Mask图像。使用OpenCV进行实例分割和Mask图像绘制可以帮助我们更好地理解图像处理技术,同时也可以帮助我们处理特定场景中的图像。

                  上一篇:OpenCV半小时掌握基本操作之图像梯度 下一篇:深入解析Python中的多进程

                  相关文章

                      • <bdo id='QhFgc'></bdo><ul id='QhFgc'></ul>
                      <legend id='QhFgc'><style id='QhFgc'><dir id='QhFgc'><q id='QhFgc'></q></dir></style></legend>

                      <tfoot id='QhFgc'></tfoot>

                      <small id='QhFgc'></small><noframes id='QhFgc'>

                      <i id='QhFgc'><tr id='QhFgc'><dt id='QhFgc'><q id='QhFgc'><span id='QhFgc'><b id='QhFgc'><form id='QhFgc'><ins id='QhFgc'></ins><ul id='QhFgc'></ul><sub id='QhFgc'></sub></form><legend id='QhFgc'></legend><bdo id='QhFgc'><pre id='QhFgc'><center id='QhFgc'></center></pre></bdo></b><th id='QhFgc'></th></span></q></dt></tr></i><div id='QhFgc'><tfoot id='QhFgc'></tfoot><dl id='QhFgc'><fieldset id='QhFgc'></fieldset></dl></div>