// 画像用の変数
PImage[] img = new PImage[9];
// 出力ファイル名
String[] fName = {"元", "1プレヴィットX", "1プレヴィットY",
"1ソーベルX", "1ソーベルY", "2ラプラシアン縦横", "2ラプラシアン全",
"3プレヴィット合成", "3ソーベル合成"};
int w, h;
// マスク
int[] mask_prewittX = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
int[] mask_prewittY = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int[] mask_sobelX = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int[] mask_sobelY = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int[] mask_laplacian4 = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int[] mask_laplacian8 = {0, 0, 0, 0, 0, 0, 0, 0, 0};
void setup() {
size(800, 600);
w = width;
h = height;
img[0] = loadImage("元.jpg");
img[0].resize(w, h);
img[0].filter(GRAY);
// 1~8番を元画像と同じ画像にする
for (int i=1; i<=8; i++) {
img[i] = img[0].get();
}
textFont(createFont("MS Pゴシック", 48));
single(mask_prewittX, 1); // プレヴィットフィルタ(X)でエッジ抽出した画像をimg[1]に保存
single(mask_prewittY, 2); // プレヴィットフィルタ(Y)でエッジ抽出した画像をimg[2]に保存
single(mask_sobelX, 3); // ソーベルフィルタ(X)でエッジ抽出した画像をimg[3]に保存
single(mask_sobelY, 4); // ソーベルフィルタ(Y)でエッジ抽出した画像をimg[4]に保存
single(mask_laplacian4, 5); // ラプラシアンフィルタ(横・縦)でエッジ抽出した画像をimg[5]に保存
single(mask_laplacian8, 6); // ラプラシアンフィルタ(全方向)でエッジ抽出した画像をimg[6]に保存
compose(mask_prewittX, mask_prewittY, 7); // 縦横のプレヴィットフィルタの結果を合成した画像をimg[7]に保存
compose(mask_sobelX, mask_sobelY, 8); // 縦横のソーベルフィルタの結果を合成した画像をimg[8]に保存
println("完了");
image(img[0], 0, 0, width, height);
}
void draw() {
}
// 1種類のフィルタでエッジ抽出する(課題1, 2)
void single(int[] mask, int n) {
for (int j=0; j<h; j++) {
for (int i=0; i<w; i++) {
// 周辺ピクセルの場合は黒にする
if (i==0 || i==w-1 || j==0 || j==h-1) {
// 出力画像の(i, j)のピクセルに明度が0の色を設定
}
// それ以外の場合は自分を含む9個のピクセルで明度を決める
else {
// 出力画像の明度の変数br
// マスク上の位置pos
for (int y=-1; y<=1; y++) {
for (int x=-1; x<=1; x++) {
// 元画像の(x+i, y+j)のピクセルの明度とマスクの値の積をbrに加える
// マスク上の位置更新
}
}
// 出力画像の(i, j)のピクセルに明度がbrの絶対値の色を設定
}
}
}
img[n].save("data/"+ fName[n] +".png");
}
// 複数方向のフィルタの結果を合成する(課題3)
void compose(int[] mask1, int[] mask2, int n) {
}
void keyPressed() {
int k = key-'0';
if (k>=0 && k<=8) {
background(0);
image(img[k], 0, 0, width, height);
fill(255, 0, 0);
text(fName[k], 30, height-30);
fill(255);
}
}