Spaces:
Sleeping
Sleeping
function [ms, ld, li_d, wv, wh] = evalUnwarp(A, ref, data) | |
%EVALUNWARP compute MSSSIM and LD between the unwarped image and the scan | |
% A: unwarped image | |
% ref: reference image, the scan image | |
% ms: returned MS-SSIM value | |
% ld: returned local distortion value | |
% Matlab image processing toolbox is necessary to compute ssim. The weights | |
% for multi-scale ssim is directly adopted from: | |
% | |
% Wang, Zhou, Eero P. Simoncelli, and Alan C. Bovik. "Multiscale structural | |
% similarity for image quality assessment." In Signals, Systems and Computers, | |
% 2004. Conference Record of the Thirty-Seventh Asilomar Conference on, 2003. | |
% | |
% Local distortion relies on the paper: | |
% Liu, Ce, Jenny Yuen, and Antonio Torralba. "Sift flow: Dense correspondence | |
% across scenes and its applications." In PAMI, 2010. | |
% | |
% and its implementation: | |
% https://people.csail.mit.edu/celiu/SIFTflow/ | |
x = A; | |
y = ref; | |
im1=imresize(imfilter(y,fspecial('gaussian',7,1.),'same','replicate'),0.5,'bicubic'); | |
im2=imresize(imfilter(x,fspecial('gaussian',7,1.),'same','replicate'),0.5,'bicubic'); | |
im1=im2double(im1); | |
im2=im2double(im2); | |
cellsize=3; | |
gridspacing=1; | |
sift1 = mexDenseSIFT(im1,cellsize,gridspacing); | |
sift2 = mexDenseSIFT(im2,cellsize,gridspacing); | |
SIFTflowpara.alpha=2*255; | |
SIFTflowpara.d=40*255; | |
SIFTflowpara.gamma=0.005*255; | |
SIFTflowpara.nlevels=4; | |
SIFTflowpara.wsize=2; | |
SIFTflowpara.topwsize=10; | |
SIFTflowpara.nTopIterations = 60; | |
SIFTflowpara.nIterations= 30; | |
[vx,vy,~]=SIFTflowc2f(sift1,sift2,SIFTflowpara); | |
rows1p = size(im1,1); | |
cols1p = size(im1,2); | |
% Li-D | |
rowstd_sum = 0; | |
for i = 1:rows1p | |
rowstd = std(vy(i, :),1); | |
rowstd_sum = rowstd_sum + rowstd; | |
end | |
rowstd_mean = rowstd_sum / rows1p; | |
colstd_sum = 0; | |
for i = 1:cols1p | |
colstd = std(vx(:, i),1); | |
colstd_sum = colstd_sum + colstd; | |
end | |
colstd_mean = colstd_sum / cols1p; | |
li_d = (rowstd_mean + colstd_mean) / 2; | |
% LD | |
d = sqrt(vx.^2 + vy.^2); | |
ld = mean(d(:)); | |
% MS-SSIM | |
wt = [0.0448 0.2856 0.3001 0.2363 0.1333]; | |
ss = zeros(5, 1); | |
for s = 1 : 5 | |
ss(s) = ssim(x, y); | |
x = impyramid(x, 'reduce'); | |
y = impyramid(y, 'reduce'); | |
end | |
ms = wt * ss; | |
% wv and wh | |
rowstd_sum = 0; | |
for i = 1:size(data, 1) | |
rowstd_top = std(vy(data(i,2), data(i,1):data(i,3)),1) / (data(i,3)-data(i,1)); | |
rowstd_bot = std(vy(data(i,4), data(i,1):data(i,3)),1) / (data(i,3)-data(i,1)); | |
rowstd_sum = rowstd_sum + rowstd_top + rowstd_bot; | |
end | |
wv = rowstd_sum / (2 * size(data, 1)); | |
colstd_sum = 0; | |
for i = 1:size(data, 1) | |
colstd_left = std(vx(data(i,2):data(i,4), data(i,1)),1) / (data(i,4)- data(i,2)); | |
colstd_right = std(vx(data(i,2):data(i,4), data(i,3)),1) / (data(i,4)- data(i,2)); | |
colstd_sum = colstd_sum + colstd_left + colstd_right; | |
end | |
wh = colstd_sum / (2 * size(data, 1)); | |
end | |