ByteArrayで画像処理~みたいな記事タイトルだと何してるかわからないので止めました;
内容自体はその続きで、ByteArray内のバイナリデータを扱って画像処理をします。
今回はVTR調変換。
これは、ダビングや経年などで劣化したVTR映像のような効果を付加するものです。
Photoshopのプラグインでも提供されていますね。
前回作ったIplImageクラスを利用していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// thick:走査線の太さ、contrast:走査線の明るさ、ghost:画像のぶれ量 private function filterVTR(img:IplImage, thick:int, contrast:int, ghost:int):void { var f:Boolean = true; var r:int = 0, g:int = 0, b:int = 0; var i:int = 0, j:int = 0; for(var y:int=0;y<img.height;y++){ f = ((y%thick*2)<thick) ? true : false; pos = img.widthStep*y; for(var x:int=0;x<img.width;x++){ i = pos + x*4, j = pos + (x + ghost)*4; r = (img.imageData[i + 1] + img.imageData[j + 1])/2; g = (img.imageData[i + 2] + img.imageData[j + 2])/2; b = (img.imageData[i + 3] + img.imageData[j + 3])/2; if(f){ r += contrast; g += contrast; b += contrast; } img.imageData[i + 1] = r; img.imageData[i + 2] = g; img.imageData[i + 3] = b; } } gammaCorrect(img, 0.8); } private function gammaCorrect(img:IplImage, param:Number):void { var lut:Vector.<int> = new Vector.<int>(256, true); var gamma:Number = param; var len:int = img.imageData.length; for(var i:int=0;i<256;i++){ lut[i] = Math.pow(i/255.0, gamma)*255.0; } for(var n:int=0;n<len;n+=4){ img.imageData[n+1] = lut[img.imageData[n+1]]; img.imageData[n+2] = lut[img.imageData[n+2]]; img.imageData[n+3] = lut[img.imageData[n+3]]; } } |
処理はこれだけ。↓のような結果が得られます(右がVTR調変換を適用した画像)。
一定間隔毎に行単位でコントラストを変化させることで走査線を引き、画像を横方向に少し動かして画素間の輝度平均を求めて合成することでゴースト(二重写り)を表現します。最後にガンマ補正を施して画像全体を輝度値を上げます(補正量は必要に応じて適宜)。
これにノイズを適当加えてやるとさらにリアルなVTR映像を表現できるかと思います。
画像効果系は専門じゃないのであまり詳しくありませんが、目で見てわかるものは楽しいですね。
関連記事:
ByteArrayで画像処理入門
ByteArrayで画像処理入門以前 2
ByteArrayで画像処理入門以前
2 Thoughts