圖像處理------光束效果 分類: 視頻圖像處理 2015-07-24 09:34 30人閱讀 評論(0) 收藏

原理:java

光束濾鏡,對一幅圖像完成光束效果,好似有一束光從圖像自己激發出來,按照必定的角度ide

散發開來,光束濾鏡是一種圖像疊加效果,首先要藉助於以前的完成的移動模糊濾鏡,將一this

幅圖像按照必定的閾值二值化之後,加以移動模糊濾鏡,將移動模糊以後的圖像和原圖像疊url

加就產生了光束濾鏡效果。spa

 

對光束濾鏡而言,其最終效果除了移動模糊的三個參數之外,還取決於如下兩個參數:.net

a.      圖像RGB閾值的選取,建議能夠直方圖之後選取,程序以threshold表示orm

b.      光強度大小的值的選取,程序中以strength表示blog

 

程序運行效果以下:ip


關鍵代碼解析:ci

計算RGB閾值代碼以下– 輸入的閾值範圍爲[0,1]

intthreshold3 = (int)(threshold*3*255);

 

求取二值像素的代碼以下:

int l = r + g + b;

if (l < threshold3)

    [x] =0xff000000;

else {

l /= 3;

pixels[x] = a | (l << 16) | (l << 8) | l;

}

像素疊加乘以強度係數的代碼以下(其中r,g,b分別表明RGB的三個顏色份量值):

r = PixelUtils.clamp((int)(r * strength) + r2);

g = PixelUtils.clamp((int)(g * strength) + g2);

b = PixelUtils.clamp((int)(b * strength) + b2);

光束濾鏡的徹底源代碼以下:

[java]  view plain copy
  1. <span style="font-weight: normal;">/* 
  2. ** Copyright 2012 @gloomyfish. All rights reserved. 
  3. */  
  4.   
  5. package com.process.blur.study;  
  6.   
  7. import java.awt.image.BufferedImage;  
  8.   
  9. public class LaserFilter extends MotionFilter {  
  10.   
  11.     private float threshold = 0.5f;  
  12.     private float strength = 0.8f;  
  13.   
  14.     public LaserFilter() {  
  15.     }  
  16.   
  17.     public void setThreshold( float threshold ) {  
  18.         this.threshold = threshold;  
  19.     }  
  20.       
  21.     public float getThreshold() {  
  22.         return threshold;  
  23.     }  
  24.       
  25.     public void setStrength( float strength ) {  
  26.         this.strength = strength;  
  27.     }  
  28.       
  29.     public float getStrength() {  
  30.         return strength;  
  31.     }  
  32.       
  33.     public BufferedImage filter( BufferedImage src, BufferedImage dst ) {  
  34.         int width = src.getWidth();  
  35.         int height = src.getHeight();  
  36.         int[] pixels = new int[width];  
  37.         int[] srcPixels = new int[width];  
  38.   
  39.         BufferedImage laserImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);  
  40.   
  41.         int threshold3 = (int)(threshold*3*255);  
  42.         for ( int y = 0; y < height; y++ ) {  
  43.             getRGB( src, 0, y, width, 1, pixels );  
  44.             for ( int x = 0; x < width; x++ ) {  
  45.                 int rgb = pixels[x];  
  46.                 int a = rgb & 0xff000000;  
  47.                 int r = (rgb >> 16) & 0xff;  
  48.                 int g = (rgb >> 8) & 0xff;  
  49.                 int b = rgb & 0xff;  
  50.                 int l = r + g + b;  
  51.                 if (l < threshold3)  
  52.                     pixels[x] = 0xff000000;  
  53.                 else {  
  54.                     l /= 3;  
  55.                     pixels[x] = a | (l << 16) | (l << 8) | l;  
  56.                 }  
  57.             }  
  58.             setRGB( laserImg, 0, y, width, 1, pixels );  
  59.         }  
  60.   
  61.         laserImg = super.filter(laserImg, null );  
  62.           
  63.         for ( int y = 0; y < height; y++ ) {  
  64.             getRGB( laserImg, 0, y, width, 1, pixels );  
  65.             getRGB( src, 0, y, width, 1, srcPixels );  
  66.             for ( int x = 0; x < width; x++ ) {  
  67.                 int rgb = pixels[x];  
  68.                 int a = rgb & 0xff000000;  
  69.                 int r = (rgb >> 16) & 0xff;  
  70.                 int g = (rgb >> 8) & 0xff;  
  71.                 int b = rgb & 0xff;  
  72.                   
  73.                 int rgb2 = srcPixels[x];  
  74.                 // int a2 = rgb2 & 0xff000000;  
  75.                 int r2 = (rgb2 >> 16) & 0xff;  
  76.                 int g2 = (rgb2 >> 8) & 0xff;  
  77.                 int b2 = rgb2 & 0xff;  
  78.                   
  79.                 if ( r > 0 ) {  
  80.                     r = clamp((int)(r * strength) + r2);  
  81.                     g = clamp((int)(g * strength) + g2);  
  82.                     b = clamp((int)(b * strength) + b2);  
  83.                 } else {  
  84.                     r = r2;  
  85.                     g = g2;  
  86.                     b = b2;  
  87.                 }  
  88.   
  89.                 rgb = a | (r << 16) | (g << 8) | b;  
  90.                 pixels[x] = rgb;  
  91.             }  
  92.             setRGB( laserImg, 0, y, width, 1, pixels );  
  93.         }  
  94.   
  95.         return laserImg;  
  96.     }  
  97.       
  98.     public String toString() {  
  99.         return "Light/Laser...";  
  100.     }  
  101. }  
  102. </span>  
相關文章
相關標籤/搜索