Main Content

Pintura interactiva de imágenes mediante coincidencia sin bordes

En este ejemplo se muestra cómo seleccionar de forma interactiva regiones de imagen y inpintar la región seleccionada mediante el uso de un método de coincidencia basada en ejemplos. La pintura interactiva le permite seleccionar una región varias veces y realizar la pintura iterativa para lograr los resultados deseados.

En este ejemplo, se realiza el llenado de regiones y la eliminación de objetos mediante:

  • Selección interactiva de la región de pintura.

  • Actualización dinámica de los valores de parámetro.

  • Visualización dinámica de los resultados.

Leer imagen en el espacio de trabajo

Lea una imagen para inpintar en el espacio de trabajo. La imagen tiene regiones de imagen que faltan para rellenar a través de la pintura inpainting.

I = imread('greensdistorted.png');

Crear una ventana de figura interactiva

Cree una ventana de figura interactiva para mostrar la imagen que se va a pintar. En la ventana, puede seleccionar la región de interés (ROI) y actualizar dinámicamente los valores de los parámetros.

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);

Muestre la imagen en la ventana de figura interactiva.

hImage = imshow(I,'Parent',ax); 

Seleccionar e inpintar regiones de imagen de forma interactiva

Seleccione ROIs de forma interactiva y dinámica, inpaint los ROI seleccionados mediante la función de devolución de llamada Assign a function handle that references the function to the property of the image object.clickCallback. clickCallbackButtonDownFcn

hImage.ButtonDownFcn = @(hImage,eventdata)clickCallback(hImage,eventdata,data);

Inpaint la imagen de forma interactiva siguiendo estos pasos.

Elija el tamaño del parche y el orden de relleno para la pintura.Paso 1: Para inpintar con valores de parámetros locales, modifique el tamaño del parche y el orden de relleno a los valores deseados mediante el uso de controles de usuario en la ventana de figura interactiva.

La elección del tamaño del parche y el orden de relleno influye en la calidad de la pintura y su mejor valor dependen de las características de la región de la imagen que se va a pintar.

El valor de tamaño de parche predeterminado se establece en 9.

  • Para pintar regiones con texturas regulares, elija un tamaño de parche más grande y consiga una pintura sin problemas.

  • Para inpintar regiones que sean uniformes localmente con respecto a una vecindad pequeña, elija un tamaño de parche más pequeño.

El orden de relleno predeterminado se establece en ' '.gradient Puede elegir ' ' o ' ' ' orden de relleno basado para las regiones de imagen de pintura.gradienttensor Sin embargo, ' ' el orden de relleno basado es más adecuado para pintar regiones de imagen con estructuras lineales y texturas regulares.tensor

Cree un ROI a mano alzada de forma interactiva con el ratón.Paso 2: Coloque el puntero en los ejes y haga clic y arrastre para dibujar la forma de ROI. Suelte el puntero para cerrar la forma.

La función actualiza dinámicamente los valores de parámetro especificados mediante la interfaz de control de usuario e inpinta el ROI seleccionado. Relance los pasos 1 y 2, para inpintar todas las regiones deseadas en la imagen.

Crear función de devolución de llamada para seleccionar e inpintar ROI

Cree el que se utilizará con el para seleccionar interactivamente y inpaint ROIs.clickCallbackButtonDownFcn

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

Consulte también

| | |

Temas relacionados