본문 바로가기
런닝머신 (ML)

[컴퓨터 비전 & 머신러닝] 영상의 산술 연산

728x90

영상은 일종의 2차원 행렬이기 때문에 행렬의 산술 연산을 그대로 적용할 수 있다

 

dst(x, y) = saturate(src1(x, y) + src2(x, y))

 

OpenCV에서는 add() 함수를 사용해 영상의 덧셈을 수행할 수 있다

void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);
//src1 -> 첫 번째 입력 행렬 또는 스칼라
//src2 -> 두 번째 입력 행렬 또는 스칼라
//dst -> 입력 행렬과 같은 크기, 같은 채널 수를 갖는 출력 행렬
//mask -> 8비트 1채널 마스크 영상
//dtype -> 출력 행렬의 깊이, 깊이가 같은 경우에는 -1을 지정할 수 있다

add(src1, src2, dst);
dst = src1 + src2;

두 영상을 더할 때 각 영상에 가중치를 부여하여 덧셈 연산을 할 수도 있다

 

dst(x, y) = saturate(src1(x, y)*alpha + src2(x, y)*beta + gamma)

 

OpenCV에서 두 영상의 가중치 합을 구하려면 addWeighted() 함수를 사용한다

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
//src1 -> 첫 번째 입력 행렬
//alpha -> src1 행렬의 가중치
//src2 -> 두 번째 입력 행렬
//beta -> src2 행렬의 가중치
//gamma -> 가중합 결과에 추가적으로 더할 값
//dst -> 입력 행렬과 같은 크기, 같은 채널 수를 갖는 출력 행렬
//dtype -> 출력 행렬의 깊이, 깊이가 같은 경우에는 -1을 지정할 수 있다

addWeighted(src1, 0.5, src2, 0.5, 0, dst);

덧셈과 마찬가지로 두개의 영상에 대해 뺄셈 연산도 수행할 수 있다

 

dst(x, y) = saturate(src1(x, y) - src2(x, y))

 

void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);
//src1 -> 첫 번째 입력 행렬 또는 스칼라
//src2 -> 두 번째 입력 행렬 또는 스칼라
//dst -> 입력 행렬과 같은 크기, 같은 채널 수를 갖는 출력 행렬
//mask -> 8비트 1채널 마스크 영상
//dtype -> 출력 행렬의 깊이, 깊이가 같은 경우에는 -1을 지정할 수 있다

subtract(src1, src2, dst);
dst = src1 - src2;

 

영상을 빼는 순서에 따라 결과에 차이가 있는 것을 확인 할 수 있다

 

 

두 영상의 뺄셈 순서에 상관 없이 픽셀 값 차이가 큰 영역을 두드러지게 나타내고 싶으면 차이 연산을 수행할 수 있다

 

dst(x, y) = | src1(x, y) = src2(x, y) |

 

나머지 함수는 예제를 통해 알아보겠다


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

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

	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();

	return 0;
}

 

 

728x90