两幅图像的融合与叠加

假设两幅图像的大小完全一致,对应的像素数组分别为A与B,对应的任意单个像素值分别是a与b,混合后的像素值为c

几种典型图像叠加操作:

1、乘法叠加

c=(ab)/255 public int modeOne(int v1,int v2){

return (v1v2)/255;

}

2、加法叠加

c=(a+b)/2 public int modeTwo(int v1,int v2){

return (v1+v2)/2;

}

3、减法叠加

c=|a-b| public int modeThree(int v1,int v2){

return Math.abs(v1-v2);

}

4、取反叠加

c=255-((255-a)(255-b)/255)——首先对各自的像素取反,然后使用乘法叠加后对得到的结果再次取反。

public int modeFour(int v1,int v2){

double p = (int)((255-v1)(255-v2));

return (int)(255-p/255);

}

5、加法取反叠加

c=255-(a+b) {(a+b)<255} | c=0 {(a+b)>=255}

public int modeFive(int v1,int v2){

int p = (int) (v1+v2);

if(p>255){

return 0;

}else{

return 255-p;

}

                           }

6、除法取反叠加

c=(a/(255-b))255 public int modeSix(int v1,int v2){

if(v2==255)

return 0;

double p = (v1/(255-v2))255;

return clamp((int)p);

}

主要代码如下:

package chapter5;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

/**

  • Created by LENOVO on 18-1-30.

    */

    public class BlendFilter extends AbstractBufferedImageOp {

    public static final int MULTIPLY_PIXEL = 1;

    public static final int PLUS_PIXEL = 2;

    public static final int MINUS_PIXEL = 3;

    public static final int INVERSE_PIXEL = 4;

    public static final int INVERSE_PLUS_PIXEL = 5;

    public static final int DIVERSION_PIXEL = 6;

    private int mode;

    File file = new File("C:/Users/LENOVO/Desktop/rainbow.jpg");//读取的融合图片

    private BufferedImage secondImage ;

    public BlendFilter(){

    mode = MULTIPLY_PIXEL;//乘法叠加

    try {

    secondImage = ImageIO.read(file);

    } catch (IOException e) {
        e.printStackTrace();
    }

    }

    public void setMode(int mode) {

    this.mode = mode;

    }

    public void setSecondImage(BufferedImage secondImage) {

    this.secondImage = secondImage;

    }

    public BufferedImage filter(BufferedImage src,BufferedImage dest){

    checkImages(src);

    int width = src.getWidth();

    int height = src.getHeight();

    if(dest == null){

    dest = creatCompatibleDestImage(src,null);

    }

    int[] input1 = new int[width*height];//原图

    int[] input2 = new int[secondImage.getWidth()*secondImage.getHeight()];//第二张图

    int[] outPixels = new int[width*height];

    getRGB(src,0,0,width,height,input1);

    getRGB(secondImage,0,0,secondImage.getWidth(),secondImage.getHeight(),input2);

    int index = 0;

    int ta1 = 0,tr1 = 0,tg1 = 0,tb1 = 0;

    for(int row=0;row<height;row++){

    for(int col=0;col

    //获取融合后的像素数据

    private int[] getBlendData(int tr1,int tg1,int tb1,int[] input,int row,int col){

    int width = secondImage.getWidth();

    int height = secondImage.getHeight();

    int index = row*width+col;

    if(col>=width || row >=height){//

    return new int[]{tr1,tg1,tb1};

    }

    int tr = (input[index] >> 16) & 0xff;

    int tg = (input[index] >>8) & 0xff;

    int tb = (input[index]) & 0xff;

    int[] rgb = new int[3];

    if(mode == MULTIPLY_PIXEL){
        rgb[0] = modeOne(tr1,tr);
        rgb[1] = modeOne(tg1,tg);
        rgb[2] = modeOne(tb1,tb);
    }else if(mode == PLUS_PIXEL){
        rgb[0] = modeTwo(tr1,tr);
        rgb[1] = modeTwo(tg1,tg);
        rgb[2] = modeTwo(tb1,tb);
    }else if(mode == MINUS_PIXEL){
        rgb[0] = modeThree(tr1,tr);
        rgb[1] = modeThree(tg1,tg);
        rgb[2] = modeThree(tb1,tb);
    }else if(mode == INVERSE_PIXEL){
        rgb[0] = modeFour(tr1,tr);
        rgb[1] = modeFour(tg1, tg);
        rgb[2] = modeFour(tb1, tb);
    }else if(mode == INVERSE_PLUS_PIXEL){
        rgb[0] = modeFive(tr1, tr);
        rgb[1] = modeFive(tg1, tg);
        rgb[2] = modeFive(tb1, tb);
    }else if(mode == DIVERSION_PIXEL){
        rgb[0] = modeSix(tr1, tr);
        rgb[1] = modeSix(tg1, tg);
        rgb[2] = modeSix(tb1, tb);
    }
    return rgb;

    }

    //乘法叠加

    public int modeOne(int v1,int v2){

    return (v1v2)/255;

    }

    //加法叠加

    public int modeTwo(int v1,int v2){

    return (v1+v2)/2;

    }

    //减法叠加

    public int modeThree(int v1,int v2){

    return Math.abs(v1-v2);

    }

    //取反叠加

    public int modeFour(int v1,int v2){

    double p = (int)((255-v1)(255-v2));

    return (int)(255-p/255);

    }

    //加法取反叠加

    public int modeFive(int v1,int v2){

    int p = (int) (v1+v2);

    if(p>255){

    return 0;

    }else{

    return 255-p;

    }

    }

    //除法取反叠加

    public int modeSix(int v1,int v2){

    if(v2 == 255)

    return 0;

    double p = (v1/(255-v2))*255;

    return clamp((int)p);

    }

    //判断两张图像大小是否相同

    public void checkImages(BufferedImage src){

    int width = src.getWidth();

    int height = src.getHeight();

    if(secondImage == null || secondImage.getWidth()>width || secondImage.getHeight()>height){

    throw new IllegalArgumentException("输入图片必须要大于融合的图片");

    }

    }

    }

    主要代码如下:

原文地址:https://www.cnblogs.com/bigdream6/p/8385886.html

时间: 2024-10-07 23:04:37

两幅图像的融合与叠加的相关文章

计算两幅图像的重叠区域

http://www.cnblogs.com/dwdxdy/p/3232331.html 随笔- 87  文章- 0  评论- 81 [OpenCV学习]计算两幅图像的重叠区域 问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题. 图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域. 将两幅图像都

【OpenCV学习】计算两幅图像的重叠区域

问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题. 图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域. 将两幅图像都理解为多边形,则其重叠区域的计算,相当于求多边形的交集. 通过多边形求交,获取重叠区域的点集,然后利用单应矩阵还原在原始图像的点集信息,从而标识出重叠区域. 算法步骤: 1.图像

相机位姿估计3:根据两幅图像的位姿估计结果求某点的世界坐标

关键词:相机位姿估计,单目尺寸测量,环境探知 用途:基于相机的环境测量,SLAM,单目尺寸测量 文章类型:原理说明.Demo展示 @Author:VShawn @Date:2016-11-28 @Lab: [email protected] 目录 <相机位姿估计0:基本原理之如何解PNP问题> <相机位姿估计1:根据四个特征点估计相机姿态> <相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试> <相机位姿估计2:[应用]实时位姿估计与三维重建相

大家来找茬 两幅图像相减 其它好的实现? 美女找茬

http://blog.csdn.net/merlin_q/article/details/7024798 大家来找茬 两幅图像相减 其它好的实现? 标签: imageinclude 2011-11-29 20:29 4701人阅读 评论(2) 收藏 举报  分类: Opencv学习(16)  C++(18)  版权声明:本文为博主原创文章,未经博主允许不得转载. #include <opencv2/core/core.hpp>#include <opencv2/highgui/high

衡量两幅图像相似度的指标SNR(signal to noise ratio)和PSNR(peak signal to noise ratio)SSIM(structural similarity in

官方网站:https://ece.uwaterloo.ca/~z70wang/research/ssim/ 1.SSIM structural similarity index 一种衡量两幅图像相似度的新指标,其值越大越好,最大为1, 经常用到图像处理中,特别在图像去噪处理中在图像相似度评价上全面超越SNR(signal to noise ratio)和PSNR(peak signal to noise ratio). 具体原理见 Z. Wang, A. C. Bovik, H. R. Shei

OpenCV笔记(四)——两幅图像线性混合、改变图像的亮度和对比度

一.两幅图像线性混合 线性混合,就是g(x) = a*f1(x) + b*f2(x).其中g为输出,f1.f2为输入.a+b=1. 作用1:线性混合可以用于去噪,假设噪声的产生符合均值为零.标准差的独立分布.多个高斯分布求平均值,即可去除噪声. 作用2:用于两张图片的切换.a从大到小变化,b从小到大变化.g就渐渐从f1变到f2. OpenCV提供了addWeighted函数,完成上述功能: C++: void addWeighted(InputArray src1, double alpha,

OpenCv实现两幅图像的拼接

直接贴上源码 来源:http://www.myexception.cn/image/1498389.html 实验效果 Left.jpg???????????????????????????? right.jpg ImageMatch.jpg ? #include <iostream> #include <iomanip> #include "opencv2/core/core.hpp" #include "opencv2/objdetect/objd

OpenCV,计算两幅图像的单应矩阵

平面射影变换是关于其次3维矢量的一种线性变换,可以使用一个非奇异的$3 \times 3$矩阵H表示,$X' = HX$,射影变换也叫做单应(Homography).计算出两幅图像之间的单应矩阵H,那么应用这个关系可以将一个视图中的 所有点变换到另一个视图中. 上图,最右边图像是将最左边图像进行了一次射影变换,变换到中间图像视图后的图像. 使用OpenCV可以调用库函数findHomography计算两幅图像的单应矩阵,其声明如下 Mat findHomography(InputArray sr

C语言中将0到1000的浮点数用强制类型转换的方式生成一幅图像

搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大小为1000000,刚好1000*1000,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001.然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子. 前几天写了一篇文章是在C语言