지역 이진 패턴을 이용하여 텍스처의 특징을 추출한다.


이전에 해썬 SIFT보다 간단하기 때문에 크게 설명할 부분은 없다.




	Mat image = imread("Lenna.png");//이미지 보관.
	Mat gray;   //grayscale 이미지를 저장할 Mat.
	cvtColor(image, gray, CV_BGR2GRAY);//grayscale 이미지 사용.
	Mat lbp(image.size(), CV_8U, Scalar(0));


CV_8U는 unsigned char => 0~255 사이의 값을 같는 uchar를 나타낸다. Schalar(0) 기본값을 0으로 초기화한다.


lbp에 각 값들을 집어넣은 후에 출력한다.


	for (int i = 1; i < gray.rows - 1; ++i) {
		for (int j = 1; j < gray.cols - 1; ++j)
		{
			uchar t[9];
			for (int k = 0; k < 3; ++k) {
				for (int l = 0; l < 3; ++l) {
					t[k * 3 + l] = gray.at<uchar>(i + k - 1, j + l - 1);
				}
			}
			uchar currentValue = ReturnDecimVal(t);


			lbp.at<uchar>(i, j) = currentValue;
		}
	}


사이드에서 계산을 할 경우, 범위를 벗어난다. padding을 하는 방법도있지만 생략한다.


LBP는 패딩을 해도 별 차이가 없다.


copyMakeBorder(gray, gray, 1, 1, 1, 1, BORDER_CONSTANT, Scalar(0)); 다음과 같이 쓰면 제로 패딩을 해볼 수 있다.


uchar 배열에 자기자신과 둘러싼 8개의 값을 집어넣고 이를 LBP를 이용하여 적절한 값을 찾아낸다.


uchar ReturnDecimVal(uchar* t) {
	uchar val = 0;
	uchar center = t[1 * 3 + 1];
	bool check[9];
	int calStance[8] = { 3, 6, 7, 8, 5, 2, 1, 0 };//계산 순서를 임의로 설정.

	for (int k = 0; k < 3; ++k) {//ture면 주변 색보다 센터가 크거나 같은 경우, false면 아닌 경우.
		for (int l = 0; l < 3; ++l) {
			check[k * 3 + l] = (center >= t[k * 3 + l]) ? true : false;
		}
	}
	for (int i = 7; i >= 0; --i)
		val += check[calStance[7-i]] * pow(2, i);//위의 계산 순서에 따라서 2진수 방식으로 계산. bool은 false = 0, true = 1이므로 그대로 사용.

	return val;
}

위의 달팽이 그림같은 패턴을 그대로 사용하지 않아도 된다고 하지만 위에 맞춰서 패턴을 입력해보았다.


간단하게 하고자 계산 순서를 정해놓고 한바퀴 도는 식으로 했다.


달팽이 알고리즘을 짜고 싶다면 정보처리기능사 문제를 보면 된다.


효율적이라고 생각하진 않는다.





+ Recent posts