「小さなフィルタのサンプル3」の編集履歴(バックアップ)一覧はこちら

小さなフィルタのサンプル3」(2010/05/30 (日) 21:30:45) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

ベクトルB=(1,1,1)として 各ピクセルの色をt*OBであらわされる直線からの距離に応じて、色を塗り替えるプログラム。 RGB空間を囲む6枚の平面との交点で色がとどまるように変更したいんだけど、少し計算処理を組み込むのがめんどくさいのでとまっています。 これが仕事なら真面目に作るんだけど仕事でもないのでとめています。 実は変数を少し弄ると、格段にフィルタの処理結果が良くなりますが、これはまだ模索中です。 public Bitmap lineFilter(Bitmap pictIn) { //テンプレ Color C1; this.h = pictIn.Height; this.w = pictIn.Width; double r1; double r2; double [] vecOB = {1,1,1}; double [] vecOH = {0, 0, 0}; double [] vecOA = {0, 0, 0}; double [] vecHA = {0, 0, 0}; double [] vecOA2 = { 0, 0, 0 }; double LenOH, LenOB,LenHA=0; double a = -1.0; double b = 2.0; LenOB=Math.Sqrt(vecOB[0]* vecOB[0]+vecOB[1]* vecOB[1]+vecOB[2]* vecOB[2]); pictOut = new Bitmap(this.w, this.h); for (int i = 0; i < this.w; i++) { for (int j = 0; j < this.h; j++) { LenHA = 0; C1 = pictIn.GetPixel(i, j); vecOA[0] = C1.R; vecOA[1] = C1.G; vecOA[2] = C1.B; LenOH =(vecOA[0] *vecOB[0]+vecOA[1] *vecOB[1]+vecOA[2] *vecOB[2]) /LenOB ; for (int k = 0; k < 3; k++) { vecOH[k] = LenOH / LenOB * vecOB[k]; vecHA[k] = -vecOH[k] + vecOA[k]; LenHA += vecHA[k] * vecHA[k]; } LenHA = Math.Sqrt(LenHA ); r1 = LenHA / 255.0; r2 = a * r1 + b; for (int k = 0; k < 3; k++) { vecOA2[k] = cutNum(0,255,(int)( r2 * vecHA[k] + vecOH[k])); } pictOut.SetPixel(i, j, Color.FromArgb( (int)vecOA2[0], (int)vecOA2[1], (int)vecOA2[2] )); } } return pictOut; }
ベクトルB=(1,1,1)として 各ピクセルの色をt*OBであらわされる直線からの距離に応じて、色を塗り替えるプログラム。 計算後、点の位置がRGB空間をはみ出してしまいます。 これを改善するためにRGB空間囲む6枚の平面が移動前と移動後の点に挟まるなら、平面上に色がとどまるように変更したいんだけど、少し計算処理を組み込むのがめんどくさいのでとまっています。 これが仕事なら真面目に作るんだけど仕事でもないのでとめています。 実は変数を少し弄ると、格段にフィルタの処理結果が良くなりますが、これはまだ模索中です。 public Bitmap lineFilter(Bitmap pictIn) { //テンプレ Color C1; this.h = pictIn.Height; this.w = pictIn.Width; double r1; double r2; double [] vecOB = {1,1,1}; double [] vecOH = {0, 0, 0}; double [] vecOA = {0, 0, 0}; double [] vecHA = {0, 0, 0}; double [] vecOA2 = { 0, 0, 0 }; double LenOH, LenOB,LenHA=0; double a = -1.0; double b = 2.0; LenOB=Math.Sqrt(vecOB[0]* vecOB[0]+vecOB[1]* vecOB[1]+vecOB[2]* vecOB[2]); pictOut = new Bitmap(this.w, this.h); for (int i = 0; i < this.w; i++) { for (int j = 0; j < this.h; j++) { LenHA = 0; C1 = pictIn.GetPixel(i, j); vecOA[0] = C1.R; vecOA[1] = C1.G; vecOA[2] = C1.B; LenOH =(vecOA[0] *vecOB[0]+vecOA[1] *vecOB[1]+vecOA[2] *vecOB[2]) /LenOB ; for (int k = 0; k < 3; k++) { vecOH[k] = LenOH / LenOB * vecOB[k]; vecHA[k] = -vecOH[k] + vecOA[k]; LenHA += vecHA[k] * vecHA[k]; } LenHA = Math.Sqrt(LenHA ); r1 = LenHA / 255.0; r2 = a * r1 + b; for (int k = 0; k < 3; k++) { vecOA2[k] = cutNum(0,255,(int)( r2 * vecHA[k] + vecOH[k])); } pictOut.SetPixel(i, j, Color.FromArgb( (int)vecOA2[0], (int)vecOA2[1], (int)vecOA2[2] )); } } return pictOut; }

表示オプション

横に並べて表示:
変化行の前後のみ表示: