2014-12-15 5 views
0

У меня есть изображение с некоторой текстурой в области, показанной на первом изображении. Я хочу сегментировать изображение на основе этой текстуры. Для этого я выделил функцию, показанную синими квадратами (второе изображение). Я хочу извлечь область, связанную с прямоугольным распределением функций (показано красной пунктирной линией).Сегментация изображения на основе оптических характеристик

Изображение 1: enter image description here

Изображение 2: enter image description here

Может кто-нибудь помочь мне, предлагая некоторые методики для достижения этой проблемы. Благодаря

ответ

1

Это выглядит, как она может соответствовать рамки сегментации изображений 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.

+1

Ницца. BTW, ваша обложка Graph Cuts была очень полезной в моем Ph.D. исследование. +1. – rayryeng

+0

@rayryeng Я рад, что вы сочтете это полезным :) – Shai

+0

Спасибо за подробное решение. Я получаю ошибку в строке bgCost ([1 H] * (locs-1) + 1) = 1000; Ошибка: размеры внутренней матрицы должны совпадать. Можете ли вы рассказать мне о функции этой линии? – user3563929

Смежные вопросы