목차

1. 영상처리에 대한 소개

2. 디지털 영상처리의 기본

3. 점처리

4. 영역처리

5. 프레임처리




3. 점처리(Pixel Point Process)


(1) 보수연산(Complement Operation)


반전 해주는 연산


I(x,y) + O(x,y) = 255

O(x,y) - 255 = I(x,y)



  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX;x++)
  3.         image[y][x] = 255 - image[y][x];

(2) 이진화연산(Binarization Operation)


임계값을 기준으로 크면 흰색, 작으면 검정색으로 해주는 연산


if    I(x,y) <= threshold

O(x,y) = 0;

else

O(x,y) = 255;


  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX;x++)
  3.         if(image1[y][x] > 100)  // 100은 threshold
  4.             image2[y][x] = 255;     // threshold 보다 크면
  5.         else
  6.             image2[y][x] = 0;       // threshold 보다 작으면

(3) RGB Channel


컬러 영상에서 RGB 채널을 분리하는 연산


  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX*3;x+=3)            // 추출할 색상 x값 (R : 0 G : 1 B : 2)
  3.         image2[y][x] = image1[y][x];

(4) CMY Channel


컬러 영상에서 CMY 채널을 분리하는 연산


  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX*3;x+=3)            // 추출할 색상 x값 (R : 0 G : 1 B : 2)
  3.         image2[y][x] = image1[y][x];
  4.  
  5. for(y=0;y<YY;y++)
  6.     for(x=0;x<XX*3;x++)             // w-r=c w-g=m w-b=y
  7.         image2[y][x] = 255 - image2[y][x];

(5) RGB to GrayScale


컬러영상을 그레이스케일 영상으로 변환하는 연산

(R+G+B) / 3 으로 연산한다.


  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX;x++)
  3.         image2[y][x] = ((image1[y][3*x] + image1[y][3*x+1] + image1[y][3*x+2])/3);

(6) 위치변환(Geometric Transformation)


y = f(x) 그래프의 이동

1. x 축에 대하여 대칭 이동한 방정식 : y 대신에 -y를 대입한다.

-y = f(x)

2. y 축에 대하여 대칭 이동한 방정식 : x대신에 -x를 대입한다.

y = f(-x)


1) flip Image(x축 대칭)


yout = (YY - 1) - yin


  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX*3;x++)
  3.         image2[(YY-1)-y][x] = image1[y][x];

2) mirror Image(y축 대칭)


xout = (XX - 1) - xin


  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX*3;x++)
  3.         image2[y][(XX-1)-x)] = image1[y][x];

(7) 영상 히스토그램(Image Historgram)


영상의 밝기 특성을 나타낸 픽셀 분포그래프이다.

가로축은 픽셀의 값 0 ~ 255까지의 밝기(Brightness)를 나타내며, 세로축은 밝기에 해당하는 픽셀의 개수를 나타낸다.


                                                           (이미지 1)


가운데 쪽에 히스토그램이 분포해야 적당한 영상이 된다.

밝기의 빈도수를 나타낸다.


                              (이 이미지는 히스토그램 후 자르고 flip한 영상)

  1. int frequency[8] = {0};     // 3bit 영상용 빈도수
  2. int bright;                 // 밝기
  3.  
  4. for(y=0;y<YY;y++)
  5.     for(x=0;x<XX;x++){
  6.         bright = image1[y][x];  // 해당위치의 밝기
  7.         frequency[bright] = frequency[bright]+1;    //  밝기의 빈도 수 증가
  8.     }

(8) 산수 연산


입력 영상의 모든 픽셀에 상수를 더하거나 빼거나 곱하거나 나누는 연산을 한다.


1) 히스토그램 슬라이딩(Histogram Sliding)

입력 영상의 모든 픽셀에 밝기 상수를 더하거나 뺀다.

출력영상은 어두워짐


O(x,y) = I(x,y) ± brightness



※ Clamping : 산술연산을 한 후에는 결과 영상의 픽셀 값이 255보다 크면 255로, 0보다 작으면 0으로 잘라내는 것


Arithmetic Operations => 문제 : saturation(포화) => 해결 : Clamping(자름)

  1. for(y=0;y<YY;y++)
  2.     for(x=0;x<XX;x++){
  3.         image2[y][x] = image1[y][x] + 50;
  4.         if(image2[y][x] > 255)      // 더하기 연산시 saturation 방지
  5.             image2[y][x] = 255;
  6.         else if(image2[y][x] < 0)   // 빼기 연산시 saturation 방지
  7.             image2[y][x] = 0;
  8.     }


2) 히스토그램 스트레칭(Histogram Stretching)


입력 영상의 모든 픽셀에 대비(contrast) 상수를 곱하거나 나누는 연산

출력영상은 Contrast가 개선


Ex) 달의 분화구 사진 개선


O(x,y) = I(x,y) X contrast


                                             (이미지 2)


※ Contrast : 밝고 어두운 비(명암비)

밝기 255를 3000으로 쏘느냐 1000으로 쏘느냐 차이


※ Histogram의 최대 최소

      1. for(bright=255;bright>=0;bright--)  // 밝기가 큰것부터
      2.     if(frequency[bright]){  // 만약 값이 0이 아니면
      3.         max = bright;       
      4.         break;              // 첫 지점에서 탈출
      5.     }
      6. for(bright=255;bright<256;bright++) // 밝기가 작은것부터
      7.     if(frequency[bright]){  // 만약 값이 0이 아니면
      8.         min = bright;
      9.         break;              // 첫 지점에서 탈출
      10.     }

※ 명암대비 스트레칭


O(x,y) = I(x,y)-min / max-min * 255


    1. for(y=0;y<YY;y++)
    2.     for(x=0;x<XX;x++)
    3.         image[y][x] = (float)(image[y][x]-min) / (max-min) *255;



이미지 출처)

1. http://what-when-how.com/wp-content/uploads/2011/09/tmp646_thumb.jpg

2. http://slideplayer.com/slide/7789223/