Reference: https://ece.uwaterloo.ca/~z70wang/research/ssim/index.html
| 509 | |
| 510 | // Reference: https://ece.uwaterloo.ca/~z70wang/research/ssim/index.html |
| 511 | vec4F compute_ssim(const imagef& a, const imagef& b) |
| 512 | { |
| 513 | imagef axb, a_sq, b_sq, mu1, mu2, mu1_sq, mu2_sq, mu1_mu2, s1_sq, s2_sq, s12, smap, t1, t2, t3; |
| 514 | |
| 515 | const float C1 = 6.50250f, C2 = 58.52250f; |
| 516 | |
| 517 | pow_image(a, a_sq, vec4F(2)); |
| 518 | pow_image(b, b_sq, vec4F(2)); |
| 519 | mul_image(a, b, axb, vec4F(1.0f)); |
| 520 | |
| 521 | gaussian_filter(mu1, a, 11, 1.5f * 1.5f); |
| 522 | gaussian_filter(mu2, b, 11, 1.5f * 1.5f); |
| 523 | |
| 524 | pow_image(mu1, mu1_sq, vec4F(2)); |
| 525 | pow_image(mu2, mu2_sq, vec4F(2)); |
| 526 | mul_image(mu1, mu2, mu1_mu2, vec4F(1.0f)); |
| 527 | |
| 528 | gaussian_filter(s1_sq, a_sq, 11, 1.5f * 1.5f); |
| 529 | add_weighted_image(s1_sq, vec4F(1), mu1_sq, vec4F(-1), vec4F(0), s1_sq); |
| 530 | |
| 531 | gaussian_filter(s2_sq, b_sq, 11, 1.5f * 1.5f); |
| 532 | add_weighted_image(s2_sq, vec4F(1), mu2_sq, vec4F(-1), vec4F(0), s2_sq); |
| 533 | |
| 534 | gaussian_filter(s12, axb, 11, 1.5f * 1.5f); |
| 535 | add_weighted_image(s12, vec4F(1), mu1_mu2, vec4F(-1), vec4F(0), s12); |
| 536 | |
| 537 | scale_image(mu1_mu2, t1, vec4F(2), vec4F(0)); |
| 538 | adds_image(t1, vec4F(C1), t1); |
| 539 | |
| 540 | scale_image(s12, t2, vec4F(2), vec4F(0)); |
| 541 | adds_image(t2, vec4F(C2), t2); |
| 542 | |
| 543 | mul_image(t1, t2, t3, vec4F(1)); |
| 544 | |
| 545 | add_image(mu1_sq, mu2_sq, t1); |
| 546 | adds_image(t1, vec4F(C1), t1); |
| 547 | |
| 548 | add_image(s1_sq, s2_sq, t2); |
| 549 | adds_image(t2, vec4F(C2), t2); |
| 550 | |
| 551 | mul_image(t1, t2, t1, vec4F(1)); |
| 552 | |
| 553 | div_image(t3, t1, smap, vec4F(1)); |
| 554 | |
| 555 | return avg_image(smap); |
| 556 | } |
| 557 | |
| 558 | vec4F compute_ssim(const image_u8& a, const image_u8& b, bool luma) |
| 559 | { |
nothing calls this directly
no test coverage detected