Alpha半透明图形叠加算法Matlab+Verilog实现
0赞
发表于 2013/6/27 16:04:47
阅读(36663)
Alpha图形叠加算法Matlab+Verilog实现
1.1.Alpha算法的研究
Alpha通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明[15]。
半透明混合算法目前在常用到的算法是AlphaBlend。其算法如下:假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,1为完全透明,0为完全不透明)。Alpha每个通道色彩混合公式如下:
R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。改变这个 alpha 值可以得到一个渐变的效果。分离RGB色用"位与"、"移位"运算的方法。
透明的比例按2的N次幂来分级,这样可以快速运算。如果是按256级Alpha = 1/256,B图的权重 = (256-n)/256,则A图的权重= n/256,由式 6-1可以得到红色通道256级半透明算法:
1.2. Alpha算法实现
1.2.1. Matlab代码
% ----------------------------------------------------------------------- % CONFIDENTIAL IN CONFIDENCE % This confidential and proprietary software may be only usedasauthorized % by a licensing agreement from CrazyBingo (Thereturnofbingo). % In theeventof publication, the following noticeisapplicable: % Copyright (C) 2011-201x CrazyBingo Corporation % The entire notice above must be reproduced on all authorized copies. % Author : CrazyBingo % Technology blogs : http://blog.chinaaet.com/crazybingo% http://www.cnblogs.com/crazybingo% Eamil Address : thereturnofbingo@gmail.com % Filename : RGB_Alpha.m % Data : 2013-04-22 % Version : 1.0 % Description : Alpha Algorithm of 2 RGB Image. % Modification History : % Data By Version Change Description %======================================================================= % 13/04/22 CrazyBingo 1.0 Original % ----------------------------------------------------------------------- clear all; %清除Matlab缓存数据 % ----------------------------------------------------------------------- % Read PC iamge to Matlab IMG1 = imread('E:\Matlab_Information\Matlab_Project\BMP\Fish2.bmp'); % 读取RGB文件,X光的鱼图 IMG2 = imread('E:\Matlab_Information\Matlab_Project\BMP\Water.bmp'); % 读取RGB文件,绿叶湖泊 h = size(IMG1,1); % 读取图像高度 w = size(IMG1,2); % 读取图像宽度 figure(1); subplot(1,2,1); imshow(uint8(IMG1)); subplot(1,2,2); imshow(uint8(IMG2)); % ----------------------------------------------------------------------- % IMG1 add tO IMG2 with alpha algorthm ALPHA_PARAM = 0.6; IMG1 =double(IMG1); IMG2 =double(IMG2); IMG3 = zeros(h,2,3);fori = 1 : hforj = 1 : w IMG3(i,j,1) = IMG1(i,j,1)*ALPHA_PARAM + IMG2(i,j,1)*(1-ALPHA_PARAM); IMG3(i,j,2) = IMG1(i,j,2)*ALPHA_PARAM + IMG2(i,j,2)*(1-ALPHA_PARAM); IMG3(i,j,3) = IMG1(i,j,3)*ALPHA_PARAM + IMG2(i,j,3)*(1-ALPHA_PARAM); end end % ------------------------------------------------------------------------- figure(2); imshow(uint8(IMG3)); title('Alpha Image with IMG1 & IMG2'); imwrite(IMG3,'E:\Matlab_Information\Matlab_Project\RGB_Alpha_Process\RGB_Alpha.bmp'); %保存重建后的BMP
1.2.2. 效果图
1.2.3.半透明算法的FPGA实现
在Verilog中,通过组合逻辑,运用内嵌乘法器,以及移位运算,可以快速实现对两幅图像的透明度的实时控制。设计中设定了256级半透明级数,通过按键来控制alpha_data的参数,从而实现调节两幅图像之间的透明度。Verilog算法如下所示:
wire [15:0] red_data = ((8'd255-alpha_data)* lcd_data_reg[15:11]+ alpha_data * lcd_data_in[15:11])>> 8; //红色通道 wire [15:0] gre_data = ((8'd255-alpha_data)*lcd_data_reg[10:5]+ alpha_data * lcd_data_in[10:5])>> 8; //绿色通道 wire [15:0] blu_data = ((8'd255-alpha_data)*lcd_data_reg[4:0]+ alpha_data * lcd_data_in[4:0])>> 8; //蓝色通道 assign lcd_data = disp_area?{red_data[4:0],gre_data[5:0], blu_data[4:0]} : lcd_data_reg; //RGB合并
为测试半透明算法,将分形图与彩条叠加,通过外部按键的调节,验证了此半透明算法的正确性。VGA半透明图形叠加如下图所示,此时即可见分形图,又可见8条彩条,两者相互融合。
图 6-1 半透明算法验证图