해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.



※ 영상의 채널 단위 접근과 변환

영상의 각 채널을 따로 분리하여 다뤄야 할 때가 있다. 예로 컬러 영상의 R채널만을 화면 출력으로 보고 싶다고 할 때 특정 채널만을 출력할 수 있는 화면 출력 함수를 만들어도 좋지만, 컬러 영상에서 원하는 채널을 추출하는 함수를 만든다면 다방면에서 사용할 수 있다. 또한, 고급 영상 처리 알고리즘을 구현하다 보면 여러 개의 채널을 가지는 영상을 다루어야 하는데 이 때 영상에서 특정 채널을 추출하는 기능이 있다면 편리할 것이다.


<채널 추출 함수>

	CMyImage<T> GetChannelImg(int nChannel) const
	{
		CMyImage<T> dst(m_nWidth, m_nHeight);

		for (int r=0 ; r<m_nHeight ; r++)
		{
			T* pSrc = GetPtr(r);
			T* pDst = dst.GetPtr(r);

			int idx = nChannel;
			for (int c=0 ; c<m_nWidth ; c++)
			{
				pDst[c] = pSrc[idx];
				idx += m_nChannels;
			}
		}

		return dst;
	}

매개 변수로 채널 번호를 넣으면 해당 채널을 단일 채널 영상, 즉 회색조 영상으로 반환한다.



<채널 삽입 함수>

void PutChannelImg(const CMyImage<T>& src, int nChannel)
	{
		int nWidth  = src.GetWidth();
		int nHeight = src.GetHeight();

		for (int r=0 ; r<nHeight ; r++)
		{
			T* pSrc = src.GetPtr(r);
			T* pDst = GetPtr(r);

			int idx = nChannel;
			for (int c=0 ; c<nWidth ; c++)
			{
				pDst[idx] = pSrc[c];
				idx += m_nChannels;
			}
		}
	}

회색조 영상과 함께 채널 번호를 넣으면 번호에 해당하는 영상 채널을 입력한 회색조 영상으로 대체한다.

+ Recent posts