2021年度基礎ユニット1

テキスト

1週目

2週目

リンク集

Q and A

Q 画像を拡大・縮小するために、resize()関数を使っては駄目でしょうか?

それは勘弁してください。拡大・縮小の考え方を理解してもらうのが目的なのです。

Q 1週目の演習問題3で、カラー画像をグレースケール画像に変換するのに、filter()関数を使っては駄目でしょうか?

使ってもらって結構です。

Q すぐ下の演習問題5のヒントを見てもよくわかりません。

A 以下のプログラムが参考になるのではないでしょうか!(出血多量大サービス)

String target = "sky.jpg";
float alpha = 1.2, cx, cy, cx2, cy2;
int w, h;
int w2, h2;
PImage orgImg, scaleImg;
int mode = 0;
   
void setup() {
    size(100, 100);
    surface.setResizable(true);
    orgImg = loadImage(target);
    w = orgImg.width;
    h = orgImg.height;    
    surface.setSize(w, h);
   
    w2 = int(alpha * w);
    h2 = int(alpha * h);
    cx = (w - 1)/2.0;
    cy = (h - 1)/2.0;
    cx2 = (w2 - 1)/2.0;
    cy2 = (h2 - 1)/2.0;
    scaleImg = createImage(w2, h2, RGB);
  
    for (int y2 = 0; y2 < h2; y2++) {
        for (int x2 = 0; x2 < w2; x2++) {
          float x = (x2 - cx2) / alpha + cx;
          float y = (y2 - cy2) / alpha + cy;
   
          int LUx = int(x), LUy = int(y);
          int RUx = (int(x) + 1) % w, RUy = int(y);
          int LDx = int(x), LDy = (int(y) + 1) % h;
          int RDx = (int(x) + 1) % w, RDy = (int(y) + 1) % h;
   
          float red = (int(x) + 1 - x) * (int(y) + 1 - y) * red(orgImg.pixels[LUy * w + LUx]) + 
            (x - int(x)) * (int(y) + 1 - y) * red(orgImg.pixels[RUy * w + RUx]) +
            (int(x) + 1 - x) * (y - int(y)) * red(orgImg.pixels[LDy * w + LDx]) +
            (x - int(x)) * (y - int(y)) * red(orgImg.pixels[RDy * w + RDx]);
          
          // greenとblueはご自分で!     
   
          scaleImg.pixels[y2 * w2 + x2] = color(int(red), int(green), int(blue));
        }
    }
  
    scaleImg.save(convert(target));
}
  
void draw() {
    if (mode == 0) {
        image(orgImg, 0, 0);
    } else {
        image(scaleImg, 0, 0);
    }
}
  
void mousePressed() {
    if (mode == 0) {
        mode = 1;
        surface.setSize(w2, h2);
    }
}
  
String convert(String filename) {
    int n = filename.indexOf(".");
    String ext = filename.substring(n);
    String base = filename.substring(0, n);
    String plus = "_s1";
    if (alpha < 1.0) {
        plus = "_s2";
    }
    String neo_filename = base + plus + ext;
    return neo_filename;
}
    

Q 演習問題5のfor文のところがよくわかりません。

A 以下のプログラムが参考になるのではないでしょうか!(出血大サービス)

String target = "sample11.jpg";
float alpha = 1.2, cx, cy, cx2, cy2;
int w, h;
int w2, h2;
PImage orgImg, scaleImg;
int mode = 0;
      
void setup() {
    size(100, 100);
    orgImg = loadImage(target);
    w = orgImg.width;
    h = orgImg.height;
  
    //Windowの大きさを(w, h)にするところはご自分で!
  
    w2 = int(alpha * w);
    h2 = int(alpha * h);
    cx = (w - 1)/2.0;
    cy = (h - 1)/2.0;
    cx2 = (w2 - 1)/2.0;
    cy2 = (h2 - 1)/2.0;
    scaleImg = createImage(w2, h2, RGB);
        
    for (int y2 = 0; y2 < h2; y2++) {
        for (int x2 = 0; x2 < w2; x2++) {
            float x = (x2 - cx2) / alpha + cx;
            float y = (y2 - cy2) / alpha + cy;
            
            int LUx = int(x), LUy = int(y);
            int RUx = (int(x) + 1) % w, RUy = int(y);
            int LDx = int(x), LDy = (int(y) + 1) % h;
            int RDx = (int(x) + 1) % w, RDy = (int(y) + 1) % h;
            
            float red = (int(x) + 1 - x) * (int(y) + 1 - y) * red(orgImg.pixels[LUy * w + LUx]) + 
            // この後はご自分で!
            ;
            float green = (int(x) + 1 - x) * (int(y) + 1 - y) * green(orgImg.pixels[LUy * w + LUx]) +
            // この後はご自分で!
            ;
            float blue = (int(x) + 1 - x) * (int(y) + 1 - y) * blue(orgImg.pixels[LUy * w + LUx]) + 
            // この後はご自分で!
            ;
              
            scaleImg.pixels[y2 * w2 + x2] = color(int(red), int(green), int(blue));            
        }
    }
        
    scaleImg.save(convert(target));
}
   
void draw() {
    if (mode == 0) {
        image(orgImg, 0, 0);
    }
    else {
        image(scaleImg, 0, 0);
    }
}
     
void mousePressed() {
    if (mode == 0) {
        mode = 1;
        //Windowの大きさを(w2, h2)にするところはご自分で!
    }
}
  
String convert(String filename) {
    int n = filename.indexOf(".");
    String ext = filename.substring(n);
    String base = filename.substring(0, n);
    String plus = "_s1";
    if (alpha < 1.0) {
        plus = "_s2";
    }
    String neo_filename = base + plus + ext;
    return neo_filename;
}
    

Q 演習問題4がわかりません。

A まず、画像は2次元データですが、PImageの中にあるpixelsという配列は1次元配列です。 1行目の各ピクセルが左から順番に格納され、次に2行目の各ピクセルが左から順番に格納されるというのが最後の行まで続いています。 したがって、画像の横幅がwidthとすると、座標(x, y)のピクセル値はpixels[y * width + x]に格納されていることになります。これを踏まえて、ピクセルを縦横1/nに間引くためのforループの構成方法は2つあります。

間引き後の配列に合わせたforループ
String target = "test1.jpg";
PImage orgImg = loadImage(target);
int w = orgImg.width;
int h = orgImg.height;
int n = 4;
int w2 = w / n;
int h2 = h / n;
PImage dImg = createImage(w2, h2, RGB);
    
for (int y = 0; y < h2; y++) {
  for (int x = 0; x < w2; x++) {
    dImg.pixels[y * w2 + x] = orgImg.pixels[(n * y) * w + (n * x)];
  }
}
        
間引く対象の配列に合わせたforループ
String target = "test1.jpg";
PImage orgImg = loadImage(target);
int w = orgImg.width;
int h = orgImg.height;
int n = 4;
int w2 = w / n;
int h2 = h / n;
PImage dImg = createImage(w2, h2, RGB);
    
for (int y = 0; y < h; y = y + n) {
  for (int x = 0; x < w; x = x + n) {
    dImg.pixels[(y / n) * w2 + (x / n)] = orgImg.pixels[y * w + x];
  }
}
        

Q 1週目の演習2の文字列の変換方法がprocessingのテキストを見てもわかりません。

A 以下のプログラムが参考になるのではないでしょうか!(出血大サービス)

String filename = "test1.jpg";
int n = filename.indexOf(".");
String ext = filename.substring(n);
String base = filename.substring(0,n);
String neo_filename = base + "_raw" + ext;
println(neo_filename);
    

Q 提出は来週までですか?それとも、1週目と2週目まとめて再来週までですか?

A 1週目と2週目をまとめて1通のレポートにして、再来週までに提出してください。

Q レポート提出場所はmanabaのレポートの場所になりますか?

A その通りです。

Q 自己確認問題と演習問題の違いを教えてください。

A 自己確認問題は、自分で確認すればよく、レポートに書く必要はありません。演習問題は、その問いに対する回答をレポートに書いてください。

Q 演習問題で報告しなければならない項目を教えてください。

A ソースコードと実行結果(最低2つ)です。 ソースコード中の入力画像ファイ名が変化するからといって、ソースコードを2つ載せる必要はありません。 実行結果は入力画像と処理結果画像のペアです。 感じたこと・工夫したこと・発見したことなども書いていただけると良いのですが、今年はなくてもよいことにします。 また、ソースコードにコメントはつけなくて結構です。