介绍几种常见的将两张图像混合在一起形成一张新的图像的算法,
首先看一下下面算法演示中要使用的两张图像:
为了得到更好的混合效果,我选择了两张一样大小的图片。
方法一:
通过简单对于像素点的像素相乘得到输出像素值,代码演示如下:
private int modeOne(int v1, int v2) {
return (v1 * v2) / 255;
}
方法一的效果如下:
方法二:
通过计算两个像素之和再减去方法一的输出值,代码如下:
private int modeTwo(int v1, int v2) {
return v1 + v2 - v1 * v2 / 255;
}
方法二的效果如下:
方法三:
通过像素值128这个特殊的中值来求取输出值,代码如下:
private int modeThree(int v1, int v2) {
return (v2 < 128) ? (2 * v1 * v2 / 255):(255 - 2 * (255 - v1) * (255 - v2) / 255);
}
方法三的效果如下:
方法四:
与方法三不同,中值127.5被用在计算等式中,代码如下:
private int modeFour(double v1, double v2) {
if ( v1 > 127.5 ){
return (int)(v2 + (255.0 - v2) * ((v1 - 127.5) / 127.5) * (0.5 - Math.abs(v2-127.5)/255.0));
}else{
return (int)(v2 - v2 * ((127.5 - v1) / 127.5) * (0.5 - Math.abs(v2-127.5)/255.0));
}
}
方法四的效果如下:
方法五:
中值计算考虑,是方法一的升级版本,使得混合更加精细,代码如下:
private int modeFive(double v1, double v2) {
if ( v1 > 127.5 ){
return (int)(v2 + (255.0 - v2) * ((v1 - 127.5) / 127.5));
}else{
return (int)(v2 * v1 / 127.5);
}
}
方法五的效果如下:
滤镜源代码如下:
package com.gloomyfish.filter.study;
import java.awt.image.BufferedImage;
/***
* i get these blend method from html5 demo then i decide to
* translate these java script methods into java
* 偶尔我也会写中文注释, 常见的图像混合方法
* @author fish
* @date 2012-11-28
*/
public class ImageBlendFilter extends AbstractBufferedImageOp {
/** Define the blend mode */
public final static int MULTIPLY_PIXEL = 1;
public final static int SCREEN_PIXEL = 2;
public final static int OVERLAY_PIXEL = 3;
public final static int SOFTLIGHT_PIXEL = 4;
public final static int HARDLIGHT_PIXEL = 5;
private int mode;
private BufferedImage secondImage;
public ImageBlendFilter() {
mode = 1;
}
public void setBlendMode(int mode) {
this.mode = mode;
}
public void setSecondImage(BufferedImage image) {
this.secondImage = image;
}
@Override
public BufferedImage filter(BufferedImage src, BufferedImage dest) {
checkImages(src);
int width = src.getWidth();
int height = src.getHeight();
if ( dest == null )
dest = createCompatibleDestImage( 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<width; col++) {
index = row * width + col;
ta1 = (input1[index] >> 24) & 0xff;
tr1 = (input1[index] >> 16) & 0xff;
tg1 = (input1[index] >> 8) & 0xff;
tb1 = input1[index] & 0xff;
int[] rgb = getBlendData(tr1, tg1, tb1, input2, row, col);
outPixels[index] = (ta1 << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];
}
}
setRGB( dest, 0, 0, width, height, outPixels );
return dest;
}
private int[] getBlendData(int tr1, int tg1, int tb1, int[] input,int row, int col) {
int width = secondImage.getWidth();
int height = secondImage.getHeight();
if(col >= width || row >= height) {
return new int[]{tr1, tg1, tb1};
}
int index = row * width + col;
// int ta = (input[index] >> 24) & 0xff;
int tr = (input[index] >> 16) & 0xff;
int tg = (input[index] >> 8) & 0xff;
int tb = input[index] & 0xff;
int[] rgb = new int[3];
if(mode == 1) {
rgb[0] = modeOne(tr1, tr);
rgb[1] = modeOne(tg1, tg);
rgb[2] = modeOne(tb1, tb);
}
else if(mode == 2) {
rgb[0] = modeTwo(tr1, tr);
rgb[1] = modeTwo(tg1, tg);
rgb[2] = modeTwo(tb1, tb);
}
else if(mode == 3) {
rgb[0] = modeThree(tr1, tr);
rgb[1] = modeThree(tg1, tg);
rgb[2] = modeThree(tb1, tb);
}
else if(mode == 4) {
rgb[0] = modeFour(tr1, tr);
rgb[1] = modeFour(tg1, tg);
rgb[2] = modeFour(tb1, tb);
}
else if(mode == 5) {
rgb[0] = modeFive(tr1, tr);
rgb[1] = modeFive(tg1, tg);
rgb[2] = modeFive(tb1, tb);
}
return rgb;
}
private int modeOne(int v1, int v2) {
return (v1 * v2) / 255;
}
private int modeTwo(int v1, int v2) {
return v1 + v2 - v1 * v2 / 255;
}
private int modeThree(int v1, int v2) {
return (v2 < 128) ? (2 * v1 * v2 / 255):(255 - 2 * (255 - v1) * (255 - v2) / 255);
}
private int modeFour(double v1, double v2) {
if ( v1 > 127.5 ){
return (int)(v2 + (255.0 - v2) * ((v1 - 127.5) / 127.5) * (0.5 - Math.abs(v2-127.5)/255.0));
}else{
return (int)(v2 - v2 * ((127.5 - v1) / 127.5) * (0.5 - Math.abs(v2-127.5)/255.0));
}
}
private int modeFive(double v1, double v2) {
if ( v1 > 127.5 ){
return (int)(v2 + (255.0 - v2) * ((v1 - 127.5) / 127.5));
}else{
return (int)(v2 * v1 / 127.5);
}
}
private void checkImages(BufferedImage src) {
int width = src.getWidth();
int height = src.getHeight();
if(secondImage == null || secondImage.getWidth() > width || secondImage.getHeight() > height) {
throw new IllegalArgumentException("the width, height of the input image must be great than blend image");
}
}
}
如果觉得效果很有趣,请顶一下,谢谢!
转载文章请注明
分享到:
相关推荐
不能调用图像处理库的缩放函数来完成; 2.2:图像变形 记[x’, y’]=f([x, y])为像素坐标的一个映射,实现f所表示的图像形变。f的逆映射为: 其中, 都是中心归一化坐标,请先进行转换; 3.1:高斯滤波 实现...
该算法通过亮度归一化对图像序列进行预处理,用以降低光照变化造成的误检,根据场景中不同像素点的特点,对图像进行分类处理,单模态类的像素用中值法进行背景建模,多模态类的像素用混合高斯模型建模。实验结果表明...
为了更好地滤除图像中多种类型的噪声污染,提出了一种新的图像混合自适应滤波器。该滤波器首先基于图像中每个像素八个方向上的基本梯度,及其3×3邻域窗口像素的结构和连通特性,提出了九条像素类型判别规则,把图像...
1.0.5 为什么大多数图像处理算法都参照灰度图像进行,而实际中遇到的都是彩色图像?.....................................................................................2 1.0.6 一幅数字图像是如何形成的?......
图像处理是指使用计算机算法和技术对图像进行分析、增强、修改或生成的过程。其中,背景抠图(Background Matting)是图像处理中的一项重要任务,其目标是将图像中的前景对象与背景进行分离。 下面是对图像处理中...
1.0.5 为什么大多数图像处理算法都参照灰度图像进行,而实际中遇到的都是彩色图像? 2 1.0.6 一幅数字图像是如何形成的? 2 1.0.7 如果一个传感器对应物理世界中的一个小片,如何能让多个传感器对应场景中的同一...
基于Welsh算法的灰度图像彩色化处理及优化python实现源码+项目说明+详细注释.zip 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、...
高斯混合聚类判断端元类别;高斯混合聚类;像素点分类
为了在滤波的同时较好地保留边缘细节,提出一种基于像素点分类的激光主动成像混合滤波方法,将像素点根据其轮廓曲率进行分类,使用Lee滤波去除散斑噪声,使用模糊加权均值滤波器滤除其余混合噪声。定义一种轮廓点...
大眼仔旭给大家分享一款轻量级的图像处理工具。Hornil StylePix Pro 中文注册版是一个拥有许多先进功能的图形编辑程序。Stylepix是“样式图片”缩写,这意味着你的图片具有一个良好的风格。Hornil StylePix Pro 中文...
这是一项小功能,旨在将较小的图像输入到较大的图像。 它在多种情况下都很方便——无论是图像还是视频(也许我稍后会为视频编写一个包装函数)。 它可用于隐藏对象(例如对... 根据上述参数生成图像混合,返回新图像。
基本图像处理和图像分析操作 光栅(又名bitblt) 对任意像素深度的图像进行仿射变换(缩放,平移,旋转,剪切) 射影和双线性变换 二进制和灰度形态,秩过滤器和卷积 种子填充物和连接的组件 在相同比例和比例变化...
以高斯混合模型的参数设想和高斯分布的特定规律来模拟红外图像的像素分布和动态区间,通过对分割到高斯混合模型后的图像信息进行相应的变换,来实现对红外图像的自适应均衡和对比度增强处理。实验效果表明,图像亮度...
FreeImage 是一款免费的、开源的、跨平台(Windows 、Linux 和Mac OS X )的,支持20 多种图像类型的(如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。其最大优点就是采用插件驱动型架构,具有快速、灵活、简单...
使用高级的图像日志工具,可以很容易地利用某些操作...该方法能够在像素级实现高精度的图像处理,并在三种不同的数据集上进行了严格的实验。 索引术语-图像伪造,篡改定位,分割,重采样,LSTM, CNN,编码器,解码器
由于织物背景纹理信息对织物疵点检测影响较大,采用均值采样对其进行预处理来消除背景纹理的影响,用高斯混合模型对新得到的图像进行处理。在进行高斯混合模型计算时分为E步骤、M步骤。E步骤初始化参数,计算样本...
图像的边缘是指图像灰度值的不连续点或变化剧烈的点的集合,图像的边缘提取是模式识别中物体特征抽取的重要环节之一,基于梯度的...本文以橡胶圈的气泡缺陷为例,提出了一种基于数字图像处理的混合边缘检测算法,并给出
比较了这两种混合模型对图像建模的结果,并用数据说明高斯-瑞利混合模型拟合图像的像素分布误差更小。采用最大熵方法确定图像的最佳分类数,采用马尔可夫随机场(MRF)方法及新的势能函数完成图像的分割,采用迭代条件...