見本のマッチングを使用した対話型のイメージ修復
この例では、イメージ領域を対話形式で選択し、見本ベースのマッチング法を使用して、選択した領域を修復する方法を示します。対話型の修復では、領域を複数回選択し、反復して修復を実行して、目的とする結果を得ることができます。
この例では、以下のようにして領域の塗りつぶしとオブジェクトの削除を実行します。
修復する領域を対話形式で選択する。
パラメーター値を動的に更新する。
結果を動的に可視化する。
イメージの読み取り
修復するイメージをワークスペースに読み取ります。このイメージには、修復を通じて塗りつぶされる欠損したイメージ領域があります。
I = imread('greensdistorted.png');
対話型の Figure ウィンドウの作成
対話型の Figure ウィンドウを作成して、修復するイメージを表示します。このウィンドウでは、関心領域 (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);
対話型の Figure ウィンドウにイメージを表示します。
hImage = imshow(I,'Parent',ax);
対話形式でのイメージ領域の選択と修復
対話形式で ROI を選択し、コールバック関数 clickCallback
を使用して、選択した ROI を動的に修復します。関数 clickCallback
を参照する関数ハンドルを image オブジェクトの ButtonDownFcn
プロパティに割り当てます。
hImage.ButtonDownFcn = @(hImage,eventdata)clickCallback(hImage,eventdata,data);
次の手順に従って、対話形式でイメージを修復します。
手順 1: 修復のパッチ サイズと塗りつぶし順序を選択します。局所的なパラメーター値を使用して修復するには、対話型の Figure ウィンドウでユーザー コントロールを使用して、パッチ サイズと塗りつぶし順序を目的の値に変更します。
パッチ サイズと塗りつぶし順序の選択は修復の品質に影響を与えます。使用する最適な値は、修復するイメージ領域の特性によって異なります。
パッチ サイズの既定値は 9 に設定されています。
規則的なテクスチャをもつ領域を修復するには、大きなパッチ サイズを選択して、シームレスな修復を実現します。
小さな近傍に対して局所的に一様な領域を修復するには、小さいパッチ サイズを選択します。
既定の塗りつぶし順序は 'gradient
' に設定されています。イメージ領域の修復のために 'gradient
' または 'tensor
' に基づく塗りつぶし順序を選択できます。ただし、'tensor
' に基づく塗りつぶし順序は、直線的な構造や規則的なテクスチャをもつイメージ領域の修復により適しています。
手順 2: マウスを使用して、フリーハンド ROI を対話的に作成します。座標軸上にポインターを配置し、クリック アンド ドラッグして ROI の形状を描画します。形状を閉じるには、ポインターを離します。
ユーザー コントロール インターフェイスを使用することにより、関数は、指定されたパラメーター値を動的に更新し、選択された ROI を修復します。手順 1 と 2 を繰り返して、イメージ内の目的とするすべての領域を修復します。
ROI を選択および修復するコールバック関数の作成
ROI を対話形式で選択および修復するために、ButtonDownFcn
と共に使用する clickCallback
を作成します。
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