Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

OpenCV 이터레이터(Iterator)를 활용해 이미지 색상을 줄이는 방법


OpenCV에는 C++ STL(표준 템플릿 라이브러리)과 호환되는 Mat 이터레이터(Mat_<Vec3b>::iterator) 클래스가 내장되어 있습니다. 이 클래스를 활용하면 복잡한 포인터 연산 없이도 이미지의 모든 픽셀에 손쉽게 접근할 수 있습니다.

Mat 이터레이터의 기본 개념

이터레이터를 사용하려면 먼저 Mat 이터레이터 클래스의 객체를 생성해야 합니다. 객체는 다음과 같은 형태로 선언합니다.

Mat_<Vec3b>::iterator example;

여기서 주목해야 할 점은 두 가지입니다. 첫째, 'Mat' 뒤에 반드시 언더스코어(_)를 붙여야 합니다. Mat_는 템플릿 클래스이기 때문입니다. 둘째, 이터레이터 객체를 생성할 때 처리할 데이터 타입을 명시해야 합니다. 위 예제에서는 컬러 이미지의 한 픽셀이 BGR 세 채널 값을 담고 있음을 나타내기 위해 <Vec3b> 타입을 지정했습니다.

색상 감소(Color Reduction)의 원리

색상 감소는 각 픽셀 값을 미리 정한 구간 단위로 묶어 표현 가능한 색상 수를 줄이는 기법입니다. 이 예제에서 사용하는 공식은 다음과 같습니다.

변환된 값 = 원래 값 / div * div + div / 2

div가 64라면 0~255 사이의 픽셀 값이 64 단위 구간으로 나뉘며, 여기에 div/2(즉 32)를 더해 각 구간의 중앙값으로 맞춥니다. 그 결과 이미지 전체의 색상 수가 크게 줄어들어 포스터처럼 색이 단순화된 효과를 얻을 수 있습니다.

예제 코드

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;//std 네임스페이스 선언//
using namespace cv;//cv 네임스페이스 선언//
void reducing_Color(Mat& image, int div = 64){//함수 선언//
   Mat_<Vec3b>::iterator iterator_start;//시작 이터레이터 선언//
   iterator_start = image.begin<Vec3b>();//초기 위치의 이터레이터 획득//
   Mat_<Vec3b>::iterator iterator_end;//끝 이터레이터 선언//
   iterator_end = image.end<Vec3b>();//마지막 위치의 이터레이터 획득//
   for(; iterator_start != iterator_end; iterator_start++){//모든 픽셀을 순회하는 루프//
      (*iterator_start)[0] = (*iterator_start)[0]/div*div + div/2;//첫 번째 채널(B) 픽셀 처리//
      (*iterator_start)[1] = (*iterator_start)[1]/div*div + div/2;//두 번째 채널(G) 픽셀 처리//
      (*iterator_start)[2] = (*iterator_start)[2]/div*div + div/2;//세 번째 채널(R) 픽셀 처리//
   }
}
int main() {
   Mat image;//이미지 행렬 생성//
   image = imread("mango.jpg");//이미지 불러오기//
   namedWindow("Image Window");//윈도우 선언//
   reducing_Color(image);//색상 감소 함수 호출//
   imshow("Image Window", image);//색상이 감소된 이미지 출력//
   waitKey(0);
   return 0;
}

코드 동작 설명

  • reducing_Color 함수: 이미지 행렬과 구간 크기(div, 기본값 64)를 매개변수로 받아 색상 감소를 수행합니다.
  • begin()과 end(): image.begin<Vec3b>()는 첫 픽셀 위치의 이터레이터를, image.end<Vec3b>()는 마지막 픽셀 다음 위치의 이터레이터를 반환합니다.
  • for 루프: 시작 이터레이터가 끝 이터레이터에 도달할 때까지 한 픽셀씩 전진하며, 각 픽셀의 B, G, R 세 채널에 색상 감소 공식을 적용합니다.
  • main 함수: mango.jpg 파일을 불러온 뒤 reducing_Color 함수를 호출하고, 처리된 이미지를 "Image Window" 창에 출력합니다.

실행 결과

위 코드를 실행하면 원본 이미지보다 색상 수가 확연히 줄어든 결과물을 확인할 수 있습니다.

OpenCV 이터레이터(Iterator)를 활용해 이미지 색상을 줄이는 방법