java使用Opencv小例子,从合并的两个图片中减去一张图片

将两个图片合并很容易(下面第二个程序是利用java合并两张图片),但有时候需要从两个合并的图片中分离出一张图片,查了一下opencv提供了图片相减的功能,其实不止图片相减,基本的运算opencv都提供了,这里以图片相减为例说明。

package swing_interface;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;

/**
 * 执行两个图片的相减操作,用于抓取用户所画的部分,去除本来就有的部分
 */
public class ImageSub {

	public static void sub(String two_path, String one_path, String des_path) {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

		// 读取图像,不改变图像的原始信息
		Mat image1 = Highgui.imread(two_path, Highgui.CV_LOAD_IMAGE_COLOR);
		Mat image2 = Highgui.imread(one_path, Highgui.CV_LOAD_IMAGE_COLOR);
			
		Mat image3 = new Mat(image1.size(), CvType.CV_64F);
		Core.subtract(image2, image1, image3);

		Mat image5 = new Mat(image1.size(), CvType.CV_64F);
		Core.bitwise_not(image3, image5);

		Highgui.imwrite(des_path, image5);
	}
	
	public static void main(String[] args) {
		String dir = System.getProperty("user.dir");
		ImageSub.sub(dir+"/r_pic/user_paint_two.jpg", dir+"/r_pic/user_paint_one.jpg", dir+"/res.jpg");
	}

}

另外附上用java合并两张图片的程序,当然用opencv实现起来更方便。

package merge;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

/**
 * 图片拼接
 * 把多张宽度一样的图片拼接成一张大图片
 */
public class Merge {
	
	public static String path = System.getProperty("user.dir");
    
    public static void main(String[] args) {
        callMergeSimple();
    }
    
    public static void callMergeSimple(){
    	
    	File file1 = new File(path+"/merge1/1.jpg");
    	File file2 = new File(path+"/merge1/2.jpg");
    	File file3 = new File(path+"/merge2/res.jpg");
    	BufferedImage image1 = null,image2 = null;
    	try {
			image1 = ImageIO.read(file1); 
			image2 = ImageIO.read(file2);
		} catch (IOException e) {
			e.printStackTrace();
		} 
    	mergeSimple(image1,image2,100,300,file3);
    }
    
    public static boolean mergeSimple(BufferedImage image1, BufferedImage image2, int posw, int posh, File fileOutput) {

    	  //合并两个图像
    	  int w1 = image1.getWidth();
    	  int h1 = image1.getHeight();
    	  int w2 = image2.getWidth();
    	  int h2 = image2.getHeight();

    	  BufferedImage imageSaved = new BufferedImage(w1, h1, BufferedImage.TYPE_INT_ARGB);
    	  Graphics2D g2d = imageSaved.createGraphics();
    	  g2d.drawImage(image1, null, 0, 0);
    	  
    	  for (int i = 0; i < w2; i++) {
    		  for (int j = 0; j < h2; j++) {
    			  int rgb1 = image1.getRGB(i + posw, j + posh);
    			  int rgb2 = image2.getRGB(i, j);
    			  
    			  if (rgb1 != rgb2) {
    				  rgb2 = rgb1 & rgb2;
    			  }
    			  imageSaved.setRGB(i + posw, j + posh, rgb2);
    		  }
    	  }

    	  boolean b = false;
    	  try {
    		  b = ImageIO.write(imageSaved, "png", fileOutput);
    	  } catch (IOException ie) {
    		  ie.printStackTrace();
    	  }
    	  	  return b;
    	 }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值