-
Notifications
You must be signed in to change notification settings - Fork 2
/
Grab_Cut.m
44 lines (41 loc) · 1.96 KB
/
Grab_Cut.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
%% Àëãîðèòì ïîñëåäîâàòåëüíîé îöåíêè ïàðàìåòðîâ ïîñðåäñòâîì ãåíåðàöèè âûáîðêè èç ñõåìû Ãèááñà
%---input---------------------------------------------------------
% data: èñõîäíûå äàííûå, ìàòðèöà NxP, N - êîëè÷åñòâî ïèêñåëåé
% segment: ìàòðèöà íà÷àëüíîé ñåãìåíòàöèè
% k: êîëè÷åñòâî ìåòîê
% lambda: ïàðàìåòð ñãëàæèâàíèÿ
% sigma: ïàðàìåòð ñãëàæèâàíèÿ
% mus: íà÷àëüíîå çíà÷åíèå ïàðàìåòðà vMF, ìàòðèöà LxP
% kappas: íà÷àëüíîå çíà÷åíèå ïàðàìåòðà vMF, âåêòîð Lx1
% burn_in: êîëè÷åñòâî îòáðàñûâàåìûõ çâåíüåâ èç ñõåìû Ãèááñà
% sample_num: êîëè÷åñòâî çâåíüåâ èñïîëüçóåìûõ äëÿ îöåíêè ïàðàìåòðîâ
% max_iter: ìàêñèìàëüíîå êîëè÷åñòâî èòåðàöèé
% neighbours_count: êîëè÷åñòâî ñîñåäåé, äîñòóïíûå çíà÷åíèÿ
% 2-D: 4, 8, 16
% 3-D: 6, 26
%---output--------------------------------------------------------
% sample: ôèíàëüíàÿ ñåãìåíòàöèÿ
% beta: îöåíåííîå çíà÷åíèå beta
% mus: îöåíåííîå çíà÷åíèå mus
% kappas: îöåíåííîå çíà÷åíèå kappas
function [sample, mus, kappas, all_mus, all_kappas] = Grab_Cut(data, segment, k, lambda, sigma, mus, kappas, map_iter, max_iter, neighbours_count)
dim = size(segment);
p = size(data, 2);
all_mus = zeros([max_iter, size(mus)]);
all_kappas = zeros([max_iter, size(kappas)]);
for i=1:max_iter
fprintf('\t GrabCut Iteration: %d of %d\n',i,max_iter);
% ïîäñòðàèâàåì ïàðàìåòðû
[mus, kappas] = EstimateParametersGrabCut(data, segment, k, p, mus, kappas);
all_mus(i, :, :) = mus;
all_kappas(i, :) = kappas;
% ñ÷èòàåì âåðîÿòíîñòè
[~, logprobs] = CalculateLikelihoodProbabilities(data, k, kappas, mus, segment);
% ñ÷èòàåì Bpq
%Neighbours = GetNeighbours(dim, neighbours_count);
%Bpq = lambda * exp(sum((repmat(data, neighbours_count, 1)-data(Neighbours, :)).^2, 2)./(2*sigma^2));
%Bpq = reshape(Bpq, [ prod(dim), neighbours_count ]);
% íàõîäèì MAP
[segment, ~] = MRF_MAP_GraphCutABSwap(segment, logprobs, 2, k, map_iter, neighbours_count);
end
sample = reshape(segment, dim);