영상의 산술 연산

덧셈 연산

두 영상의 같은 위치에 픽셀을 더하는 연산 방법이다. 픽셀의 최대값(255)를 넘어가는 경우에 포화 연산을 처리하여야 한다.

dst=taturate(src1(x,y)+src2(x,y))\text{dst} = \text{taturate}(src1(x,y) + src2(x,y))
void ex_arthmetic(){
    Mat src1 = imread("../data/lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("../data/square.bmp", IMREAD_GRAYSCALE);

	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst;

	add(src1, src2, dst);
	
	imshow("dst1", dst);
	waitKey();
}

뺄셈 연산

두 영상의 같은 위치에 픽셀을 빼는 연산 방법이다. 픽셀의 최소값(0) 보다 작은 경우에 포화 연산을 처리하여야 한다. 덧셈 연산과 달리 영상 순서에 따라 결과가 달라진다.

dst=taturate(src1(x,y)src2(x,y))\text{dst} = \text{taturate}(src1(x,y) - src2(x,y))
void ex_arthmetic(){
    Mat src1 = imread("../data/lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("../data/square.bmp", IMREAD_GRAYSCALE);

	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst1, dst2, dst3, dst4;

	add(src1, src2, dst1);
	addWeighted(src1, 0.5, src2, 0.5, 0, dst2);
	subtract(src1, src2, dst3);
	absdiff(src1, src2, dst4);

	imshow("dst1", dst1);
	imshow("dst2", dst2);
	imshow("dst3", dst3);
	imshow("dst4", dst4); 
	waitKey();
}

가중치 합(Weighted sum)

두 영상의 같은 위치에 존재하는 픽셀에 대하여 가중합을 계산한다. 보통 가중치의 합은 1로 설정하여 영상의 평균 밝기를 유지한다.

dst=taturate(αsrc1(x,y)+βsrc2(x,y))\text{dst} = \text{taturate}(\alpha * src1(x,y) + \beta * src2(x,y))
void ex_arthmetic(){
    Mat src1 = imread("../data/lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("../data/square.bmp", IMREAD_GRAYSCALE);

	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst;
	addWeighted(src1, 0.2, src2, 0.8, 0, dst);
	imshow("dst", dst);
	waitKey();
}

평균 연산(Average)

가중치의 합 연산에서 가중치를 0.5로 일치시킨 연산 방법이다.

dst=12(src1(x,y)+src2(x,y))\text{dst} = \frac{1}{2}(src1(x,y) + src2(x,y))

영상의 경우 카메라에 의해 노이즈가 발생할 수 있다. 노이즈의 경우 발생 위치와 확률이 랜덤하기 때문에 동일한 장면의 영상의 평균을 구하면 노이즈를 제거할 수 있다.

void ex_arthmetic(){
    Mat src1 = imread("../data/lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("../data/square.bmp", IMREAD_GRAYSCALE);

	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst;
	addWeighted(src1, 0.5, src2, 0.5, 0, dst);
	imshow("dst", dst);
	waitKey();
}

차이 연산

두 입력에 대해서 뺄셈은 수행한 후 절댓값을 취하는 연산 방법이다. 뺄셈 연산과 달리 연산 순서에 영향을 받지 않으며, 두 영상 내에서 다른 부분을 찾고자 하는 경우에 사용된다.

dst=src1(x,y)src2(x,y)\text{dst} = |src1(x,y) - src2(x,y)|

void ex_arthmetic(){
    Mat src1 = imread("../data/lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("../data/square.bmp", IMREAD_GRAYSCALE);

	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst;

	absdiff(src1, src2, dst);

	imshow("dst", dst); 
	waitKey();
}

영상의 논리 연산

우리가 흔히 아는 논리 연산과 동일한 연산들이 영상 데이터에도 그대로 적용이 된다.

void ex_logical(){
	Mat src1 = imread("../data/lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("../data/square.bmp", IMREAD_GRAYSCALE);

	if (src1.empty() || src2.empty()) {
		cerr << "Image load failed!" << endl;
		return ;
	}

	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst1, dst2, dst3, dst4;

	bitwise_and(src1, src2, dst1);
	bitwise_or(src1, src2, dst2);
	bitwise_xor(src1, src2, dst3);
	bitwise_not(src1, dst4);
	//dst4 = ~src1;

	imshow("and", dst1);
	imshow("or", dst2);
	imshow("xor", dst3);
	imshow("not", dst4);
	waitKey();
}

0개의 댓글

Powered by GraphCDN, the GraphQL CDN