zoukankan      html  css  js  c++  java
  • 每天进步一点点------Alpha半透明图形叠加算法Matlab+Verilog实现

    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每个通道色彩混合公式如下:

    image 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级半透明算法:

    image

    1.2. Alpha算法实现

    1.2.1. Matlab代码
    % -----------------------------------------------------------------------
    
    % CONFIDENTIAL IN CONFIDENCE
    
    % This confidential and proprietary software may be only used as authorized
    
    % by a licensing agreement from CrazyBingo (Thereturnofbingo).
    
    % In the event of publication, the following notice is applicable:
    
    % 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_InformationMatlab_ProjectBMPFish2.bmp');    % 读取RGB文件,X光的鱼图
    
    IMG2 = imread('E:Matlab_InformationMatlab_ProjectBMPWater.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); for i = 1 : h for j = 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_InformationMatlab_ProjectRGB_Alpha_ProcessRGB_Alpha.bmp');  %保存重建后的BMP
    1.2.2. 效果图

    image

    1.2.3. 半透明算法的FPGA实现

    在Verilog中,通过组合逻辑,运用内嵌乘法器,以及移位运算,可以快速实现对两幅图像的透明度的实时控制。设计中设定了256级半透明级数,通过按键来控制alpha_data的参数,从而实现调节两幅图像之间的透明度。Verilog算法如下所示:

    1 wire [15:0] red_data = ((8'd255-alpha_data)* lcd_data_reg[15:11]+  alpha_data * lcd_data_in[15:11])>> 8; //红色通道
    2  
    3 wire [15:0] gre_data =  ((8'd255-alpha_data)*lcd_data_reg[10:5]+  alpha_data * lcd_data_in[10:5])>> 8; //绿色通道
    4  
    5 wire [15:0] blu_data =  ((8'd255-alpha_data)*lcd_data_reg[4:0]+  alpha_data * lcd_data_in[4:0])>> 8; //蓝色通道
    6  
    7 assign lcd_data = disp_area?{red_data[4:0],gre_data[5:0],  blu_data[4:0]} : lcd_data_reg; //RGB合并


    为测试半透明算法,将分形图与彩条叠加,通过外部按键的调节,验证了此半透明算法的正确性。VGA半透明图形叠加如下图所示,此时即可见分形图,又可见8条彩条,两者相互融合。

    wps_clip_image-25973

    图 6-1 半透明算法验证图

     
    分享到:
     
     
  • 相关阅读:
    .Net语言 APP开发平台——Smobiler学习日志:Poplist控件在APP中的应用场景以及代码
    C++ STL 之 set 和 pair
    C++ STL 之 list
    安卓开发之数据库事务的使用
    安卓开发之sql语句增删改查2(利用谷歌封装好的API进行增删改查)
    安卓开发之SimpleAdapter的使用
    安卓开发之ArrayAdapter使用
    安卓开发之打气筒的使用
    安卓开发之ListView入门
    安卓开发之sql语句增删改查
  • 原文地址:https://www.cnblogs.com/kongqiweiliang/p/3258071.html
Copyright © 2011-2022 走看看