• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python opencv 找出图像中的最大轮廓并填充(生成mask)
    POST TIME:2021-10-18 14:36

    本文主要介绍了python opencv 找出图像中的最大轮廓并填充,分享给大家,具体如下:

    import cv2
    import numpy as np
    from PIL import Image
     
    from joblib import Parallel
    from joblib import delayed
    # Parallel 和 delayed是为了使用多线程处理
    # 使用前需要安装joblib:pip install joblib
     
    # img_stack的shape为:num, h, w
    # 是三维的图像,可以理解为是num张二维的图像组成
    # mask是用来保存最后的结果的
    mask = np.ones_like(img_stack)
    for i in range(num):
      # 阈值化
      _, binaryzation = cv2.threshold(img_stack[i], 5, 255, cv2.THRESH_BINARY_INV)
      # 找到所有的轮廓
      contours, _ = cv2.findContours(binaryzation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
      area = []
      # 找到最大的轮廓
      for k in range(len(contours)):
        area.append(cv2.contourArea(contours[k]))
      max_idx = np.argmax(np.array(area))
      # cv2.fillContexPoly(mask[i], contours[max_idx], 0)
      # 填充最大的轮廓
      cv2.drawContours(mask[i], contours, max_idx, 0, cv2.FILLED)
      del area 
     
     
    # 保存
    def _write_mask(mask, i):
      Image.fromarray(mask.astype(np.uint8)*255).save(os.path.join(path, 'm%d.png' % i))
     
    # 使用多线程进行保存
    num_cores = 10
    parallel = Parallel(n_jobs=num_cores, backend='threading')
    parallel(delayed(_write_mask)(mask[i, :, :], i) for i in range(0, num))

    之前偷懒直接将项目里面的代码段扣下来放在这里,误导了大家,抱歉

    这次我重新放一个完整版本,希望对大家有所帮助~~

    代码在python 3.7.6 和opencv-python 4.3.0下测试成功

    import cv2
    import numpy as np
     
    # 以灰度方式读取图像
    img = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)
    mask = img.copy()
     
    # 二值化,100为阈值,小于100的变为255,大于100的变为0
    # 也可以根据自己的要求,改变参数:
    # cv2.THRESH_BINARY
    # cv2.THRESH_BINARY_INV
    # cv2.THRESH_TRUNC
    # cv2.THRESH_TOZERO_INV
    # cv2.THRESH_TOZERO
    _, binaryzation = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY_INV)
     
    # 找到所有的轮廓
    contours, _ = cv2.findContours(binaryzation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
     
    area = []
     
    # 找到最大的轮廓
    for k in range(len(contours)):
    	area.append(cv2.contourArea(contours[k]))
    max_idx = np.argmax(np.array(area))
     
    # 填充最大的轮廓
    mask = cv2.drawContours(mask, contours, max_idx, 0, cv2.FILLED)
     
    # 保存填充后的图像
    cv2.imwrite('masked.png', mask)

    输入图像:

    输出图像:

    到此这篇关于python opencv 找出图像中的最大轮廓并填充(生成mask)的文章就介绍到这了,更多相关opencv最大轮廓内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python-OpenCV实现图像缺陷检测的实例
    • OpenCV-Python实现图像平滑处理操作
    • OpenCV-Python直方图均衡化实现图像去雾
    • Python OpenCV 图像平移的实现示例
    • python基于opencv 实现图像时钟
    • Python-OpenCV教程之图像的位运算详解
    上一篇:Python OpenCV招商银行信用卡卡号识别的方法
    下一篇:Python OpenCV 图像区域轮廓标记(框选各种小纸条)
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信