alpha 数字图像处理
2016-01-19 20:39:13 u011430438 阅读数 596

图像叠加有cvAdd(),cvAddS(),cvAddWeighted()函数,其中cvAddWeighted()是可以根据权重进行融合~~水印大概就是可以根据这个做出来的


原图:test1test2

          


创建空白的img3和img4(对比cvAddWeighted()函数中的gamma的作用,但是发现不了明显的区别啊)


CVAPI(void)  cvAddWeighted( const CvArr* src1, double alpha,
                            const CvArr* src2, double beta,
                            double gamma, CvArr* dst );


#include <highgui.h>

using namespace std;
int x=0,y=0,height=320,length=480;
double alpha=0.7,beta=0.3;

int main()
{
	IplImage *img1 = cvLoadImage("test1.jpg");
	IplImage *img2 = cvLoadImage("test2.jpg");
	IplImage *img3 = cvCreateImage( cvSize(320,480),IPL_DEPTH_8U,3 );
	IplImage *img4 = cvCreateImage( cvSize(320,480),IPL_DEPTH_8U,3 );

	cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
	cvShowImage("Example1",img1);
	cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
	cvShowImage("Example2",img2);
	cvWaitKey(0);
	cvDestroyWindow("Example1");
	cvDestroyWindow("Example2");

	cvSetImageROI( img1,cvRect(0,0,height,length) );
	cvSetImageROI( img2,cvRect(0,0,height,length) );
	cvAddWeighted(img1, alpha, img2, beta,10.0,img3); 
	cvAddWeighted(img1, alpha, img2, beta,0.5,img4); 
	cvResetImageROI(img1);         
	cvNamedWindow( "Mixed1", CV_WINDOW_AUTOSIZE );         
	cvShowImage( "Mixed1", img3 );  
	cvNamedWindow( "Mixed2", CV_WINDOW_AUTOSIZE );         
	cvShowImage( "Mixed2", img4 );   
	cvWaitKey();    

	cvDestroyWindow("Mixed1");
	cvDestroyWindow("Mixed2");
	cvReleaseImage( &img1 );
	cvReleaseImage( &img2 );
	cvReleaseImage( &img3 );
	cvReleaseImage( &img4 );

	return 0; 
}

运行结果:

       

你们觉得这两个图有区别!?

2019-04-16 21:56:17 ABC13222880223 阅读数 69

一、Alpha通道的概念与功能
    在计算机图形学中,一个RGB颜色模型的真彩图形,用由红、绿、蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息。为实现图形的透明效果,采取在图形文件的处理与存储中附加上另一个8位信息的方法,这个附加的代表图形中各个素点透明度的通道信息就被叫做Alpha通道。
    Alpha通道使用8位二进制数,就可以表示256级灰度,即256级的透明度。白色(值为255)的Alpha像素用以定义不透明的彩色像素,而黑色(值为0)的Alpha通道像素用以定义透明像素,介于黑白之间的灰度(值为30-255)的Alpha像素用以定义不同程度的半透明像素。因而通过一个32位总线的图形卡来显示带Alpha通道的图形,就可能呈现出透明或半透明的视觉效果。
    一个透明或半透明图形的数学模型应当如下:
    为了便于下面的分析,设Alpha值[0,255]区间映射为[0,1]区间相对应的值表示,即Alpha值为0—1之间的数值。则图形文件中各个像素点可表示为:
    Graphx(Redx,Greenx,Bulex,Alphax)
    屏幕上相应像素点的显示值就转换为:
    Dispx(Redx*Alphax,Greenx*Alphax,Bluex*Alphax)
    Alpha通道不仅用于单个图形的透明或半透明显示,更重要的是在图像合成中被广泛运用。
    下面是如何根据Alpha通道数据进行图像混合的算法:
    事实上,我们把需要组合的颜色计算出不含Alpha分量的原始RGB分量然后相加便可。如:两幅图像分别为A和B,由这两幅图像组合而成的图像称为C,则可用如下四元组表示图A和B,三元组表示图像C:
    A:(Ra,Ga,Ba,Alphaa)
    B:(Rb,Gb,Bb,Alphab)
    C:(Rc,Gc,Bc)
    根据上述算法,则:
    Rc=Ra*Alphaa+Rb*Alphab
    Gc=Ga*Alphaa+Gb*Alphab
    Bc=Ba*Alphaa+Bb*Alphab
    这就是两图像混合后的三原色分量。如果有多幅图像需要混合,则按照以上方法两幅两幅地进行混合。       

在图像处理中,Alpha用来衡量一个像素或图像的透明度。在非压缩的32位RGB图像中,每个像素是由四个部分组成:一个Alpha通道和三个颜色分量(R、G和B)。当Alpha值为0时,该像素是完全透明的,而当Alpha值为255时,则该像素是完全不透明。 
  Alpha混色是将源像素和背景像素的颜色进行混合,最终显示的颜色取决于其RGB颜色分量和Alpha值。它们之间的关系可用下列公式来表示: 
显示颜色 = 源像素颜色 X alpha / 255 + 背景颜色 X (255 - alpha) / 255

2018-08-29 17:39:01 lxr1091392154 阅读数 132

 

转载文章地址。 https://blog.csdn.net/program_developer/article/details/80008604

matte在字典里的解释是不平滑的意思,matting在photoshop里面是指消除图像的背景边缘或者去掉粗糙点。把digital matting技术应用于图像,是基于这样一个概念,它认为一幅图像是由背景和前景合成的,只是在不同的区域两者参与的比例不一样,在只有背景的地方,前景的参与比例为0%;而在只有前景的地方,背景的参与比例为0%。因此我们把这个比例值定义为一个未知数alpha,即α。这样我们把图像I分割成一个前景对象图像F,一个背景图像B和一个alpha matte α,于是就有了digital matting的数学定义: I=α×F+(1-α)×B。如果再具体一点,针对每个像素,背景颜色为B=[RB,GB,BB],前景对象颜色为F=[RF,GF,BF, α](或者F=[αRF, αGF, αBF]),于是matting方程为I=F+(1-α)×B。通常在应用中都是求这个方程的解,以获得图像的最后分割结果,但如何来解这个方程呢?

解法:灰度图。令RF=GF=BF,这样就只剩下三个方程和两个未知量。

R=α×RF+(1-α)×RB  求RF
G=α×GF+(1-α)×GB 求GF

B= α×BF+(1-α)×BB  求α

Alpha matting技术在图像中的应用主要在对象提取上面,因此在这方面的研究比较多,主要是从单幅图像中提取物体对象,除了人工参与手动描出对象边界外。微软亚洲研究院Jian Sun等人根据Patrick P´erez等人2003年发表的Poisson Editing方法提出Poisson Matting ,实际上是将透明度作为图像的一种内在属性——“场”,变向地寻求其最优解。

下面举一些Alpha Matte的应用场景:

Alpha Matte 是以下面的图层为源,用上面的图层的Alpha通道做选区。

(1)如果Foreground的图片没有Alpha通道,那么它的选区就相当于整个Alpha通道为白色。白色代表作用下的图层不受影响,黑色代表作用下的图层全变透明。其他的按灰阶过渡。于是,做Alpha Matte的结果是,全部显示Foreground图层。

(2)如果Foreground的图片有Alpha通道,那么,做Alpha Matte 的结果是,通道中黑色区域作用下的Foreground图层全为透明。白色作用下的Foreground图层显示。

(3)如果我们对Foreground图层做了一个选区遮罩,这相当于我们对它施加了一个Alpha通道,选区内为白色,选区外为黑色。于是,做Alpha Matte 的结果是,选区内全显示,选区外为透明,不显示。

注意:实际情况中Alpha Matte是一个0到1之间的实数,比如说0.5的话我们可以用下面的公式计算:

 

图片来源于:

https://blog.csdn.net/sherry_gp/article/details/53453234

Reference:

http://blog.sina.com.cn/s/blog_4dfdfdc30100nbf0.html

2015-07-24 09:21:00 weixin_34023982 阅读数 5

基本原理:

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

 

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

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

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

张不同的图像。


两张源图像分别为:


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



三:最终程序效果如下



四:程序关键代码及解释

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

[java] view plaincopy
  1. public void getRGB(BufferedImage img, int x, int y, int width, int height, int[] pixelsData) {  
  2.         int type = img.getType();  
  3.         if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {  
  4.             img.getRaster().getDataElements(x, y, width, width, pixelsData);  
  5.         } else {  
  6.             img.getRGB(x, y, width, height, pixelsData, 0, img.getWidth());  
  7.         }  
  8.     }  

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

[java] view plaincopy
  1. public void setRGB(BufferedImage img, int x, int y, int width, int height, int[] pixelsData) {  
  2.         int type = img.getType();  
  3.         if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {  
  4.             img.getRaster().setDataElements(x, y, width, height, pixelsData);  
  5.         } else {  
  6.             img.setRGB(x, y, width, height, pixelsData, 0, width);  
  7.         }  
  8.     }  

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

[java] view plaincopy
  1. alphaBlendingImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);  

实现Alpha Blending的代码如下:

[java] view plaincopy
  1. float blendingRate = 0.5f;  
  2.     private void processPixels(int[] inPixelsOne, int[] inPixelsTwo, int[] outPixelsData, int width, int height) {  
  3.         int index = 0;  
  4.         for(int row=0; row<height; row++) {  
  5.             for(int col=0; col<width; col++) {  
  6.                 int ta = 0, tr = 0, tg = 0, tb = 0;  
  7.                 int rgb1 = inPixelsOne[index];  
  8.                 int rgb2 = inPixelsTwo[index];  
  9.                 ta = ((rgb1 >> 24) & 0xff) + ((rgb2 >> 24) & 0xff);  
  10.                 tr = ((rgb1 >> 16) & 0xff) + ((rgb2 >> 16) & 0xff);  
  11.                 tg = ((rgb1 >> 8) & 0xff) + ((rgb2 >> 8) & 0xff);  
  12.                 tb = (rgb1 & 0xff) + (rgb2 & 0xff);  
  13.                   
  14.                 int a = 0, r=0, g=0, b=0;  
  15.                 a = (int)(blendingRate *(float)ta);  
  16.                 r = (int)(blendingRate *(float)tr);  
  17.                 g = (int)(blendingRate *(float)tg);  
  18.                 b = (int)(blendingRate *(float)tb);  
  19.                   
  20.                 outPixelsData[index] = ((a << 24) & 0xFF000000)  
  21.                 | ((r << 16) & 0x00FF0000)  
  22.                 | ((g << 8) & 0x0000FF00)  
  23.                 | ((b) & 0x000000FF);  
  24.                 index++;  
  25.             }  
  26.         }  
  27.           
  28.     }  

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

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

[java] view plaincopy
  1. if (srcImageOne == null) {  
  2.     File file_001 = new File("D:\\resource\\350_001.png");  
  3.     srcImageOne = ImageIO.read(file_001);  
  4. }  
  5. if (srcImageTwo == null) {  
  6.     File file_002 = new File("D:\\resource\\350_002.png");  
  7.     srcImageTwo = ImageIO.read(file_002);  
  8. }  
2017-06-12 15:18:41 u011600592 阅读数 160

  - created by gloomyfish

基本原理:

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

 

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

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

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

张不同的图像。


两张源图像分别为:


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



三:最终程序效果如下



四:程序关键代码及解释

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



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

阅读数 8955

基本原理:图像的透明混合有个专属名词–AlphaBlending 对任意两张图像可以合成为一张图像,合成图像的像素取值根据数学公式:RGB3=(1-a)*RGB1+a*RGB2其中a为混合透明度取值范围[0,1]之间,RGB3为目标像素值,RGB1与RGB2的值分别来自两张不同的图像。两张源图像分别为:第二张源图像是房屋设

博文 来自: jia20003

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

阅读数 27

基本原理:图像的透明混合有个专属名词–AlphaBlending对任意两张图像可以合成为一张图像,合成图像的像素取值根据数学公式:RGB3=(1-a)*RGB1+a*RGB2其中a为混合透明度取值范围[0,1]之间,RGB3为目标像素值,RGB1与RGB2的值分别来自两张不同的图像。两张源图像分别为:第二张源图像是房屋设计图...

博文 来自: iteye_3606

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

阅读数 2590

基本原理:图像的透明混合有个专属名词–AlphaBlending 对任意两张图像可以合成为一张图像,合成图像的像素取值根据数学公式:RGB3=(1-a)*RGB1+a*RGB2其中a为混合透明度取值范围[0,1]之间,RGB3为目标像素值,RGB1与RGB2的值分别来自两张不同的图像。两张源图像分别为:第二张源图像是房屋设计图三:最终程序效果如下四:程序关键代码及解释获

博文 来自: mao0514

对图像处理中alpha matte的一点理解

阅读数 1398

微信公众号matte在字典里的解释是不平滑的意思,matting在photoshop里面是指消除图像的背景边缘或者去掉粗糙点。把digitalmatting技术应用于图像,是基于这样一个概念,它认为一幅图像是由背景和前景合成的,只是在不同的区域两者参与的比例不一样,在只有背景的地方,前景的参与比例为0%;而在只有前景的地方,背景的参与比例为0%。因此我们把这个比例值定义为一个未知数alph...

博文 来自: program_developer

【python图像处理】给图像添加透明度(alpha通道)

阅读数 24802

我们常见的RGB图像通常只有R、G、B三个通道,在图像处理的过程中会遇到往往需要向图像中添加透明度信息,如公司logo的设计,其输出图像文件就需要添加透明度,即需要在RGB三个通道的基础上添加alph

博文 来自: guduruyu
没有更多推荐了,返回首页