图像处理之透明混合 - Alpha Blending效果

简介: 图像处理之透明混合 - Alpha Blending效果

基本原理:


图像的透明混合有个专属名词– Alpha Blending



对任意两张图像可以合成为一张图像,合成图像的像素取值根据数学公式:


RGB3 = (1- a) * RGB1 + a * RGB2


其中a为混合透明度取值范围[0, 1]之间, RGB3为目标像素值, RGB1与RGB2的值分别来自两


张不同的图像。



两张源图像分别为:

0_1320847524xDId.png


第二张源图像是房屋设计图

0_1320847531ut27.png



三:最终程序效果如下


0_1320847673wD07.png


四:程序关键代码及解释


获取BufferedImage对象中像素数据的代码如下:

public void getRGB(BufferedImage img, int x, int y, int width, int height, int[] pixelsData) {
    int type = img.getType();
    if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {
      img.getRaster().getDataElements(x, y, width, width, pixelsData);
    } else {
      img.getRGB(x, y, width, height, pixelsData, 0, img.getWidth());
    }
  }

将处理后的像素数组写到新创建的BufferedImage对象中的代码如下:

public void setRGB(BufferedImage img, int x, int y, int width, int height, int[] pixelsData) {
    int type = img.getType();
    if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {
      img.getRaster().setDataElements(x, y, width, height, pixelsData);
    } else {
      img.setRGB(x, y, width, height, pixelsData, 0, width);
    }
  }


创建一个新BufferedImage对象代码如下:

alphaBlendingImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

实现Alpha Blending的代码如下:

float blendingRate = 0.5f;
  private void processPixels(int[] inPixelsOne, int[] inPixelsTwo, int[] outPixelsData, int width, int height) {
    int index = 0;
    for(int row=0; row<height; row++) {
      for(int col=0; col<width; col++) {
        int ta = 0, tr = 0, tg = 0, tb = 0;
        int rgb1 = inPixelsOne[index];
        int rgb2 = inPixelsTwo[index];
        ta = ((rgb1 >> 24) & 0xff) + ((rgb2 >> 24) & 0xff);
                tr = ((rgb1 >> 16) & 0xff) + ((rgb2 >> 16) & 0xff);
                tg = ((rgb1 >> 8) & 0xff) + ((rgb2 >> 8) & 0xff);
                tb = (rgb1 & 0xff) + (rgb2 & 0xff);
                
                int a = 0, r=0, g=0, b=0;
                a = (int)(blendingRate *(float)ta);
                r = (int)(blendingRate *(float)tr);
                g = (int)(blendingRate *(float)tg);
                b = (int)(blendingRate *(float)tb);
                
                outPixelsData[index] = ((a << 24) & 0xFF000000)
        | ((r << 16) & 0x00FF0000)
        | ((g << 8) & 0x0000FF00)
        | ((b) & 0x000000FF);
                index++;
      }
    }
    
  }

本例中,为了简化计算假设alpah blending系数为0.5

加载/读取图像文件的代码如下:

        if (srcImageOne == null) {
          File file_001 = new File("D:\\resource\\350_001.png");
          srcImageOne = ImageIO.read(file_001);
        }
        if (srcImageTwo == null) {
          File file_002 = new File("D:\\resource\\350_002.png");
          srcImageTwo = ImageIO.read(file_002);
        }
相关文章
|
算法 数据可视化
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
1726 0
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
|
17天前
|
算法 计算机视觉
图像处理之基于像素的图像混合
图像处理之基于像素的图像混合
11 1
|
17天前
|
算法 Java 计算机视觉
图像处理之颜色梯度变化 (Color Gradient)
图像处理之颜色梯度变化 (Color Gradient)
15 0
|
1月前
|
前端开发 计算机视觉 C++
【OpenCV】—分离颜色通道、多通道图像混合
【OpenCV】—分离颜色通道、多通道图像混合
|
1月前
|
数据采集 人工智能 计算机视觉
CLIP的升级版Alpha-CLIP:区域感知创新与精细控制
为了增强CLIP在图像理解和编辑方面的能力,上海交通大学、复旦大学、香港中文大学、上海人工智能实验室、澳门大学以及MThreads Inc.等知名机构共同合作推出了Alpha-CLIP。这一创新性的突破旨在克服CLIP的局限性,通过赋予其识别特定区域(由点、笔画或掩码定义)的能力。Alpha-CLIP不仅保留了CLIP的视觉识别能力,而且实现了对图像内容强调的精确控制,使其在各种下游任务中表现出色。
106 1
|
10月前
|
算法
QT+OpenGL高级光照 Blinn-Phong和Gamma校正
冯氏光照:视线与反射方向之间的夹角不小于90度,镜面光分量会变成0.0(不是很合理,会有清晰的分界线) Blinn-Phone模型采用了半程向量,即光线与视线夹角一般方向上的一个单位向量。当半程向量与法线向量越接近,镜面光分量就越大。
74 0
学不动系列 | YolactEdge:边缘设备上的实时实例分割(Xavier: 30 FPS,附源码与论文)(二)
学不动系列 | YolactEdge:边缘设备上的实时实例分割(Xavier: 30 FPS,附源码与论文)(二)
53 0
Blend混合效果
Blend混合效果
105 0
|
计算机视觉
目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强
目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强
627 0
目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强
数据增强 | 旋转、平移、缩放、错切、HSV增强
数据增强 | 旋转、平移、缩放、错切、HSV增强
242 0
数据增强 | 旋转、平移、缩放、错切、HSV增强