작가/코드

Processing 구현중 - Mosaic Learning 3

yuhyje 2014. 10. 19. 00:58


< ImageAnalyzer.pde >

// 이 파일은 class ColorAndBrightness에 대한 정보 (약간)

// 색깔이나 밝기 등 이미지 정보를 분석하는 데에 필요한 함수들이

// (가득) 들어 있는 공간이다.

  

class ColorAndBrightness

{

  public float brightness;

  public color col;

 

  // Constructor

  public ColorAndBrightness(color col, float brightness)

  {

    this.brightness = brightness;

    this.col = col;

  }

}

 

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  // Return average color and brightness of specific area from the image

  // 원이미지 각 부분의 (평균)색깔과 (평균)밝기 데이터를

  // 위 클래스변수형으로 묶어서 리턴하는 함수

  // 원이미지의 각 부분 정보

 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



 

public ColorAndBrightness averageColorOfTile(PImage picture, int x, int y, int w, int h)

// picture = 원이미지 파일

// x = 원이미지에서의 x 좌표값 / y = 원이미지에서의 y 좌표값

// w = 원이미지 조각의 가로 길이 / h = 원이미지 조각의 세로 길이

{

  float r = 0;

  float g = 0;

  float b = 0;

  float brightness = 0;

 

  int repeat = 0;

  for (int i = y * picture.width + x ; repeat != h ; I += picture.width)

  // 원이미지 포문 (1) 세로방향

  // i = 현재 지점까지의 픽셀 개수

  // i 값은 왼쪽 위부터 오른쪽(아래)으로 순차 이동

  // 원이미지 조각의 세로 길이만큼 반복되지 않으면 (repeat != h이면)

  // 계속 돌려라.

  {

    repeat++;

    // 물론 repeat 값은 가로줄 하나가 끝날(시작할) 때마다 1씩 증가시킨다.

    for (int j = i ; j < i + w ; j++) // 명재코드 수정

    // 원이미지 포문 (2) 가로방향

    {

      r += red(picture.pixels[j]);

      g += green(picture.pixels[j]);

      b += blue(picture.pixels[j]);

      brightness += brightness(picture.pixels[j]);

      // 원이미지 조각 정보 계산 (1) 원이미지 조각의 전체 픽셀 값 합산

    }

  }

 

  r = r / (w * h);

  g = g / (w * h);

  b = b / (w * h);

  brightness = brightness / (w * h);

  // 원이미지 조각 정보 계산 (2) 평균

  color aColor = color(r, g, b);

  return new ColorAndBrightness(aColor, brightness);

  // 새 변수 만들면서 동시에 리턴

}

 

// Return average brightness of the entire image

public float averageBrightness(PImage picture) // 타일

{

  float b=0;

 

  for (int i = 0; i < picture.pixels.length; i++)

  {

    b += brightness(picture.pixels[i]);

  }

  b = b/picture.pixels.length;

 

  return b;

}

 

// Return average color of the entire image

// 내가 끙끙대며 픽셀정보 합한 코드를 순식간에 ㅜㅜ

public color averageColor(PImage picture) // 타일

{

  float r = 0;

  float g = 0;

  float b = 0;

 

  for (int i = 0; i < picture.pixels.length; i++)

  {

    r += red(picture.pixels[i]);

    g += green(picture.pixels[i]);

    b += blue(picture.pixels[i]);

  }

  r = r / picture.pixels.length;

  g = g / picture.pixels.length;

  b = b / picture.pixels.length;

 

  color aColor = color(r, g, b);

 

  return aColor;

}

 

int indexImage(color avC, float avB)

// 심지어 public도 적혀 있지 않음.

// public 함수와의 차이점은 무엇일까.

{

  float r = red(avC);

  float g = green(avC);

  float b = blue(avC);

  int value = 0;

 

  if (r > g && r > b) {

    if (avB >=0 && avB <= 42) {

      value = 1;

    }

    else if (avB > 42 && avB<= 85) {

      value = 2;

    }

    else if (avB > 85 && avB <= 127) {

      value = 3;

    }

    else if (avB > 127 && avB <= 170) {

      value = 4;

    }

    else if (avB > 170 && avB <= 210) {

      value = 5;

    }

    else if (avB > 210) {

      value = 6;

    }

  }


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Case (1) 해당 타일의 색깔값(RGB) Red가 가장 클 경우

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 0 <= 밝기 <= 42 --à value = 1

// 42 < 밝기 <= 85 --à value = 2

// 85 < 밝기 <= 127 --à value = 3

// 127 < 밝기 <= 170 --à value = 4

// 170 < 밝기 <= 210 --à value = 5

// 210 < 밝기 <= 255 (프로세싱 밝기의 최대값) --à value = 6

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

  else if (g > r && g > b) {

    if (avB >=0 && avB <= 42) {

      value = 7;

    }

    else if (avB > 42 && avB<= 85) {

      value = 8;

    }

    else if (avB > 85 && avB <= 127) {

      value = 9;

    }

    else if (avB > 127 && avB <= 170) {

      value = 10;

    }

    else if (avB > 170 && avB <= 210) {

      value = 11;

    }

    else if (avB > 210) {

      value = 12;

    }

  }

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Case (2) 해당 타일의 색깔값(RGB) Green이 가장 클 경우

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 0 <= 밝기 <= 42 --à value = 7

// 42 < 밝기 <= 85 --à value = 8

// 85 < 밝기 <= 127 --à value = 9

// 127 < 밝기 <= 170 --à value = 10

// 170 < 밝기 <= 210 --à value = 11

// 210 < 밝기 <= 255 (프로세싱 밝기의 최대값) --à value = 12

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

  else if (b >r && b > g) {

    if (avB >=0 && avB <= 42) {

      value = 13;

    }

    else if (avB > 42 && avB<= 85) {

      value = 14;

    }

    else if (avB > 85 && avB <= 127) {

      value = 15;

    }

    else if (avB > 127 && avB <= 170) {

      value = 16;

    }

    else if (avB > 170 && avB <= 210) {

      value = 17;

    }

    else if (avB > 210) {

      value = 18;

    }

  }

  return value;

}

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Case (3) 해당 타일의 색깔값(RGB) Blue가 가장 클 경우

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 0 <= 밝기 <= 42 --à value = 13

// 42 < 밝기 <= 85 --à value = 14

// 85 < 밝기 <= 127 --à value = 15

// 127 < 밝기 <= 170 --à value = 16

// 170 < 밝기 <= 210 --à value = 17

// 210 < 밝기 <= 255 (프로세싱 밝기의 최대값) --à value = 18

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////