В этом примере показано, как в интерактивном режиме выбрать области изображений и, inpaint выбранная область при помощи основанного метода сопоставления образца. Интерактивный inpainting позволяет вам выбирать область многократно и выполнять inpainting итеративно, чтобы достигнуть желаемых результатов.
В этом примере вы выполняете заполнение области и удаление объекта:
В интерактивном режиме выбирая inpainting область.
Динамически обновление значений параметров.
Визуализация результатов динамически.
Считайте изображение в inpaint в рабочую область. Изображение имеет недостающие области изображений, чтобы быть заполненным через inpainting.
I = imread('greensdistorted.png');
Создайте интерактивное окно рисунка, чтобы отобразить изображение, чтобы быть inpainted. В окне можно выбрать видимую область (ROI), и динамически обновить значения параметров.
h = figure('Name','Interactive Image Inpainting','Position',[0,0,700,400]); % Create a panel in the current figure to interactively set the parameter % values. dataPanel = uipanel(h,'Position',[0.01 0.5 0.25 0.5],'Title','Set parameter values','FontSize',10); % Add an user control interface for specifying the patch size. % Set the default patch size value to 9. uicontrol(dataPanel,'Style','text','String','Enter Patch Size','FontSize',10,'Position',[1 150 120 20]); data.patchSize = uicontrol(dataPanel,'Style','edit','String',num2str(9),'Position',[7 130 60 20]); % Add an user control interface for selecting the fill order. % Set the default fill order to gradient. uicontrol(dataPanel,'Style','text','String','Select Filling Order','FontSize',10,'Position',[5 100 120 20]); data.fillOrder = uicontrol(dataPanel,'Style','popupmenu','String',{'gradient','tensor'},'Position',[7 80 80 20]); % Create a panel in the current figure to display the image. viewPanel = uipanel(h,'Position',[0.25 0 0.8 1],'Title','Interactive Inpainting','FontSize',10); ax = axes(viewPanel);
Отобразите изображение в интерактивном окне рисунка.
hImage = imshow(I,'Parent',ax);
Выберите ROI в интерактивном режиме и динамически inpaint выбранные ROI при помощи функции обратного вызова clickCallback
. Присвойте указатель на функцию, это ссылается на clickCallback
функционируйте к ButtonDownFcn
свойство объекта изображения.
hImage.ButtonDownFcn = @(hImage,eventdata)clickCallback(hImage,eventdata,data);
В интерактивном режиме inpaint изображение путем выполнения этих шагов.
Шаг 1: Выберите размер закрашенной фигуры и порядок заливки для inpainting. К inpaint с локальными значениями параметров измените размер закрашенной фигуры, и заливка заказывают требуемым значениям при помощи контроля за работой пользователей в интерактивном окне рисунка.
Выбор размера закрашенной фигуры и порядка заливки влияет на качество inpainting, и их оптимальное значение зависят от характеристик области изображений, чтобы быть inpainted.
Значение размера закрашенной фигуры по умолчанию установлено к 9.
В inpaint области с регулярными структурами выберите больший размер закрашенной фигуры и достигните бесшовного inpainting.
В inpaint области, которые локально универсальны относительно маленького окружения, выберите меньший размер закрашенной фигуры.
Порядок заливки по умолчанию устанавливается к 'gradient
'. Можно выбрать 'gradient
'или 'tensor
'основанная заливка заказывает для областей inpainting изображений. Однако 'tensor
'основанный порядок заливки более подходит для областей inpainting изображений с линейными структурами и регулярными структурами.
Шаг 2: Создайте ROI от руки в интерактивном режиме при помощи вашей мыши. Расположите указатель на оси и перетаскивание, чтобы чертить форму ROI. Выпустите указатель, чтобы закрыть форму.
Функция динамически обновляет значения параметров, заданные при помощи интерфейса контроля за работой пользователей и inpaints выбранный ROI. Повторите шаги 1 и 2, для того, чтобы к inpaint все желаемые области в изображении.
Создайте clickCallback
использоваться с ButtonDownFcn
в интерактивном режиме выбрать и inpaint ROI.
function clickCallback(src,~,data) % Get the parameter values for inpainting. fillOrder = data.fillOrder.String{data.fillOrder.Value}; pSize = data.patchSize.String; patchSize = str2double(pSize); % Select and draw freehand ROI. h = drawfreehand('Parent',src.Parent); % Create a binary mask of the selected ROI. mask = h.createMask(src.CData); % Run exemplar-based inpainting algorithm with user given parameters. newImage = inpaintExemplar(src.CData,mask,'PatchSize',patchSize,'FillOrder',fillOrder); % Update input image with output. src.CData = newImage; % Delete ROI handle. delete(h); end
inpaintExemplar
| createMask
| Freehand
| drawfreehand