Java图像处理之获取用户感兴趣的区域

目录
  • 需求背景
  • 概念解释
    • ROI
    • openCV
    • 掩膜mask
  • 代码实现
    • 效果如下
  • 工具类

需求背景

获取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;
}

到此这篇关于Java图像处理之获取用户感兴趣的区域的文章就介绍到这了,更多相关Java获取用户感兴趣区域内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java数字图像处理之图像灰度处理

    本文实例为大家分享了Java数字图像处理基础之图像灰度处理,供大家参考,具体内容如下 一.简介 图像灰度化处理可以作为图像处理的预处理步骤,在图像处理中是十分重要的一件事.灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0. 灰度转换公式: int gray = (int)(color.getRed() * 0.299 + color.getGreen() * 0.587 + color.getBlue() *0.114); 我们只是需要

  • Java实现抠图片文字或签名的完整代码

    目录 java抠图片文字或签名 运行原理 完整代码 java抠图片文字或签名 运行原理 第一步 遍历像素点 BufferedImage image = ImageIO.read(new File(input)); // 图片透明度 int alpha = 0; // 最小 int maxX = 0, maxY = 0; // 最大 int minX = image.getWidth(), minY = image.getHeight(); for (int y = image.getMinY()

  • Java OpenCV图像处理之背景消除

    目录 实现步骤 主要代码 效果图 实现步骤 1.获取视频 2.设置形态学结构 3.创建Video.createBackgroundSubtractorMOG2() 4.提取模型 BS 5.进行形态学变换 6.展示结果 主要代码 package com.xu.opencv; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; import ja

  • Java OpenCV图像处理之背景切换

    目录 实现步骤 函数详解 示例代码 效果图 实现步骤 1 读取原图片 2 获取原图片的mask 3 获取原图片需要获取的ROI 4 获取新背景的mask 5 融合 3,5 函数详解 示例代码 package com.xu.opencv; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.Scalar; import org.opencv.highgui.HighGui; import o

  • 使用Java进行图像处理的一些基础操作

    图像是由一组像素构成,用二进制形式保存的图片.java语言支持GIF.JPEG和BMP这3种主要图像文件格式.java语言的图像处理功能被封装在Image类中. 图像载入和输出 在java程序中,图像也是对象,所以载入图像时,先要声明Image对象,然后,利用getImage()方法把Image对象与图像文件联系起来.载入图像文件的方法有两个: Image getImage(URL url),url指明图像所在位置和文件名. Image getImage(URL url,String name)

  • Java图像处理之获取用户感兴趣的区域

    目录 需求背景 概念解释 ROI openCV 掩膜mask 代码实现 效果如下 工具类 需求背景 获取ROI图片:现在有一张图片,用户能够在坐标上选择一些点组成一个区域,这个区域称为用户感兴趣的区域,需要利用mask掩膜生成,需要生成mask图片.ROI图片,要求使用OpenCV+Java实现. 概念解释 ROI ROI: region of interest 感兴趣的区域 openCV OpenCV(Open Source Computer Vision Library)是一个开源的计算机视

  • Java使用Scanner类获取用户输入实例详解

    创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); Scanner 类的 next() 方法 import java.util.Scanner; class Test{ public static void main(String[] args){ String s; Scanner userInput = new Scanner(System.in); System.out.print("Input String: ");

  • Java编程实现基于用户的协同过滤推荐算法代码示例

    协同过滤简单来说是利用某兴趣相投.拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要. 协同过滤又可分为评比(rating)或者群体过滤(social filtering)协同过滤以其出色的速度和健壮性,在全球互联网领域炙手可热 UserCF的核心思想即为根据用户数据模拟向量相似度,我们根据这个相似度,来找出指定用户的相似用户,然后将相似用

  • Java获取用户访问IP及地理位置的方法详解

    本文实例讲述了Java获取用户访问IP及地理位置的方法.分享给大家供大家参考,具体如下: 获取用户访问的IP地址 /** * 获取用户ip地址 * @return */ public static String getIp(HttpServletRequest request){ String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown&qu

  • java 获取用户的MAC地址多种方法实例详解

    java实现获取用户的MAC地址方法: 方法一:将本机地址与局域网内其他机器区分开来 /** * 根据IP地址获取mac地址 * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(String ipAddress) throws SocketException, UnknownHostEx

  • Java微信公众号开发之通过微信公众号获取用户信息

    最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置信息必须要填写的,所以说必须能将自己的服务发布出去 到此微信配置完毕,接下来就是直接上代码了 2.获取用户信息的方式一共是两种,前提都是用户关注微信公众号,一种是静默获取(snsapi_base,这种方式只能获取openid),另一种是授权获取(snsapi_userinfo,可以获取用户的详细信息

  • 微信公众平台开发实战Java版之微信获取用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称.头像.性别.所在城市.语言和关注时间. 开发者可通过OpenID来获取用户基本信息.请使用https协议. 我们可以看看官方的文档:获取用户的基本信息. 接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/cgi-b

  • java获取用户输入的字符串方法

    问题描述 很多同学跟我一样,都是刚开始接触java,可能从c语言突然转为java语言,有些跟我一样手足无措,那怎么获取用户输入的字符串! 如下示列: import Java.util.Scanner; //导入输入类   public static void main(String[] args) {      //创建输入对象   Scanner sc=new Scanner(System.in);      //获取用户输入的字符串   String str=null;   System.o

  • Java使用Scanner类获取用户输入过程解析

    这篇文章主要介绍了Java使用Scanner类获取用户输入过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); Scanner 类的 next() 方法 import java.util.Scanner; class Test{ public static void main(String[] args){ String s; Sc

  • java如何获取用户登录ip、浏览器信息、SessionId

    目录 java获取用户登录ip.浏览器信息.SessionId 1.获取用户登录ip 2.获取用户所使用的浏览器信息 3.获取用户SessionId 获取用户登录的ip地址(考虑多种请求头的情况) java获取用户登录ip.浏览器信息.SessionId 1.获取用户登录ip //获取用户登录ip; String loginIp = request.getHeader("X-Forwarded-For"); if (loginIp == null || loginIp.length()

随机推荐