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



※ 영상 정합

서로 다른 영상에 같은 대상이 나타난 부분이 있을 때 그 대응 관계를 찾는 것으로 주로 컴퓨터 비전 분야에서 많이 다룬다. 영상 정합은 주어진 두 영상이 거의 같다면 대응 관계를 찾기 쉽지만 두 영상 사이에 다양한 변형이 주어진다면 대응 관계를 찾기 힘들다. 그래서 영상 정합에서는 영상 사이에 나타나는 변형 상태에 따라 그에 적합한 기법을 사용해야 한다. 영상 정합은 서로 다른 두 영상에 나타는 같은 부분을 찾는 것이다. 예로 로봇이 영상을 이용하여 특정 물체를 찾는 시스템을 만든다고 하자. 이 때 로봇은 찾고자하는 목표 물체의 영상을 가지고 있어야 한다. 목표 영상을 매 순간 들어오는 입력 영상과 영상 정합을 수행해 목표 물체를 찾거나 물체의 위치를 파악할 수 있다. 영상 정합 문제는 입력 받은 두 영상이 비슷할수록 쉽고, 차이가 커질수록 어렵다. 영상 사이에 밝기/명암/색상 등 광학적 특성, 가로와 세로 위치/크기 등 기하학적 특성, 번짐/잡음 등으로 두 영상이 차이가 날 수 있다. 이러한 영상 접합 문제에 대한 접근 기법들로는 세기 기반 방식과 특정 기반 방식으로 나눌 수 있다. 세기 기반 방식은 주어진 영상의 모든 픽셀을 통째로 사용하여 정합을 수행하는 방식이고, 특징 기반 방식은 특징점들과 같이 선택된 픽셀들만을 이용해서 정합을 수행하는 방식이다. 세기 기반 방식은 더욱 많은 데이터를 사용하기 때문에 두 영상 사이의 변화가 적을수록 정확한 정합 결과를 얻을 수 있는 장점이 있지만 해결할 수 있는 변형이 제한적이라는 단점이 있다. 특징 기반 방식은 정확도가 떨어질 수 있는 문제가 있지만, 영상의 부분적인 가려짐이나 크기 등의 심한 변화에도 비교적 강인하게 정합을 수행할 수 있다는 장점이 있다.


특징 기반 영상 정합은 선택된 점들에 대해 점들 사이의 대응관계를 통하여 영상 전체의 대응과 정합을 얻는 방식이다. 점들을 선택할 때는 균등한 간격으로 선택할 수 있고 앞 포스트에서 배웠던 해리 코너 검출기 같은 특징점 검출기로 선택할 수 있다. 점들을 균등한 간격으로 선택하는 방법에서는 두 영상에서 주어진 픽셀 간격만큼 점들을 격자 형태로 선택한 다음, 선택된 각 점에서 얻은 영상의 패치나 특징 기술자를 비교한다. 특징점 검출기를 사용하는 방법은 점들을 격자 형태로 선택하는 대신, 특징점 검출기를 통하여 얻은 점들에 대하여 패치나 특징 기술자를 얻어 비교한다. 특징점 검출기를 사용하면 검출기 수행에 시간이 소요되기는 하지만, 특징점 검출기를 통하여 얻은 점들이 훨씬 대응 관계를 차즌 데 유리하기 때문에 일반적으로는 검출기로 점을 선택하는 방식을 사용하게 된다.



※ 패치 기반 영상 정합

특징점 단위로 수행하는 정합 기법에서도 세부적으로 특징점들을 어떻게 비교할 것인가에 따라 수행 방법이 나뉜다. 두 점의 유사도를 비교하는 방법 가운데 가장 간단한 것은 점 주변의픽셀 값 자체를 비교하는 것으로, 이 때 점 주변의 픽셀들을 모아서 얻은 작은 영상을 패치라고 한다. 서로 다른 두 영상에서 얻은 특징점들의패치를 모두 비교해서 유사도가 높은 패치들이 많다면 두 영상의 정합을 달성할 수 있다. 이 때, 패치의 크기를 크게 잡을수록 두 점의 유사도를 더욱 엄격하게 검사한다. 패치의 크기가 크면 실제로 같지 않은 두 점을 같다고 판단하는 오류가 줄어드는 반면, 실제로 같은 두 점을 같지 않다고 판단하는 오류가 생길 위험이 늘어난다. 두 패치의 유사도를 측정하는 방법에는 SSD(Sum of Squared Difference), SAD(Sum of Absolute Difference), NCC(Normalized Cross Correlation)이 있다. SSD는 두 패치에서 같은 위치에 있는 픽셀들끼리의 차이를 구하고 제곱합을 구하는 것이고 SAD는 이의 절댓값을 합하는 것이다. 다음은 이들을 수식으로 나타낸 것이다.


  


두 패치에 대해 구한 SSD나 SAD 값이 작을수록 두 패치는 비슷한 패치라고 볼 수 있다. 보통 문턱값을 설정하여 두 패치가 유사한지 아닌지 결정한다. 문턱값을 높게 잡을수록 실제로 다른 두 점을 같다고 판단할 위험이 커지지만, 낮게 잡을 수록 실제로 같은 점도 같지 않다고 판단할 가능성이 커진다. 따라서 패치의 크기와 유사도의 문턱값 두 가지가 패치 기반 영상 정합의 성능을 결정짓는 중요한 요소가 된다. 

SAD는 픽셀 값의 차이에 따른 결과값이 선형으로 증가하지만, SSD는 2차 함수로 증가하기 때문에 SSD가 픽셀 값의 큰 차이에 대해 더욱 민감하게 반응하는 특성이 있다. 

다음은 SSD와 SSA를 계산하는 메서드이다. 매개 변수 x1, y1, x2, y2는 두 입력 영상에서 유사도 값을 측정할 대응점들의 위치를 가리킨다. src1과 src2는 각각 정합하고자 하는 두 입력 영상에 해당한다. 이 때, 대응점을 중심으로 한 패치가 아니라 입력 영상 전체를 매개변수로 하는 것은 메모리 할당 등 패치를 따로 만드는 데 필요한 계산을 줄이기 위해서다. nhSize는 패치의 범위를 나타내는 매개변수이다.

int _CalcSSD(const CByteImage& src1, const CByteImage& src2, int x1, int y1, int x2, int y2, int nhSize)
{
	if ((x1-nhSize)<0 || (x2-nhSize)<0 || (x1+nhSize)>=src1.GetWidth()  || (x2+nhSize)>=src2.GetWidth() ||
		(y1-nhSize)<0 || (y2-nhSize)<0 || (y1+nhSize)>=src1.GetHeight() || (y2+nhSize)>=src2.GetHeight())
		return INT_MAX;

	int nSum = 0;
	for (int r=-nhSize ; r<=nhSize ; r++)
	{
		BYTE* pSrc1 = src1.GetPtr(y1+r);
		BYTE* pSrc2 = src2.GetPtr(y2+r);

		for (int c=-nhSize ; c<=nhSize ; c++)
		{
			nSum += (pSrc1[x1+c]-pSrc2[x2+c])*(pSrc1[x1+c]-pSrc2[x2+c]);
		}
	}
	return nSum;
}

int _CalcSAD(const CByteImage& src1, const CByteImage& src2, int x1, int y1, int x2, int y2, int nhSize)
{
	if ((x1-nhSize)<0 || (x2-nhSize)<0 || (x1+nhSize)>=src1.GetWidth()  || (x2+nhSize)>=src2.GetWidth() ||
		(y1-nhSize)<0 || (y2-nhSize)<0 || (y1+nhSize)>=src1.GetHeight() || (y2+nhSize)>=src2.GetHeight())
		return INT_MAX;

	int nSum = 0;
	for (int r=-nhSize ; r<=nhSize ; r++)
	{
		BYTE* pSrc1 = src1.GetPtr(y1+r);
		BYTE* pSrc2 = src2.GetPtr(y2+r);

		for (int c=-nhSize ; c<=nhSize ; c++)
		{
			nSum += abs(pSrc1[x1+c]-pSrc2[x2+c]);
		}
	}
	return nSum;
}


NCC(Normalized Cross Correlation)은 SSD와 SAD가 가지는 밝기 차이 문제를 해결하기 위해 사용하는 유사도 측정 방법이다. SSD와 SAD는 단순히 입력 영상들의 픽셀들만 비교하기 때문에 영상 안 물체가 똑같더라도 서로의 밝기가 다르면 같은 물체로 취급하지 않게 된다. 즉, SSD와 SAD는 영상의 전체적인 밝기값이 차이가 난다면 정확한 영상 정합을 기대하기가 힘들다.  NCC는 이러한 문제를 정규화를 통해 해결한다. 두 입력영상 패치 각각의 밝기 평균과 표준편차를 계산하여 평균 밝기가 0, 표준편차는 1이 되도록 정규화(normalization)한다. 따라서 전체적인 밝기의차이보다는 픽셀 하나하나의 밝기 차이에 더 의미를 두는 유사도 측정 기법이라 할 수 있다. 이에 관해서 더 포스트할 예정인데 사정상 다음 포스트에서 계속 해서 연재하겠다.

+ Recent posts