iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >OpenCV实现从灰度图像切出Mask前景区域
  • 688
分享到

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

2024-04-02 19:04:59 688人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

从灰度图像,根据阈值,切出多个前景区域,过滤面积太小的图像。 OpenCV的python逻辑,clip_gray_patches: def clip_gray_patches(img

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

OpenCVpython逻辑,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前景区域内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: OpenCV实现从灰度图像切出Mask前景区域

本文链接: https://www.lsjlt.com/news/118716.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV实现从灰度图像切出Mask前景区域
    从灰度图像,根据阈值,切出多个前景区域,过滤面积太小的图像。 OpenCV的Python逻辑,clip_gray_patches: def clip_gray_patches(img...
    99+
    2024-04-02
  • 基于Qt OpenCV怎么实现图像灰度化像素
    这篇文章主要介绍了基于Qt OpenCV怎么实现图像灰度化像素的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Qt OpenCV怎么实现图像灰度化像素文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-02
  • C++ opencv图像处理实现灰度变换示例
    目录灰度变换概念灰度变换的作用灰度变换的方法灰度化灰度的概念对彩色图进行灰度化1.加权平均值法2.取最大值3.平均值灰度的线性变换1.线性变换2.分段线性变换灰度的非线性变换1.对数...
    99+
    2024-04-02
  • Python OpenCV 彩色与灰度图像的转换实现
    彩色图像转换为灰度图像 第一种方式通过 imread 读取图像的时候直接设置参数为 0 ,自动转换彩色图像为灰度图像 第二种方式,可以通过 split 进行通道分离,或者叫做读取单个...
    99+
    2024-04-02
  • OpenCV实现低对比度图像脏污区域检测
    目录1. 低对比度图像脏污区域检测2. 实现方法介绍3. C++源码实现4.结果总结参考1. 低对比度图像脏污区域检测 先上图: 第一张图如果不是标注结果,我都没有发现脏污...
    99+
    2024-04-02
  • C#如何实现opencv截取旋转矩形区域图像
    本篇内容主要讲解“C#如何实现opencv截取旋转矩形区域图像”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现opencv截取旋转矩形区域图像”吧!前言:最近在工程中需要用到截取Rot...
    99+
    2023-06-07
  • python+opencv图像分割如何实现分割不规则ROI区域
    这篇文章将为大家详细讲解有关python+opencv图像分割如何实现分割不规则ROI区域,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python有哪些常用库python常用的库:1.requesuts...
    99+
    2023-06-14
  • python+opencv图像分割实现分割不规则ROI区域方法汇总
    在图像分割领域,一个重要任务便是分割出感兴趣(ROI)区域。如果是简易的矩形ROI区域其实是非常容易分割的,opencv的官方python教程里也有教到最简易的矩形ROI分割(剪裁)...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作