본문 바로가기
Theory/Image Processing

10 선명화 처리 (22.11.04)

by Orangetasteboy 2023. 6. 22.

선명화

  • 원리
    • 경계부분의 명암대비를 증폭시킴
    • 즉, 밝은 부분은 좀 더 밝게, 어두운 부분은 좀 더 어둡게 만듦

  • 선명화 처리 마스크
    • 검출된 에지를 원본영상에 더해주는 처리를 수행

 

  • 선명화 마스크 구현 1

void main()
{
   int height, width;
   int** img = (int**)ReadImage("lena.png", &height, &width);
   int** img_out = (int**)IntAlloc2(height, width);

   int N = 3;
   float** mask = (float**)FloatAlloc2(N, N);
   mask[0][0] = -1; mask[0][1] = -1; mask[0][2] = -1;
   mask[1][0] = -1; mask[1][1] =  9; mask[1][2] = -1;
   mask[2][0] = -1; mask[2][1] = -1; mask[2][2] = -1;
   AvgNxN_BoundaryNearestPixel_WithMaskInput(mask, N, img, height, width, img_out);
   ImageClipping(img_out, height, width, img_out);  // 음수 및 255 초과 값을 범위내로 클리핑

   ImageShow("입력영상보기", img, height, width);
   ImageShow("출력영상보기", img_out, height, width);
}

 

  • 실행 결과

 

  • 선명화 마스크 구현 2

void main()
{
   int height, width;
   int** img = (int**)ReadImage("lena.png", &height, &width);
   int** img_out = (int**)IntAlloc2(height, width);

   int N = 3;
   float** mask = (float**)FloatAlloc2(N, N);
   mask[0][0] =  0; mask[0][1] = -1; mask[0][2] =  0;
   mask[1][0] = -1; mask[1][1] =  5; mask[1][2] = -1;
   mask[2][0] =  0; mask[2][1] = -1; mask[2][2] =  0;
   AvgNxN_BoundaryNearestPixel_WithMaskInput(mask, N, img, height, width, img_out);
   ImageClipping(img_out, height, width, img_out);  // 음수 및 255 초과 값을 범위내로 클리핑

   ImageShow("입력영상보기", img, height, width);
   ImageShow("출력영상보기", img_out, height, width);
}

 

  • 실행 결과

 

  • 2개 마스크 비교

  • 선명화 강도 조절
    • 선명화 처리 마스크 : 선명화 강도의 조절
    • 에지를 검출하는 부분에 가중치(a)를 곱함으로써 조절 가능

  • 선명화 강도 조절 구현

void main()
{
   int height, width;
   int** img = (int**)ReadImage("lena.png", &height, &width);
   int** img_out = (int**)IntAlloc2(height, width);

   int N = 3;
   float alpha = 0.5; // 클수록 에지가 더 강조됨
   float** mask = (float**)FloatAlloc2(N, N);
   mask[0][0] = -alpha; mask[0][1] = -alpha;        mask[0][2] = -alpha;
   mask[1][0] = -alpha; mask[1][1] = 1+8.0*alpha; mask[1][2] = -alpha;
   mask[2][0] = -alpha; mask[2][1] = -alpha;         mask[2][2] = -alpha;
   AvgNxN_BoundaryNearestPixel_WithMaskInput(mask, N, img, height, width, img_out);
   ImageClipping(img_out, height, width, img_out);  // 음수 및 255 초과 값을 범위내로 클리핑

   ImageShow("입력영상보기", img, height, width);
   ImageShow("출력영상보기", img_out, height, width);
}

 

  • 실행 결과

댓글