FrontPage  ページ一覧  検索  更新履歴  RSS  ログイン

Psychlops Wiki - (Tips) Using alpha blending as a contrast filter 差分

  • 最後の更新で追加された部分はこのように表示します。
  • 最後の更新で削除された部分はこのように表示します。

{{toc}}

! 背景色を透明度付きImageで上書きする

ガウシアンフィルタなどの振幅変調型のフィルタは、透明度付きImageにより再現可能です。PsychlopsのColor型の第四変数alphaは、不透明度を表し、描画する際には以下の計算式が適用されます。

合成色 = アルファ値 * 上書き色  + ( 1 - アルファ値 ) * 地の色

これはもっとも一般的なアルファ値の処理方法です。

ここで、Gabor波形などの、

輝度 = エンベロープ波(e) * キャリア波(c) + 平均輝度(m)

という波形を考えます。これをキャリア波が地の色として描画された状態で、エンベロープ波を透明度つきImageとして上書きすることを考えます。このとき、エンベロープは一様な平均輝度に(1-エンベロープ波)をアルファ値としたImageとします。

合成色 = ( 1 - e ) * m + ( 1 - ( 1 - e ) ) * ( c + m )
        = m - e*m + e*c + e*m
        = e * c + m

このように、エンベロープの係数が0〜1の間で変調し、0に近づくほどコントラストが減少するタイプの振幅変調型のフィルタは、一様な平均輝度に(1-エンベロープ波)をアルファ値としたImageを上書きすることで再現することが出来ます。ただし、書き込みバッファが8ビットしかないため、[[その際の精度落ち問題|(TechnicalNote) Problems about 8-bit quantization]]を許容できる場合に限ります。



! 透明度フィルタを作成してから書き込む

Imageにアルファ値を書き込んでおき、そのアルファ値を描画先に書き込んでおいて適用することが可能です。

{{syntax_highlight('cpp')}}
<<<
#include <psychlops.h>
using namespace Psychlops;

class GaussianEnvelope : public Image {
public:
GaussianEnvelope(double sigma) {
Color col;

int size = Math::round(sigma*6), halfsize = size/2;
int particle = (halfsize*2 == size) ? 0 : 1;
Image::set(size, size, Image::RGBA);

for(int y=-halfsize; y<halfsize+particle; y++) {
for(int x=-halfsize; x<halfsize+particle; x++) {
alpha(x+halfsize, y+halfsize, gaussian(sigma,x) * gaussian(sigma,y));
}
}
quicken();
}
double gaussian(double sigma, double x) const {
double factor = ( sigma * sqrt(2*PI) ) / 1.0;
return factor * ( ( 1.0 / ( sigma * ::sqrt(2.0*PI) ) ) * exp( -(x*x) / (2.0*sigma*sigma) ) );
}
};


void psychlops_main() {
Canvas canvas(Canvas::window);

Image grating(100,100);
for(int y=0; y<100; y++) for(int x=0; x<100; x++) grating.pix(x,y,Color(.5+.5*sin(x/10.0)));
grating.centering(0,0);

GaussianEnvelope filter(20);
filter.centering();
FigureGroup group;
group.clip(&filter).add(grating).centering();

while(!Keyboard::esc.pushed()) {
canvas.clear(Color::gray);
group.draw();
canvas.flip();
}
}
>>>