Ответ 1
Я не знаком с реализацией графика с FEX, с которой вы связаны,
но я покажу пример, используя GCMex
matlab wrapper (надлежащее раскрытие: я реализовал эту оболочку).
Предположим, что у вас есть изображение размера size(S)
с n
пикселями и K
матрицей разреженной размером n
-by- n
с K(ii,jj)
, отображающей, насколько хорошо ii
и jj
пиксели подключены (для соседних ii
и jj
).
Кроме того, у вас есть маска u
пикселей переднего плана и маска v
фоновых пикселей, которые будут рассматриваться как жесткие ограничения.
Сначала постройте термин данных с помощью u
и v
:
Dc = 1000*[u(:), v(:)]; %// assign very large cost for picking FG pixel to label zero and vice versa
Как вы можете видеть, термин Dc
данных - это массив n
-by-2, стоимость которого присваивается метке l
(либо 0, либо один), чтобы пиксель ii
хранится в Dc(ii,l+1)
, Поэтому для пикселей на переднем плане (u(ii)
равно 1), назначая метку l=0
(т.е. фон), стоимость, которую вы платите, равна 1000. То же самое касается пикселей в фоновом режиме (v(ii)
равно 1), назначая их переднего плана ( т.е. l
= 1) стоит 1000. Следовательно, термин данных Dc
дает очень высокую стоимость семенным пикселям (передним или задним), получая неправильную метку.
Построить объект, отрезанный графом
gch = GraphCut('open'), Dc, [0 1; 1 0], K );
[gch L] = GraphCut('expand',gch);
gch = GraphCut('close',gch);
L = reshape(L, size(u));
figure; imshow(L,[]); title('the resulting mask');
Обратите внимание, что в rder для использования GCMex
вам необходимо выполнить инструкции по установке и скомпилировать его для его работы.