root/as3/Study/BilateralFilter/BilateralFilter.as

リビジョン 157, 1.7 kB (コミッタ: rch850, コミット時期: 4 年 前)

Added BilateralFilter? class for study. No warranty.

Line 
1 /**
2 * ...
3 * @author Default
4 * @version 0.1
5 */
6
7 package {
8         import flash.display.BitmapData;
9         import flash.geom.Rectangle;
10        
11         public class BilateralFilter {
12                 public function BilateralFilter() {
13                 }
14                
15                 public static const SIGMA_R:Number = 0.0425;
16                 public var cx:int = 5;
17                 public var cy:int = 5;
18                
19                 public function filter1(src:BitmapData, x:int, y:int):uint {
20                         var fo:Number = Number(src.getPixel(x, y) & 0xFF) / 255;;
21                         var ue:Number = 0;
22                         var shita:Number = 0;
23                         var sigma_d:Number = 0.01;
24                         var sigma_r:Number = SIGMA_R;
25                         var dx:Number = 1.0 / src.width;
26                        
27                         for (var v:int = -cy; v <= cy; ++v) {
28                                 for (var u:int = -cx; u <= cx; ++u) {
29                                         var f:Number = Number(src.getPixel(x + u, y + v) & 0xFF) / 255;
30                                         var ww:Number = get_w(fo, f);
31                                         var e:Number = get_e(u, v);
32                                         ue += e * ww * f * dx;
33                                         shita += e * ww * dx;
34                                 }
35                         }
36                        
37                         var ups:int = (int)(ue / shita * 255);
38                         if (ups < 0) ups = 0;
39                         else if (ups > 255) ups = 255;
40                         return ups | (ups << 8) | (ups << 16);
41                 }
42                
43                 public function filter(bd:BitmapData):BitmapData {
44                         var w:int = bd.width;
45                         var h:int = bd.height;
46                         var out:BitmapData = new BitmapData(w, h);
47                        
48                         bd.lock();
49                         out.lock();
50                         for (var y:int = 0; y < h; ++y) {
51                                 for (var x:int = 0; x < w; ++x) {
52                                         out.setPixel(x, y, filter1(bd, x, y));
53                                 }
54                         }
55                         bd.unlock();
56                         out.unlock();
57                        
58                         return out;
59                 }
60                
61                 public function get_w(fo:Number, f:Number):Number {
62                         return Math.exp(-0.5 * (fo - f) * (fo - f) / (SIGMA_R * SIGMA_R));
63                 }
64                
65                 public function get_e(u:int, v:int):Number {
66                         return Math.exp(-0.5 * (u * u + v * v) / (cx * cy));
67                 }
68         }
69 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。