img1, img2 가 있을 때, 두 영상의 유사도 비교하여 0~1 사이 값으로 반환해 주는 함수.
// SSIM 계산 및 차이맵 반환 함수
double calculateSSIM(const Mat& img1, const Mat& img2, Mat& ssim_map) {
const double C1 = 6.5025, C2 = 58.5225;
Mat img1_64F, img2_64F;
img1.convertTo(img1_64F, CV_64F);
img2.convertTo(img2_64F, CV_64F);
// 평균값(Mean) 계산
Mat mu1, mu2;
GaussianBlur(img1_64F, mu1, Size(11, 11), 1.5);
GaussianBlur(img2_64F, mu2, Size(11, 11), 1.5);
// 분산(Variance) 및 공분산(Covariance) 계산
Mat mu1_sq = mu1.mul(mu1);
Mat mu2_sq = mu2.mul(mu2);
Mat mu1_mu2 = mu1.mul(mu2);
Mat sigma1_sq, sigma2_sq, sigma12;
GaussianBlur(img1_64F.mul(img1_64F), sigma1_sq, Size(11, 11), 1.5);
GaussianBlur(img2_64F.mul(img2_64F), sigma2_sq, Size(11, 11), 1.5);
GaussianBlur(img1_64F.mul(img2_64F), sigma12, Size(11, 11), 1.5);
sigma1_sq -= mu1_sq;
sigma2_sq -= mu2_sq;
sigma12 -= mu1_mu2;
// SSIM 공식 적용
Mat numerator = (2 * mu1_mu2 + C1).mul(2 * sigma12 + C2);
Mat denominator = (mu1_sq + mu2_sq + C1).mul(sigma1_sq + sigma2_sq + C2);
divide(numerator, denominator, ssim_map);
// SSIM 평균값 반환
Scalar ssim_mean = mean(ssim_map);
return ssim_mean[0]; // 그레이스케일이므로 한 채널만 사용
}
// SSIM 차이맵 시각화 함수
Mat visualizeSSIM(const Mat& ssim_map) {
Mat ssim_vis;
// SSIM 맵을 0~255 범위로 정규화
ssim_map.convertTo(ssim_vis, CV_8U, 255);
// 컬러맵 적용 (히트맵 스타일)
applyColorMap(ssim_vis, ssim_vis, COLORMAP_JET);
return ssim_vis;
}
'C++' 카테고리의 다른 글
onnxruntime 사용시 주의 사항 - 1 (1) | 2025.01.10 |
---|---|
C++ 소멸자에 virtual을 사용하는 이유 (0) | 2024.12.15 |
C++ virtual 내부 작동 방식 (0) | 2024.12.14 |
register c++ (0) | 2024.12.13 |
Intel Intrinsics SIMD (0) | 2024.12.10 |