キー | 画像 | 意味 | 特徴 |
---|---|---|---|
0 | 元.jpg | 元画像 | |
1 | 1セピア.jpg | 元画像をセピア化した画像 | 古い変色したアナログ写真のような色になる |
2 | 2エンボス1.png | 右と下に1ピクセルずつずらしてエンボス処理した画像 | 白い部分が盛り上がり、黒い部分がくぼんでいて、左上から光が当たっているように見える サイズが元画像より縦横1ピクセルずつ小さくなる |
3 | 2エンボス2.png | 右と下に2ピクセルずつずらしてエンボス処理した画像 | 2キーの画像より凹凸が深くなったように見える サイズが元画像より縦横2ピクセルずつ小さくなる |
4 | 3ブラー1.jpg | σ=1 で左上-右下方向のモーションブラーをかけた画像 | カメラを左上から右下に動かして撮ったように見える |
5 | 3ブラー5.jpg | σ=5 で左上-右下方向のモーションブラーをかけた画像 | 全体的にぼやけて見える |
// 画像用の変数 PImage[] img = new PImage[6]; // 出力ファイル名 String[] fName = {"元", "1セピア", "2エンボス1", "2エンボス2", "3ブラー1", "3ブラー5"}; int w, h; void setup() { size(800, 600); w = width; h = height; img[0] = loadImage("元.jpg"); img[0].resize(w, h); textFont(createFont("MS Pゴシック", 48)); background(0); image(img[0], 1, 1); sepia(1); // セピア化した画像をimg[1]に保存 emboss(1, 2);// 右下方向に1ピクセルずつずらしてエンボス処理した画像をimg[2]に保存 emboss(2, 3);// 右下方向に2ピクセルずつずらしてエンボス処理した画像をimg[3]に保存 motionBlur(10, 1, 1, 1, 4); // σ=1で左上-右下方向のモーションブラーをかけた画像をimg[4]に保存 motionBlur(10, 5, 1, 1, 5); // σ=5で左上-右下方向のモーションブラーをかけた画像をimg[5]に保存 println("完了"); } void draw() { } // セピア化(課題1) void sepia(int n) { // n番を元画像と同じサイズの黒画像にする img[n] = createImage(w, h, ARGB); for (int j=0; j<h; j++) { for (int i=0; i<w; i++) { // 元画像の(i, j)のピクセルの赤・緑・青の成分をR, G, Bに入れる // R, G, Bから計算した値をFに入れる // 出力画像の(i, j)のピクセルにFを元にして計算したR', G', B'の色を設定する } } img[n].save("data/"+ fName[n] +".jpg"); } // エンボス処理(課題2) void emboss(int gap, int n) { // n番を元画像より縦横ともgapだけ小さいサイズの黒画像にする img[n] = createImage(w-gap, h-gap, ARGB); for (int j=0; j<h-gap; j++) { for (int i=0; i<w-gap; i++) { // br1に元画像の(i+gap, j+gap)のピクセルの明度を入れる // br2に元画像の(i, j)のピクセルの明度を反転させた値を入れる // 出力画像の(i, j)のピクセルに明度(br1+br2-128)の色を設定する } } img[n].save("data/"+ fName[n] +".png"); } // モーションブラーをかける(課題3) void motionBlur(int radius, double sigma, float dx, float dy, int n) { // n番を元画像と同じサイズの黒画像にする img[n] = createImage(w, h, ARGB); img[n].save("data/"+ fName[n] +".jpg"); } void keyPressed() { int k = key-'0'; if (k>=0 && k<=5) { background(0); image(img[k], 0, 0); fill(255, 0, 0); text(fName[k], 30, height-30); fill(255); } }
PVector dir = new PVector(dx, dy);// dx, dyを成分とするベクトル dir.normalize(); // dirを規格化
double mask = Math.exp(-(x*x+y*y)/2/sigma/sigma);
double mask = Math.exp(-Math.pow(x*dir.y-y*dir.x, 2)/2/sigma/sigma);