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

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

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

(0)

相关推荐

  • Python+OpenCV绘制多instance的Mask图像

    目标:Mask中,不同值表示不同的实例(instance),在原图中,绘制不同的instance实例,每个实例用不同颜色表示,实例边界用白色表示. 源码: def generate_colors(n_colors, seed=47): """ 随机生成颜色 """ np.random.seed(seed) color_list = [] for i in range(n_colors): color = (np.random.random((1,

  • python3+opencv生成不规则黑白mask实例

    废话不多说,直接上代码吧! # -*- coding: utf-8 -*- import cv2 import numpy as np # -----------------------鼠标操作相关------------------------------------------ lsPointsChoose = [] tpPointsChoose = [] pointsCount = 0 count = 0 pointsMax = 10 def on_mouse(event, x, y, f

  • python使用opencv对图像mask处理的方法

    MASK图像掩膜处理 在图像操作中有时候会用到掩膜处理,如果使用遍历法掩膜图像ROI区域对于python来讲是很慢的,所以我们要找到一种比较好的算法来实现掩膜处理. 假设我们有一副图像: 而我们关心的区域就在这一小堆线上,想把这一堆线提取出来,我们先通过numpy生成一个mask图像: sss=np.zeros([480,640],dtype=np.uint8) sss[300:350,310:400]=255 生成一个640*480大小的一个图片,填充为0,然后在300:350,310:400

  • 使用python和opencv的mask实现抠图叠加

    背景照片: logo: 合成效果: 代码: import cv2 as cv, numpy as np # Load two images img1 = cv.imread('227351.jpg') # 背景 img2 = cv.imread('logo.png') # logo # I want to put logo on top-left corner, So I create a ROI rows,cols,channels = img2.shape roi = img1[0:rows

  • 超详细注释之OpenCV制作图像Mask

    这篇博客将介绍如何使用OpenCV制作Mask图像掩码.使用位运算和图像掩码允许我们只关注图像中感兴趣的部分,截取出任意区域的ROIs. 应用: 图像感兴趣区域的截取: 图像融合:构建透明的叠加层: 1. 效果图 原始图如下:(老九门颖宝&佛爷~) 矩形掩码 VS 效果图如下:(使用矩形掩码,只提取图像中包含人物的区域,而忽略其他区域) 圆形掩码 VS 效果图如下:(圆形掩模显示在左边,掩模的应用在右边.实质上可以使用任意形状的掩码图像,如矩形.圆.线.多边形等从图像中提取区域) 2. 源码 #

  • python opencv 找出图像中的最大轮廓并填充(生成mask)

    本文主要介绍了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 #

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

    从灰度图像,根据阈值,切出多个前景区域,过滤面积太小的图像. 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_perce

  • Opencv图像处理之详解掩膜mask

    1.在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 2.如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩膜(masking). 我们先看一下掩膜的基础.图像的位运算. 图像基本运算 图像的基本运算有很多种,比如两幅图像可以相加.相减.相乘.相除.位运算.平方根.对数.绝对值等:图像也可以放大.缩小.旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作,各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操

  • 基于JavaScript实现 网页切出 网站title变化代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-"> <title>这里是网站标题</title> </head> <body> <script type="text/javascript"> document.body.onfocus = function

  • Android应用第一次安装成功点击“打开”后Home键切出应用后再点击桌面图标返回导致应用重启问题的解决方法

    if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){ finish(); return; } 应用程序入口Activity的onCreate方法中加入上面的判断,完美解决应用程序多次重启问题. 应用程序入口Activity的onCreate方法中加入上面的判断,在setcontentview方法之前调用. 以上所述是小编给大家介绍的 Android应用第一次安装成功点击"打开"后Ho

  • opencv帧差法找出相差大的图像

    本文实例为大家分享了opencv帧差法找出相差大的图像,供大家参考,具体内容如下 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>

  • Python OpenCV 彩色与灰度图像的转换实现

    彩色图像转换为灰度图像 第一种方式通过 imread 读取图像的时候直接设置参数为 0 ,自动转换彩色图像为灰度图像 第二种方式,可以通过 split 进行通道分离,或者叫做读取单个通道,也可以将一个彩色图像分离成 3 个单通道的灰度图像 今天要学习的方法,是通过一个叫做 cvtColor 的方法实现该操作. cv2.cvtColor() 方法用于将图像从一种颜色空间转换为另一种颜色空间. OpenCV 提供了 150 多种 color-space 转换方法.多到用不过来~ 该方法的语法格式为:

  • 矩形相交以及求出相交的区域的原理解析

    (1)设计一个算法,确定两个矩形是否相交(即有重叠区域) (2)如果两个矩形相交,设计一个算法,求出相交的区域矩形 (1) 对于这个问题,一般的思路就是判断一个矩形的四个顶点是否在另一个矩形的区域内.这个思路最简单,但是效率不高,并且存在错误,错误在哪里,下面分析一 下. 如上图,把矩形的相交(区域重叠)分成三种(可能也有其他划分),对于第三种情况,如图中的(3),两个矩形相交,但并不存在一个矩形的顶点在另一个矩形 内部.所以那种思路存在一个错误,对于这种情况的相交则检查不出. 仔细观察上图,想

  • 点击弹出层外区域关闭弹出层jquery特效示例

    点击弹出层外区域关闭弹出层jquery特效,废话不说,上代码,简洁明了: 复制代码 代码如下: <html> <head> <style> .hide{display:none;} .con{width:500px;height:300px;background:#000;} </style> <title>点击弹出层 ,点击弹出层外区域关闭弹出层jquery特效</title> <script type="text/

  • opencv利用鼠标滑动画出多彩的形状

    今天没有继续学习新知识点,画出了一个随鼠标画出的 图形,知识点全都是之前学的,话不多说,先上图: 代码部分: // opencvMouse.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; #define WINDOW_NAME "[窗

  • Python中ROS和OpenCV结合处理图像问题

    目录 一.安装ROS-OpenCV 二.简单案例分析 1.usb_cam.launch 2.cv_bridge_test.py 3.rqt_image_view 三.CvBridge相关API 1.imgmsg_to_cv2() 2.cv2_to_imgmsg() 四.利用ROS+OpenCV实现人脸检测案例 1.usb_cam.launch 2.face_detector.launch 2.1 launch 2.2 face_detector.py 2.3 两个xml文件 3.rqt_imag

随机推荐