두 영상의 같은 위치에 픽셀을 더하는 연산 방법이다. 픽셀의 최대값(255)를 넘어가는 경우에 포화 연산을 처리하여야 한다.
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) 보다 작은 경우에 포화 연산을 처리하여야 한다. 덧셈 연산과 달리 영상 순서에 따라 결과가 달라진다.
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();
}
두 영상의 같은 위치에 존재하는 픽셀에 대하여 가중합을 계산한다. 보통 가중치의 합은 1로 설정하여 영상의 평균 밝기를 유지한다.
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();
}
가중치의 합 연산에서 가중치를 0.5로 일치시킨 연산 방법이다.
영상의 경우 카메라에 의해 노이즈가 발생할 수 있다. 노이즈의 경우 발생 위치와 확률이 랜덤하기 때문에 동일한 장면의 영상의 평균을 구하면 노이즈를 제거할 수 있다.
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();
}
두 입력에 대해서 뺄셈은 수행한 후 절댓값을 취하는 연산 방법이다. 뺄셈 연산과 달리 연산 순서에 영향을 받지 않으며, 두 영상 내에서 다른 부분을 찾고자 하는 경우에 사용된다.
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();
}