Your assignment it to write code in matlab that takes an ima
Your assignment it to write code in matlab that takes an image and removes shadow from the image. Write the whole code yourself, without using any built-in function. I would like the code to be as much long as you can please
Solution
1.call ratio
function ratio = cal_ratio(seg,pair,hard_map,soft_map,im)
hard_map_2=conv2(hard_map,fspecial(\'average\',20),\'same\');
imcanny=edge(hard_map_2,\'canny\');
%imcanny=edge(hard_map,\'canny\');
[x,y,t]=bdry_extract_3(imcanny);
ps = 4;
[height width] = size(double(imcanny));
npt = length(x);
pair_ratio=[];
nonpair_ratio=[];
for n=1:npt
skip=false;
x0 = x(n); y0 = y(n); t0 = t(n);
x1 = round(x0 + 1.5*ps*cos(t0+pi/2));
y1 = round(y0 + 1.5*ps*sin(t0+pi/2));
x2 = round(x0 + 1.5*ps*cos(t0-pi/2));
y2 = round(y0 + 1.5*ps*sin(t0-pi/2));
%hist{1} = ones(3, 1); hist{2} = ones(3, 1);
val{1} = zeros(3, 1); val{2} = zeros(3, 1);
k=zeros(2,1);
%cnt1 = 0; cnt2 = 0;
ix = max(1, x1 - ps):min(width, x1 + ps);
iy = max(1, y1 - ps):min(height, y1 + ps);
for ch=1:3
temp = im(iy, ix, ch);
val{1}(ch) = mean(temp(:));
%% find the label for this tmp area
if isnan(val{1}(ch))
skip=true;
end
end
label=seg(iy, ix);
label1=mode(double(label(:)));
temp=soft_map(iy,ix);
k(1)=mean(temp(:));
if isnan(k(1))
skip=true;
end
temp=hard_map(iy,ix);
if mean(temp(:))<0.8 && mean(temp(:))>0.2
skip=true;
end
%region1=sum(sum(hard_map(iy,ix)));
ix = max(1, x2 - ps):min(width, x2 + ps);
iy = max(1, y2 - ps):min(height, y2 + ps);
for ch=1:3
temp = im(iy, ix, ch);
val{2}(ch) = mean(temp(:));
if isnan(val{2}(ch))
skip=true;
end
end
label=seg(iy, ix);
label2=mode(double(label(:)));
temp=soft_map(iy,ix);
k(2)=mean(temp(:));
if isnan(k(2))
skip=true;
end
temp=hard_map(iy,ix);
if mean(temp(:))<0.8 && mean(temp(:))>0.2
skip=true;
end
if abs(k(1)-k(2))<0.5
skip = true;
end
tmp_ratio = [];
if ~skip
for ch=1:3
tmp_ratio=[tmp_ratio,(val{2}(ch)-val{1}(ch))/(val{1}(ch)*k(2)-val{2}(ch)*k(1))];
if isnan(tmp_ratio(ch))
skip = true;
end
end
end
if ~skip
% test to see if label1 and label2 make a pair
if ~isempty(pair) && sum((pair(:,1) == label1 & pair(:,2) == label2) | (pair(:,2) == label2 & pair(:,2) == label1))~=0
pair_ratio = [pair_ratio; tmp_ratio];
else
nonpair_ratio = [nonpair_ratio; tmp_ratio];
end
end
end
if ~isempty(pair_ratio)
pair_ratio(pair_ratio(:,1)<=0|pair_ratio(:,2)<=0|pair_ratio(:,3)<=0,:)=[];
end
if ~isempty(nonpair_ratio)
nonpair_ratio(nonpair_ratio(:,1)<=0|nonpair_ratio(:,2)<=0|nonpair_ratio(:,3)<=0,:)=[];
end
if size(pair_ratio,1) == 0 && size(nonpair_ratio,1)>0
ratio=nonpair_ratio;
else
ratio = pair_ratio;
end
step_size = 0.1;
pt_num = size(ratio,1);
hash_mode = 99991;
hash_map = zeros(4, hash_mode);
%% voting
for i = 1:pt_num
if mod(i, 100)==0
fprintf(1, \'%d\ \', i);
end
ir = floor(ratio(i,1)/step_size); ir = [ir ir+1];
ig = floor(ratio(i,2)/step_size); ig = [ig ig+1];
ib = floor(ratio(i,3)/step_size); ib = [ib ib+1];
if isinf(ir) | isinf(ig) | isinf(ib)
continue
end
for i1=ir
for i2=ig
for i3=ib
hashins([i1, i2, i3]);
end
end
end
end
[dummy,ind] = max(hash_map(1,:));
ratio = hash_map(2:4,ind);
ratio = ratio*step_size;
function ind = hashins(entry)
h = round(entry(1)*1e2 + entry(2)*10 + entry(3));
hm = h;
cnt = 0;
while 1
hm = mod(hm, hash_mode) + 1;
if hash_map(1, hm) == 0
hash_map(1, hm) = 1;
hash_map(2:4, hm) = entry;
break;
elseif sum ( hash_map(2:4, hm) == entry\' ) == 3
hash_map(1, hm) = hash_map(1, hm) + 1;
break;
else
hm = hm+2*cnt+1;
cnt = cnt + 1;
end
end
ind = hm;
end
end
2.deshadow
addpath(\'meanshift\');
addpath(\'used_desc\');
addpath(\'svmlight_mex\');
addpath(\'utils\');
addpath(genpath(\'UGM\'));
unix(\'rm data/binary/* data/mask/* data/cache/* data/matting/* data/removal/* data/unary/*\');
opt = {};
opt.dir = \'data/\';
fnlist1 = {\'DSC01536.jpg\', \'DSC01611.jpg\', \'DSC01508.jpg\', \'DSC01603.jpg\'};
fnlist2 = {\'p21_1.jpg\', \'p14_1.jpg\', \'siebel.bmp\'};
for i=1:length(fnlist1)
opt.fn = fnlist1{i};
opt.save = 1;
opt.binaryClassifier = \'models/model_pair.mat\';
opt.unaryClassifier = \'models/unary_model.mat\';
opt.resize = 1;
opt.adjecent = 0;
opt.pairwiseonly = 0;
opt.linearize = 0;
h = findshadowcut_cross(opt);
end
for i=1:length(fnlist2)
opt.fn = fnlist2{i};
opt.save = 1;
opt.binaryClassifier = \'models/model_pair_our.mat\';
opt.unaryClassifier = \'models/unary_model_our.mat\';
opt.resize = 1;
opt.adjecent = 0;
opt.pairwiseonly = 0;
opt.linearize = 0;
h = findshadowcut_cross(opt);
end
testfnlist = {}; cnt = 0;
for i=1:length(fnlist1)
cnt = cnt+1;
testfnlist{cnt} = fnlist1{i}(1:end-4);
end
for i=1:length(fnlist2)
cnt = cnt+1;
testfnlist{cnt} = fnlist2{i}(1:end-4);
end
runmatting;
3.find shadow cut
function [hardmap] = findshadow(opt)
if ~isfield(opt, \'save\')
opt.save = 0;
end
if ~isfield(opt, \'adjecent\')
opt.adjecent = 0;
end
if ~isfield(opt, \'pairwiseonly\')
opt.pairwiseonly = 0;
end
basename = opt.fn(1:end-4);
im=imread([opt.dir \'original/\' opt.fn]);
%im = (double(im)/255).^(.45).*255;
oim = im;
org_siz = [size(im, 1) size(im, 2)];
if opt.resize == 0
resiz_ratio = 1;
else
resiz_ratio = 640/org_siz(2);
end
im = imresize(oim, resiz_ratio);
if opt.linearize
gamma_im = (double(im)/255).^(1/.45);
im = gamma_im;
end
%im = (double(im)/255);
%im = (double(im)/255).^(1/.45);
try
load([opt.dir \'cache/\' basename \'_seg.mat\']);
catch exp1
disp \'Segmenting\'
[dummy seg] = edison_wrapper(im, @RGB2Luv, ...
\'SpatialBandWidth\', 9, \'RangeBandWidth\', 15, ...
\'MinimumRegionArea\', 200);
seg = seg + 1;
save([opt.dir \'cache/\' basename \'_seg.mat\'], \'seg\');
end
numlabel = length(unique(seg(:)));
try
load([opt.dir \'cache/\' basename \'_single.mat\']);
catch exp1
disp \'Single region feature\'
%load(\'cache/model_our.mat\', \'model\');
labhist = calcLabHist(im, seg, numlabel);
texthist = calcTextonHistNoInv(im, seg, numlabel);
testdata=[labhist, texthist];
testlabel = ones(numlabel, 1);
save([opt.dir \'cache/\' basename \'_single.mat\'], \'testdata\', \'testlabel\');
end
load(opt.unaryClassifier, \'model\');
disp \'Single region classification\'
[err, s]=svmclassify(testdata, testlabel, model);
ss = double(sign(s));
ssmap=(1-ss(seg))/2;
try
load([opt.dir \'cache/\' basename \'_pair.mat\']);
catch exp1
disp \'Pair region feature\'
shapemean = calcShapeMean(seg, numlabel);
area = shapemean.area;
centroids = shapemean.center;
rgbmean = calcRGBMean(im, seg, numlabel);
texthist = calcTextonHist(im, seg, numlabel);
labhist = calcLabHist(im, seg, numlabel);
d_text=dist_chi2(texthist\', texthist\');
d_lab =dist_chi2(labhist\', labhist\');
ind = [];
finalvector = zeros(numlabel,numlabel, 8);
for i=1:numlabel
for j=1:numlabel
if i==j , continue; end
r = rgbmean(i,:)./rgbmean(j,:);
dist = norm(centroids(i,:) - centroids(j,:))/sqrt(sqrt(area(i)*area(j)));
finalfeature = [d_text(i,j), d_lab(i,j), ...
r, dist, abs(r(1)./r(2)-1)*10, abs(r(2)./r(3)-1)*10];
finalvector(j,i,:)=finalfeature;
end
end
finalvector = reshape(finalvector, [numlabel*numlabel 8]);
g_diff = zeros(numlabel, numlabel);
g_same = zeros(numlabel, numlabel);
save([opt.dir \'cache/\' basename \'_pair.mat\'], \'finalvector\', \'shapemean\');
end
load(opt.binaryClassifier, \'diffmodel\', \'samemodel\');
disp \'Pair region classification\'
[err, s1]=svmclassify(finalvector, zeros(numlabel*numlabel, 1) , diffmodel);
[err, s2]=svmclassify(finalvector, zeros(numlabel*numlabel, 1), samemodel);
s1 = reshape(s1, [numlabel numlabel]);
s2 = reshape(s2, [numlabel numlabel]);
k1=100; k2=200;
t1 = sort(s1(:));t1(isnan(t1))=[];
t2 = sort(s2(:));t2(isnan(t2))=[];
thresh1 = t1(max(1, length(t1(:))-k1)); thresh1 = max(.6, thresh1);
thresh2 = t2(max(1, length(t2(:))-k2)); thresh2 = max(.6, thresh2);
% thresh1 = t1(max(1, length(t1(:))-k1)); thresh1 = max(0, thresh1);
% thresh2 = t2(max(1, length(t2(:))-k2)); thresh2 = max(0, thresh2);
% thresh1 = 0;
% thresh2 = 0;
%FIXME!!!!!!!!!!!!
if strcmp(\'models/model_pair_our.mat\', opt.binaryClassifier)
for i=1:numlabel
for j=1:numlabel
if i==j , continue; end
w = sqrt(shapemean.area(i)*shapemean.area(j));
g_diff(i,j) = w*s1(j,i);
g_same(i,j) = w*s2(j,i);
end
end
else
for i=1:numlabel
for j=1:numlabel
if i==j , continue; end
w = sqrt(shapemean.area(i)*shapemean.area(j));
g_diff(i,j) = w*s1(i,j);
g_same(i,j) = w*s2(i,j);
end
end
end
nNodes = numlabel;
nStates = 2;
adj1 = logical(sparse(nNodes,nNodes));
adj2 = logical(sparse(nNodes,nNodes));
m=buildAdjacentMatrix(seg, numlabel);
for i=1:numlabel
for j=1:numlabel
if opt.adjecent,
if ~m(i,j) continue; end;
end;
if s1(i,j)>thresh1
adj1(i,j)=1;
end
if s2(i,j)>thresh2
adj2(i,j)=1;
end
end
end
nodePot = zeros(nNodes,nStates);
w1 = 1;
if ~opt.pairwiseonly
for i=1:numlabel
wi = w1 * shapemean.area(i);
nodePot(i,1) = -s(i)*wi;
nodePot(i,2) = s(i)*wi;
end
end
if 1
sc = shapemean.center;
nim = im;
[gx gy] = gradient(double(seg));
eim = (gx.^2+gy.^2)>1e-10;
t = nim(:,:,1); t(eim)=0; nim(:,:,1)=t;
t = nim(:,:,2); t(eim)=0; nim(:,:,2)=t;
t = nim(:,:,3); t(eim)=0; nim(:,:,3)=t;
f3 = figure(3);
clf;
imshow(nim);
hold on
for i=1:numlabel
for j=1:numlabel
if ~adj1(i,j) && ~adj2(i,j), continue; end
if s1(i,j)>thresh1
plot([sc(i,1) sc(j,1)], [sc(i,2) sc(j,2)], \'b\');
plot(sc(i,1), sc(i,2), \'bo\')
elseif s2(i,j)>thresh2
plot([sc(i,1) sc(j,1)], [sc(i,2) sc(j,2)], \'r\');
end
end
end
%print(f3, \'-dpsc\', [opt.dir \'cache/\' basename \'_graph.eps\']);
if ~opt.save
figure(3)
imshow(nim);
hold on
for i=1:numlabel
for j=1:numlabel
if ~adj1(i,j) && ~adj2(i,j), continue; end
if s1(i,j)>thresh1
plot([sc(i,1) sc(j,1)], [sc(i,2) sc(j,2)], \'b\');
plot(sc(i,1), sc(i,2), \'bo\')
elseif s2(i,j)>thresh2
plot([sc(i,1) sc(j,1)], [sc(i,2) sc(j,2)], \'r\');
end
end
end
figure(6), imagesc(s(seg))
figure(4), imagesc(seg)
end
end
edgeStruct1 = UGM_makeEdgeStruct_directed(adj1,nStates);
edgeStruct2 = UGM_makeEdgeStruct_directed(adj2,nStates);
edgePot = [];
w3=1;
w2=2;
for e = 1:edgeStruct1.nEdges
n1 = edgeStruct1.edgeEnds(e,1);
n2 = edgeStruct1.edgeEnds(e,2);
%nodePot(n1,1) = nodePot(n1,1)+ w2*(g_diff(n1, n2)-g_diff(n2, n1));
%nodePot(n2,2) = nodePot(n2,2)+ w2*(g_diff(n1, n2)-g_diff(n2, n1));
nodePot(n1,1) = nodePot(n1,1)+ w2*g_diff(n1, n2);
nodePot(n1,2) = nodePot(n1,2)- w2*g_diff(n1, n2);
nodePot(n2,1) = nodePot(n2,1)- w2*g_diff(n1, n2);
nodePot(n2,2) = nodePot(n2,2)+ w2*g_diff(n1, n2);
end
for e = 1:edgeStruct2.nEdges
n1 = edgeStruct2.edgeEnds(e,1);
n2 = edgeStruct2.edgeEnds(e,2);
edgePot(:,:,e) = [g_same(n1, n2) 0;...
0, g_same(n1, n2) ].*[w3 1; 1 w3];
end
if ~isempty(edgePot)
Decoding = UGM_Decode_ModifiedCut(nodePot,edgePot,edgeStruct2);
else
Decoding = double(sign(s))+1;
end
hardmap = Decoding(seg)-1;
if ~opt.save
figure(4)
ss = double(sign(s));
ssmap=(1-ss(seg))/2;
imshow(double(ssmap))
figure(5)
imshow(1-double(hardmap))
figure(1);
imshow(im);
else
imwrite(hardmap,[opt.dir \'binary/\' basename \'_binary.png\']);
ss = double(sign(s));
ssmap=(1-ss(seg))/2;
imwrite(1-ssmap,[opt.dir \'unary/\' basename \'_unary.png\']);
save([opt.dir \'cache/\' basename \'_detect.mat\'],\'hardmap\',\'ssmap\');
shadowim = hardmap;
tmp = ones(size(im));
tmp2 = cat(3, zeros([size(shadowim) 2]), 0.5*shadowim);
mask = logical(repmat(shadowim, [1 1 3]));
tmp(mask) = tmp2(mask);
%tmp = shadowim.*ones(size(shadowim));
%tmp = cat(3, zeros([size(shadowim) 2]), shadowim);
grayim = im2double(repmat(rgb2gray(im), [1 1 3]));
im2 = (grayim+tmp)/2;
imwrite(im2, [opt.dir \'mask/\' basename \'_mask.png\']);
end
RegionScore = s;
DiffScore = s1;
SameScore = s2;
DiffAdj = adj1;
SameAdj = adj2;
save([opt.dir \'cache/\' basename \'_everything.mat\'], \'RegionScore\', \'DiffScore\', \'SameScore\', \'DiffAdj\', \'SameAdj\', \'seg\', \'im\', \'hardmap\', \'ssmap\');
% get the pairing information consistent with the final detection.
[shadow, non_shadow] = find(adj1 == 1);
pair = [];
num_pair = numel(non_shadow);
for i = 1:num_pair
if Decoding(non_shadow(i))==1 && Decoding(shadow(i)) == 2
pair = [pair; non_shadow(i) shadow(i)];
end
end
save([opt.dir \'cache/\' basename \'_finalpair.mat\'], \'pair\');
end
4run matting
addpath(\'matting\');
addpath(\'utils\');
if (~exist(\'thr_alpha\',\'var\'))
thr_alpha=[];
end
if (~exist(\'epsilon\',\'var\'))
epsilon=[];
end
if (~exist(\'win_size\',\'var\'))
win_size=[];
end
if (~exist(\'levels_num\',\'var\'))
levels_num=1;
end
if (~exist(\'active_levels_num\',\'var\'))
active_levels_num=1;
end
for i =1:numel(testfnlist)
fprintf(\'processing %d out of %d\ \', i, numel(testfnlist));
load([\'data/cache/\' testfnlist{i} \'_finalpair.mat\']);
load([\'data/cache/\' testfnlist{i} \'_everything.mat\']);
img = im;
I=double(img)/255;
load([\'data/cache/\' testfnlist{i} \'_detect.mat\']);
hard_map=hardmap;
hard_map_1=conv2(hard_map,fspecial(\'average\',5),\'same\');
hard_map_2=conv2(hard_map,fspecial(\'average\',5),\'same\');
consts_map=hard_map_2>1-1e-8 | hard_map_1==0;
consts_vals=hard_map_1==0;
alpha=solveAlpha(I,consts_map,consts_vals,epsilon,win_size);
soft_map=alpha;
ratio = cal_ratio(seg,pair,hard_map,soft_map,I);
red=I(:,:,1);
green=I(:,:,2);
blue=I(:,:,3);
red_val=ratio(1);
green_val=ratio(2);
blue_val=ratio(3);
red_recover=(ones(size(soft_map))*(red_val+1))./(soft_map*red_val+1).*red;
green_recover=(ones(size(soft_map))*(green_val+1))./(soft_map*green_val+1).*green;
blue_recover=(ones(size(soft_map))*(blue_val+1))./(soft_map*blue_val+1).*blue;
shadow_free=zeros(size(I));
shadow_free(:,:,1)=red_recover;
shadow_free(:,:,2)=green_recover;
shadow_free(:,:,3)=blue_recover;
shadow_free(shadow_free(:)>1) = 1;
imwrite(soft_map, [\'data/matting/\' testfnlist{i} \'_soft.jpg\'], \'jpg\');
imwrite(shadow_free, [\'data/removal/\' testfnlist{i} \'_recovery.jpg\'], \'jpg\');
end
5UGM decode
addpath(\'matting\');
addpath(\'utils\');
if (~exist(\'thr_alpha\',\'var\'))
thr_alpha=[];
end
if (~exist(\'epsilon\',\'var\'))
epsilon=[];
end
if (~exist(\'win_size\',\'var\'))
win_size=[];
end
if (~exist(\'levels_num\',\'var\'))
levels_num=1;
end
if (~exist(\'active_levels_num\',\'var\'))
active_levels_num=1;
end
for i =1:numel(testfnlist)
fprintf(\'processing %d out of %d\ \', i, numel(testfnlist));
load([\'data/cache/\' testfnlist{i} \'_finalpair.mat\']);
load([\'data/cache/\' testfnlist{i} \'_everything.mat\']);
img = im;
I=double(img)/255;
load([\'data/cache/\' testfnlist{i} \'_detect.mat\']);
hard_map=hardmap;
hard_map_1=conv2(hard_map,fspecial(\'average\',5),\'same\');
hard_map_2=conv2(hard_map,fspecial(\'average\',5),\'same\');
consts_map=hard_map_2>1-1e-8 | hard_map_1==0;
consts_vals=hard_map_1==0;
alpha=solveAlpha(I,consts_map,consts_vals,epsilon,win_size);
soft_map=alpha;
ratio = cal_ratio(seg,pair,hard_map,soft_map,I);
red=I(:,:,1);
green=I(:,:,2);
blue=I(:,:,3);
red_val=ratio(1);
green_val=ratio(2);
blue_val=ratio(3);
red_recover=(ones(size(soft_map))*(red_val+1))./(soft_map*red_val+1).*red;
green_recover=(ones(size(soft_map))*(green_val+1))./(soft_map*green_val+1).*green;
blue_recover=(ones(size(soft_map))*(blue_val+1))./(soft_map*blue_val+1).*blue;
shadow_free=zeros(size(I));
shadow_free(:,:,1)=red_recover;
shadow_free(:,:,2)=green_recover;
shadow_free(:,:,3)=blue_recover;
shadow_free(shadow_free(:)>1) = 1;
imwrite(soft_map, [\'data/matting/\' testfnlist{i} \'_soft.jpg\'], \'jpg\');
imwrite(shadow_free, [\'data/removal/\' testfnlist{i} \'_recovery.jpg\'], \'jpg\');
end










