你会用Java抠图吗?【图像处理】获取用户感兴趣的区域

Computer Vision: Algorithms and ApplicationsのImage processing 实在是太喜欢Richard Szeliski的这本书了,每一章节(after chapter3)都详述了该研究方向比较新的成果,还有许多许多的reference,如果你感兴趣,完全可以看那些参考论文 Point operators(点算子) 点运算是最简单的一类图像处理运算,如简单的对比度变换,亮度变换 Pixel transform(像素变换) g(x) = af (x) + b 阅读详情

openCV根据图片生成mask掩膜,再根据mask生成ROI图片

需求背景

获取ROI图片:现在有一张图片,用户能够在坐标上选择一些点组成一个区域,这个区域称为用户感兴趣的区域,需要利用mask掩膜生成,需要生成mask图片、ROI图片,要求使用OpenCV+Java实现。

概念解释

ROI

ROI: region of interest 感兴趣的区域

openCV

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法。

掩膜mask

什么是图像处理中的mask(遮罩),OpenCV中是如此定义Mask的:八位单通道的Mat对象,每个像素点值为零或者非零区域。当Mask对象添加到图像区上时,只有非零的区域是可见,Mask中所有像素值为零与图像重叠的区域就会不可见,也就是说Mask区域的形状与大小直接决定了你看到最终图像的大小与形状。

可以看出,mask的作用是可以帮助我们提取各种不规则的区域。

代码实现

import org.opencv.core.*;
import org.opencv.core.Point;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
public class MyTest{
    /**
     * demo:根据原图片生成mask,再根据mask生成ROI图片
     */
    @Test
    public void testCreateROI() throws IOException {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat img = Imgcodecs.imread("C:\\Users\\Administrator\\Desktop\\20220720141206.jpg");

        //定义mask的区域边界点
        List<Point> list = new ArrayList<>();
        list.add(new Point(600, 50));
        list.add(new Point(400, 500));
        list.add(new Point(1000, 550));
        list.add(new Point(1200, 50));

//        list.add(new Point(0,0));
//        list.add(new Point(1296,0));
//        list.add(new Point(1296,960));
//        list.add(new Point(0,960));

        // 构建掩膜mask
        List<MatOfPoint> maskArea = new ArrayList<>();
        MatOfPoint maskPoints = new MatOfPoint();
        maskPoints.fromList(list);
        maskArea.add(maskPoints);
        Mat mask;
        mask = new Mat(new Size(img.width(), img.height()), CvType.CV_8UC3, new Scalar(0, 0, 0));//定义成黑色
        Imgproc.fillPoly(mask, maskArea, new Scalar(255, 255, 255));//填充多边形,生成mask,定义成白色
        // 保存mask图片
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\mask.tiff", mask);

        //根据mask将原图片img复制生成ROI图片dist
        Mat dist = new Mat(new Size(img.width(), img.height()), CvType.CV_8UC3, new Scalar(0, 0, 0));
        img.copyTo(dist, mask);
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\dist.tiff", dist);
    }
}

效果如下

原图片:

mask图片:

ROI图片:

工具类

方法声明

//方法1:生成mask
public static Mat create(int width, int height, String filePath, List<PointParam> points);
//方法2:根据mask生成ROI图片
public static void solve(Mat mask, String strFrom, String strTo);

ImageSolveByOpenCV 类

package com.example.phenocam.test;

import lombok.extern.slf4j.Slf4j;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;

/**
 * 通过 OpenCV 创建一张mask,根据mask生成ROI图片
 */

@Slf4j
public class ImageSolveByOpenCV {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    /**
     *    创建一个掩膜
     *    @param width: 图片的宽度
     *    @param height: 图片的高度
     *    @param filePath: 文件保存的路径
     *    @param points: 轮廓的顶点
     *    @return mask图片的mat格式
     */

    public static Mat create(int width, int height, String filePath, List<PointParam> points) {
        // 对输入的点进行预处理
        List<org.opencv.core.Point> list = new ArrayList<>();
        for (PointParam p : points) {
            list.add(new org.opencv.core.Point(p.getX(), p.getY()));
        }

        // 创建掩膜区域
        List<MatOfPoint> maskArea = new ArrayList<>();
        MatOfPoint maskPoints = new MatOfPoint();
        maskPoints.fromList(list);
        maskArea.add(maskPoints);

        // 构建掩膜
        Mat mask = new Mat(new Size(width, height), CvType.CV_8UC3, new Scalar(0, 0, 0));
        Imgproc.fillPoly(mask, maskArea, new Scalar(255, 255, 255));

        // 保存mask图片
        Imgcodecs.imwrite(filePath,mask);
        log.info("mask图片:{}生成成功",filePath);

        return mask;
    }

    /**
     * 根据mask生成图片 Mat格式
     * @param mask
     * @param strFrom 
     * @param strTo
     */
    public static void solve(Mat mask, String strFrom, String strTo){

        int width = mask.width();
        int height = mask.height();

        Mat image = Imgcodecs.imread(strFrom);
        Mat dist = new Mat(new Size(width, height), CvType.CV_8UC3, new Scalar(0, 0, 0));
        image.copyTo(dist,mask);

        Imgcodecs.imwrite(strTo,dist);
        log.info("_ROI图片:"+strTo+"生成成功");
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        String strFrom="C:\\Users\\Administrator\\Desktop\\20220720141206.jpg";//原图片路径
        String strTo="C:\\Users\\Administrator\\Desktop\\dest.jpg";//ROI图片路径(待生成)
        String maskPath = "C:\\Users\\Administrator\\Desktop\\mask.jpg";//mask的保存路径(待生成)
        Mat source = Imgcodecs.imread(strFrom);//读入图片的mat格式

        //处理边界点
        List<PointParam> points = new ArrayList<>();
        points.add(new PointParam(50.0, 50.0));
        points.add(new PointParam(700.0, 50.0));
        points.add(new PointParam(700.0, 700.0));
        points.add(new PointParam(50.0, 700.0));

        //=========================1.根据参数生成mask============================
        Mat mask = ImageSolveByOpenCV.create(source.width(), source.height(), maskPath, points);//生成的mask
        System.out.println("opencv生成mask花费: " + (System.currentTimeMillis() - start) + "ms");
        start=System.currentTimeMillis();//重置时间

        //=========================2.根据mask生成ROI效果图============================
        ImageSolveByOpenCV.solve(mask, strFrom, strTo);
        System.out.println("opencv生成mask花费: " + (System.currentTimeMillis() - start) + "ms");
    }
}

PointParam

@Data
@AllArgsConstructor
public class PointParam {
    Double x;
    Double y;
}

 

OpenCV Java实现人脸抠图和行为识别 然后,我们加载了一个预训练的人脸检测器,并读取了输入图像。接下来,我们将图像转换为灰度图像,并使用人脸检测器检测图像中的人脸。在本文中,我们将探讨如何使用Java编程语言结合OpenCV库来实现人脸抠图和行为识别的功能。人脸抠图是将人脸从图像中分割出来的过程,而行为识别是通过对人的动作进行分析和识别来判断其行为。接下来,我们将使用OpenCV提供的Java接口来实现人脸抠图和行为识别。在OpenCV中,我们可以使用视频处理功能来处理图像序列,并使用机器学习算法来训练和识别不同的行为。 阅读详情

相关推荐

Android OpenGL ES Camera2 实现实时抠图效果

前面文章,我们介绍了利用人像抠图算法生成的 mask 图,然后结合 OpenGL 可以产生一些有趣的效果。抠图技术应用很广泛,比如很多手机的相机自带“人像留色”滤镜:人体区域保留彩色,人体区域之外灰度化。所以人像留色的关键技术在于高精度高性能的分割算法。本文将基于开源的人像抠图算法模型和 OpenGL 做一个实时的人像分割 app , 该 app 目前已开源,感兴趣的同学可以参考该项目利用matting算法做一些有趣的特效。。模型类封装的非常简单,Process 执行分割输出分割结果和 mask 图。

字节流动 3万+

java项目抠图功能实现

java项目抠图功能   项目中需要一个上传文字签名并且抠掉背景图的功能,当初第一次听到这个需求时,差点惊掉下巴,我压根都不会觉得java里能实现这功能。但是既然客户需要,那就照办吧。   经过这次功能的实现,我也更加坚定了一个想法,再奇葩的需求,也要先找找方法,不要果断拒绝,要相信Java天下第一,天下第一能有解决不了的事吗?(其实我现在内心已经对学python蠢蠢欲动了,嘿嘿~~~) 1.效果图   经过我一番的搜索加改造,与前端小伙伴做了下边的效果。(整的跟PS一样,顿时有了高大上的感觉)   功能

凌大大的博客 7854

pythonqt/pyside6一键抠图效果实现,附完整代码

另外还要处理的问题有,黑底可以去掉,变为透明背景。3. Scikit-image:基于 Python 的图像处理库,包含多种图像处理算法,可用于图像分割、边缘检测、形态学操作等。1. OpenCV:用于计算机视觉和机器学习应用的开源计算机视觉库,支持 C++、Python 和 Java 等多种编程语言。5. SimpleCV:用于计算机视觉和机器人应用的 Python 库,包含多种计算机视觉算法和图像处理工具。10. Dlib:用于机器学习和计算机视觉的 C++ 库,包含多种图像处理算法和工具。

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 1609

JAVA证件照抠图-算法版

JAVA证件照抠图-算法版

weixin_44474661的博客 1470

17、图像获取、处理与特征提取全解析

本文全面解析了图像获取、处理与特征提取的核心知识,涵盖图像数据来源、基础处理操作、常用工具及软件(如MATLAB和OpenCV),并通过丰富的代码示例展示了图像处理流程。深入探讨了区域特征、线条特征和兴趣点特征的提取方法,如阈值处理、Hough变换、SIFT和SURF算法,并结合实际应用案例说明其在机器人导航、目标跟踪、图像拼接和三维重建等领域的应用。通过练习与代码示例,帮助读者掌握图像处理技术并提升实战能力。

app77的博客 71

17、图像采集、处理与特征提取全解析

本文全面解析了图像采集、处理与特征提取的核心技术。内容涵盖图像来源、MATLAB工具包、通用图像处理工具(如OpenCV、ImageMagick和FFmpeg)、图像特征提取方法(包括区域特征、线条特征和兴趣点特征),以及特征匹配技术。通过大量代码示例和练习,帮助读者深入理解图像处理流程及其在计算机视觉和机器人中的应用。

7up55的博客 96

深度学习图像抠图:从Alpha遮罩原理到MODNet实战应用

图像抠图是计算机视觉中一项追求像素级精度的核心技术,其目标在于生成连续的Alpha遮罩,而非简单的二值分割。传统方法依赖欠定的抠图方程和用户提供的三分图,而深度学习通过端到端训练,让模型从数据中自动学习前景与背景的分离约束,显著提升了技术的智能化水平。这一进步在图像处理、影视后期和实时视频应用等领域具有重要价值。本文聚焦于深度学习抠图的技术演进,涵盖了从早期三分图依赖模型到当前注重细节的注意力机制与多尺度融合方法。针对实践需求,文中以MODNet和Background Matting v2为例,提供了完整的

weixin_33716154的博客 500

java抠图程序

用java类处理图片,将白色背景的照片合成任意背景图。

OpenCV学习5:掩膜mask操作

什么是掩膜(mask) 定义:用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片、滤光片等。 数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于: 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保...

风声独行 9700

OpenCV利用Mask获取图像的不规则区域

OpenCV利用Mask方法,获取图像的不规则区域

JAVA-图像去除背景例子

JAVA-图像去除背景例子 用于去除带白色背景的图片

java 抠图开源_抠图 - 代码学习者01的个人空间 - OSCHINA - 中文开源技术交流社区...

#include"cv.h"#include"highgui.h"#includeCvPointprev_pt={-1,-1};CvPointpt_beg={-1,-1},pt_end={-1,-1};CvPointpt1={-1,-1},pt2={-1,-1};CvRectrect;IplImage*src;IplImage*tmp;voidonMouse(inte...

weixin_34649105的博客 305

基于Java深度学习库Deep Java Library 的一键抠图功能

一键抠图是一种图像处理技术,旨在自动将图像中的前景对象从背景中分离出来。它可以帮助用户快速、准确地实现抠图效果,无需手动绘制边界或进行复杂的图像编辑操作。 一键抠图的原理通常基于计算机视觉和机器学习技术。它使用深度神经网络模型,通过训练大量的图像样本,学习如何识别和分离前景对象和背景。这些模型能够理解图像中的像素信息和上下文,并根据学习到的知识进行像素级别的分割。 抠图效果可参考博客https://supreme.blog.youkuaiyun.com/article/details/143380402

Java工具--滑块验证码生成

1概述 针对当前互联网流行的滑块验证码,这里做了一个工具,适用于前后端分离的项目。工具将抠图和抠图后的原图以字节码的形式输出。 2工具源码 package com.liutao.util; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader;...

ONROAD0612的博客 1万+

Opencv实现抠图背景图替换功能

本文实例为大家分享了Opencv实现抠图替换背景图的具体代码,供大家参考,具体内容如下 下面简单图片演示一下: 提取mask: ===> 替换背景:  + = python的opencv代码如下: # coding=utf-8 import cv2 import numpy as np img=cv2.imread('lp.jpg') img_back=cv2.imread('back.jpg') #日常缩放 rows,cols,channels = img_back.shape img_back=cv2.resize(img_back,None,fx=0.7,fy=0.7) cv2.i

泛微 OA - 根据流程 requestid 获取流程中的附件

在泛微 OA 流程中,附件是通过加密上传的,如果在第三方系统想要调用 OA 系统获取 OA 附件,暂时没有很好的方法实现。但是可以在本地进行调用,得到附件信息,拿到这些信息后,可以用过 url 地址在本地下载。

小松鼠的博客 5828

Java滑动验证码的原理与实现

本文将讲解滑动验证码由来、原理及功能实现。文章,只贴出主要的逻辑代码,相关的实现代码和资源文件可以在项目中获取。 项目地址:https://gitee.com/gester/captcha.git 同时,推一下字符运算码和运算验证码文章。文章地址:https://www.jianshu.com/p/fdafd4126c2e 原创不易!如果有帮到您,可以给作者一个小星星鼓励下 ^ _ ^ 滑动验证码...

YTenderness的博客 1万+

从Power到HO:一文搞懂主流脑图谱在DPABI里怎么选,让你的rs-fMRI分析更精准

本文深入解析了rs-fMRI分析中主流脑图谱(如Power、HO、AAL等)在DPABI中的科学选择策略,帮助研究者根据不同的神经科学研究目标优化分析流程。从解剖学图谱到功能连接图谱的特性对比,到DPABI实操中的多图谱分析工作流,提供了全面的方法论指导,助力提升静息态功能磁共振成像(rs-fMRI)研究的精准度和可重复性。

weixin_30654583的博客 403

java 图片滑动验证码_java实现图片滑动验证(包含前端代码)

前言1、下面是一个效果展示;2、先抱怨一下,在博客上面的抄袭真的非常严重,为了实现一个图片滑动验证,我搜索了挺久的资料,不过内容翻来覆去就是同样的内容,千篇一律,作者还各不相同;内容相同我就不多说了,毕竟能解决问题就行,然而恰恰相反,这些东西都没有为我实质性地解决问题。可能图片验证是一个需要前后台同时交互的功能吧,从业的人员大部分都是偏向后台或者偏向前台的,所以写出来的博客都不能完整阐述整个流程,...

weixin_31163527的博客 2115

livox avia平台搭建

livox雷达数据采集平台搭建

Shilong的博客 1310

Linux环境下使用线程方式操作UART读写功能

本文介绍Linux环境下使用线程方式操作UART的方法,实现了串口打开,关闭,发送数据,接收数据功能,还编写测试代码,验证该功能。

mftang的博客 2078
上一篇: Spring boot多数据源实现动态切换
下一篇: Java 8 中 常用的 LocalDateTime 操作
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值