OpenCV实现从灰度图像切出Mask前景区域

 更新时间:2022年06月16日 08:59:22   作者:SpikeKing  
本文主要介绍了如何利用OpenCV实现从灰度图像,根据阈值,切出多个前景区域,过滤面积太小的图像。文中的示例代码讲解详细,需要的可以参考一下

从灰度图像,根据阈值,切出多个前景区域,过滤面积太小的图像。

OpenCV的Python逻辑,clip_gray_patches

def clip_gray_patches(img_gray, ths=32, filter_percent=0.0005):
    """
    从灰度图像切出多个前景区域,阈值大于ths,过滤面积占比小于filter_percent的图像
    @param img_gray: 灰度图像
    @param ths: 前景阈值
    @param filter_percent: 过滤面积
    @return: patches list, 轮廓图像
    """

    # 根据thresh_val过滤mask
    ret, gray_mask = cv2.threshold(img_gray, ths, 1, 0)
    contours, hierarchy = cv2.findContours(gray_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    img_area = get_image_size(img_gray)  # 图像面积

    img_copy = copy.copy(img_gray)
    img_patches = []

    # 遍历全部轮廓
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area / img_area < filter_percent:  # 过滤小图像
            continue

        # 将小patch的前景设置为255,背景设置为0
        mask = np.zeros(img_gray.shape)
        cv2.drawContours(mask, [cnt], -1, 255, -1)
        mask = mask.astype(np.uint8)

        # 将原图,根据mask,贴入新图像中,再提取mask
        masked = cv2.add(img_gray, np.zeros(np.shape(img_gray), dtype=np.uint8), mask=mask)
        box = get_mask_box(mask)
        img_patch = get_cropped_patch(masked, box)

        img_patches.append(img_patch)
        img_copy = cv2.drawContours(img_copy, [cnt], -1, 255, 1)  # 绘制边界

    return img_patches, img_copy

def get_image_size(img):
    """
    获取图像尺寸
    """
    h, w = img.shape[:2]
    return float(h * w)
    
def get_mask_box(mask):
    """
    mask的边框
    """
    import numpy as np
    y, x = np.where(mask)
    x_min = np.min(x)
    x_max = np.max(x)
    y_min = np.min(y)
    y_max = np.max(y)
    box = [x_min, y_min, x_max, y_max]
    return box

def get_cropped_patch(img, box):
    """
    获取Img的Patch
    :param img: 图像
    :param box: [x_min, y_min, x_max, y_max]
    :return 图像块
    """
    h, w = img.shape[:2]
    x_min = int(max(0, box[0]))
    y_min = int(max(0, box[1]))
    x_max = int(min(box[2], w))
    y_max = int(min(box[3], h))

    if len(img.shape) == 3:
        img_patch = img[y_min:y_max, x_min:x_max, :]
    else:
        img_patch = img[y_min:y_max, x_min:x_max]
    return img_patch

输入的灰度图像:

输出图像:

到此这篇关于OpenCV实现从灰度图像切出Mask前景区域的文章就介绍到这了,更多相关OpenCV Mask前景区域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python爬虫实现POST request payload形式的请求

    python爬虫实现POST request payload形式的请求

    这篇文章主要介绍了python爬虫实现POST request payload形式的请求,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python创建二维数组实例(关于list的一个小坑)

    Python创建二维数组实例(关于list的一个小坑)

    下面小编就为大家带来一篇Python创建二维数组实例(关于list的一个小坑)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 使用python构建一个自己的聊天室

    使用python构建一个自己的聊天室

    这篇文章主要介绍了使用python构建一个自己的聊天室,有助于帮助小伙伴们理解掌握Python的socket编程,需要的朋友可以参考下
    2023-04-04
  • python中pygame模块用法实例

    python中pygame模块用法实例

    这篇文章主要介绍了python中pygame模块用法实例,通过图形绘制来简单讲述了pygame模块的用法,具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • Python基础之画图神器matplotlib

    Python基础之画图神器matplotlib

    这篇文章主要介绍了python基础之画图神器matplotlib,文中有非常详细的代码示例,对正在学习python的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-04-04
  • Python3实现发送邮件和发送短信验证码功能

    Python3实现发送邮件和发送短信验证码功能

    这篇文章主要介绍了Python3实现发送邮件和发送短信验证码功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • python写的一个squid访问日志分析的小程序

    python写的一个squid访问日志分析的小程序

    这篇文章主要介绍了python写的一个分析squid访问日志的小程序,本文实现的目标是统计access.log中的ip数目,需要的朋友可以参考下
    2014-09-09
  • python用pyinstaller封装exe双击后疯狂闪退解决办法

    python用pyinstaller封装exe双击后疯狂闪退解决办法

    本文主要介绍了python用pyinstaller封装exe双击后疯狂闪退解决办法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • python爬取全国水雨情信息详解

    python爬取全国水雨情信息详解

    这篇文章主要为大家详细介绍了python爬取全国水雨情信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • python flask 多对多表查询功能

    python flask 多对多表查询功能

    我们在flask的学习中,会难免遇到多对多表的查询,今天我也遇到了这个问题。下面把我的思路分享到脚本之家平台,供大家参考
    2017-06-06

最新评论