본문 바로가기
전공수업/영상처리(C언어)

[영상처리] 모자이크 처리 (OpenCV, C언어)

by JooRi 2024. 9. 30.
728x90
SMALL

* 모자이크 처리

1. 동적 메모리 할당

동적 메모리 할당 함수

 

사용자가 입력한 가로 세로 크기에 맞춰 메모리를 할당하기 위한 함수로, 사용자가 입력한 크기의 이미지 데이터를 저장하기 위해 2차원 배열을 동적으로 생성하는 역할을 한다.

사용자 입력에 따라 이미지 크기가 달라지 때문에 동적 메모리를 사용하면 프로그램이 실행되는 동안 필요한 만큼의 메모리를 할당할 수 있기 때문에 메모리 낭비를 방지할 수 있다.

 

 

2. 이미지 파일 읽기

파일 읽기 함수

 

이미지 파일에서 데이터를 가로 크기만큼 읽어와, 위에서 생성한 2차원 배열의 각 행에 저장하는 함수이다.

f 파일 포인터에서 데이터를 읽어와, 각 행( ucmatrix[i] )에 저장한다.

 

  • ucmatrix[i] : 2차원 배열에서의 각 행을 의미, 각 행에 해당하는 픽셀 데이터가 저장됨
  • sizeof(uchar) : 한 번에 읽어 들일 데이터의 크기, uchar는 1바이트 크기이므로 sizeof(uchar)는 1.
  • size_x : 가로 크기만큼의 픽셀 데이터를 한 번에 읽어와서 배열에 저장

 

 

3. 모자이크 처리

모자이크 처리 함수

 

1) 블록 단위로 이미지 처리

이미지를 Block 크기(예:8x8 픽셀)로 나누어 각 블록을 처리한다.

이미지의 가로(Col)와 세로(Row)를 Block 크기만큼 건너뛰며 순차적으로 처리한다.

 

2) 블록 내 픽셀 값 합산 및 평균 계산

각 블록 내의 모든 픽셀 값을 더하고, 블록 내 픽셀 수를 세어 평균을 계산한다.

이 평균값은 해당 블록 내 모든 픽셀에 동일하게 적용될 값이다.

 

3) 블록 내 모든 픽셀을 평균값으로 설정

계산된 평균값을 블록 내 모든 픽셀에 적용한다.

블록 내 모든 픽셀은 동일한 값이 되어 모자이크 효과가 나타난다.

 

 

1) 블록 단위로 이미지 처리

블록 단위로 이미지 처리

 

i는 이미지의 세로 방향, j는 가로 방향으로 움직이며, 각각 Block 크기만큼 증가한다. 즉, 블록 크기 단위로 이미지를 건너뛰며 처리한다.

예를 들어, 블록 크기가 8일 경우 8x8 픽셀을 한 번에 처리하며, 다음 블록으로 넘어갈 때 8픽셀을 건너뛴다.

그리고 각 블록의 픽셀을 모두 합하여 tmp에 저장한다.

 

 

2) 블록 내 픽셀 값 합산 및 평균 계산

블록 내 픽셀 값 평균 계산

 

y와 x는 블록 내부에서 이동하는 인덱스로, 'i + y'는 블록의 세로 위치, 'j + x'는 블록의 가로 위치를 나타낸다.

블록 내 모든 픽셀을 반복하며 tmp에 합산하고, count를 증가시켜 블록 내 픽셀 수를 센다.

 

 

3) 블록 내 모든 픽셀을 평균값으로 설정

블록 내 픽셀 값 대체

 

합산한 픽셀 값을 count로 나눠서 블록 내 픽셀 값의 평균을 계산한다.

다시 블록 내 픽셀들을 반복하며 평균값으로 모든 픽셀을 대체한다. 즉, out[i + y][j + x] 배열에 해당 블록 내의 모든 픽셀 값을 동일한 평균값으로 채워 넣는다.

이 과정을 통해 블록 내 모든 픽셀이 같은 값이 되어서, 해당 영역이 흐려져 모자이크 효과가 발생한다.

 

* 출력

 

출력

끝.

 

 

728x90
LIST

댓글