Это выглядит, как она может соответствовать рамки сегментации изображений GraphCut:
Вы хотите найти двоичное задание на пиксель (1 - этот пиксель принадлежит к переднему плану, 0 - пиксель является частью фона). Это назначение должно включать как можно больше «мест текстур» на переднем плане, сохраняя при этом «гладкие границы» между передним и задним фонами.
Требование гладкости не позволяет вашему «идеальному» назначению быть 1 для синих точек и нулевым везде.
Теперь, как искать такое двоичное назначение с помощью Matlab?
Предположим, что у вас есть img
размера H
-by- W
, и вы обнаружили местоположение объектов текстуры и сохранили это местоположение в матрице .
Установка на поэлементной стоимость:
>> bgCost = zeros(H, W);
>> bgCost([1 H] * (locs-1) + 1) = 1000; %// put 1000 penalty for assigning texture dot to foreground
>> fgCost = 10*ones(H, W); %// assign some positive penalty for assigning non-texture location to FG - prevent an "all foreground" solution.
>> fgCost([1 H] * (locs-1) + 1) = 0;
Оптимизация:
>> lambda = 5; %// set relative weight between smoothness term and "texture" term
>> gch = GraphCut('open', cat(3, fgCost,bgCost), lambda * [0 1;1 0],
>> [gch BW] = GraphCut('expand', gch); %//optimization
>> gch = GraphCut('close', gch); %//cleanup
Вы должны получить хороший двоичную маску BW
>> figure;imshow(BW, []);title('binary mask');
Есть три параметра, вы можете играть если вы не удовлетворены результатом BW
:
- стоимость, которую вы назначаете текстурным точкам в фоновом режиме (здесь задано значение 1000).
- стоимость, которую вы назначаете не текстурным пикселям на переднем плане (здесь здесь 10).
- Относительная прочность плавности
lambda
.
Попробуйте изменить эти значения и посмотреть, как они влияют на полученную маску.
Я использую this matlab wrapper для оптимизации GraphCut.
Ницца. BTW, ваша обложка Graph Cuts была очень полезной в моем Ph.D. исследование. +1. – rayryeng
@rayryeng Я рад, что вы сочтете это полезным :) – Shai
Спасибо за подробное решение. Я получаю ошибку в строке bgCost ([1 H] * (locs-1) + 1) = 1000; Ошибка: размеры внутренней матрицы должны совпадать. Можете ли вы рассказать мне о функции этой линии? – user3563929