質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • MATLAB

    171questions

    MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

  • Model

    86questions

    MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

matlabでの画像修復

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 203

nikumanumama

score 1

matlabを用いて画像修復プログラムを作成しました
しかし画像が上手く修復されません
どこがいけないのか教えていただけませんか
よろしくお願い致します

image = imread('kesson_kamome_abc.bmp');
image = double(image);
image = image/255;
imagesize = size(image);    %画像のサイズ
row =    imagesize(1);  %画像のサイズ(行数)
column = imagesize(2);  %画像のサイズ(列数)
K = 2;  %モデル次数
%--------------------元の画像の出力
% figure
% imshow(image)


%--------------------欠損部分のみ0の行列maskとベクトルmask_vを生成
mask = logical(image_lucked(:,:,1));
mask_v = mask';
mask_v = mask_v(:);

figure(11)
imshow(image_lucked)

image_repaired = image_lucked;


%論理演算を用いるため、ゼロの要素に十分小さい値を代入
image(image==0) = 1e-10;

image_lucked = image;
%--------------------欠損部分の指定(ランダムver)
percent=0.50;
lucked_part = rand(row,column);  %画像と同サイズのランダム行列を生成
lucked_part((mask==0)) = 0;  %行列の1/x(欠損部分に対応)に0を代入
lucked_part(1:K,:)=1;
lucked_part(row-K:row,:)=1;
lucked_part(:,1:K)=1;
lucked_part(:,column-K:column)=1;
image_lucked(:,:,1) = image_lucked(:,:,1).*logical(lucked_part);    %画像(R)の欠損部分に0を代入
image_lucked(:,:,2) = image_lucked(:,:,2).*logical(lucked_part);    %画像(G)の欠損部分に0を代入
image_lucked(:,:,3) = image_lucked(:,:,3).*logical(lucked_part);    %画像(B)の欠損部分に0を代入
LUCK=1;


%%
%------------------------------------------ここから画像修復
for z=1:3   %R,G,Bそれぞれに対し適用

image_x   = image_lucked(:,:,z); %各成分

%既知画素のベクトルを生成
x_known = image_x';
x_known = x_known(:); 
x_known(x_known==0) = [];
image_x(image_x==0) = mean(image_x(:));    %欠損部分に初期値として画素の平均値を代入
%--------------------STEP1の準備
x_hat = zeros(size(mask(mask==0)),1);
x_before = ones(size(mask(mask==0)),1);
count = 0;

%sparse関数を利用するため、座標ixとiyを生成
ixtemp = [];
ix = [];
iy = [];
for j=1:(2*K+1)
    ixtemp=[ixtemp (1:(2*K+1))+(j-1)*row];
end
for k=1:(column-(2*K+1)+1)
    for i=1:(row-(2*K+1)+1)
        ix=[ix ixtemp+(i-1)+(k-1)*row];
        iy = [iy ((k-1)*(row-(2*K+1)+1)+i)*ones(1,(2*K+1)^2)];
    end
end

%%
while norm(x_hat-x_before) >= (1e-3)/length(x_hat) && count <= 2
count = count + 1;
x_before = x_hat;

%STEP 1----------------------Xaの最小二乗解の導出
X = zeros((row-2*K)*(column-2*K),(2*K+1)^2);    %Xのサイズ:(row-2K)*(column-2K)×(2K+1)^2
%Xの生成
for w=1+K:row-K 
    for v=1+K:column-K
        x = image_x(w-K:w+K,v-K:v+K);
        x = x';
        x = x(:);
        x = x';
        X((column-2*K)*(w-1-K)+(v-K),:) = x;
    end
end
%注目画素のベクトルを取り出す
x = X(:,((2*K+1)^2+1)/2);
X(:,((2*K+1)^2+1)/2) = [];

a_hat = (X'*X) \ X' * x;
%a_hat = (X'*X)\X'*x;    %最小二乗法により係数ベクトルa_hatを推定
a_hat = [a_hat(1:((2*K+1)^2-1)/2);-1;a_hat(((2*K+1)^2+1)/2:((2*K+1)^2-1))];
a_hat = a_hat';
%----------------------------------STEP1

%STEP2----------------------------------Axの最小二乗解の導出
s = kron(ones(1,(row-2*K)*(column-2*K)), a_hat);   %クロネッカー積を利用し、係数行列Aの(i,j)要素に代入する値を代入
A = sparse(iy,ix,s);
A_unknown = A(:,not(logical(mask_v(:)')));
A_known = A(:,logical(mask_v(:)'));

x_hat = -(A_unknown'*A_unknown) \ A_unknown' * A_known * x_known;    %最小二乗法によりx_hatを推定

%0以上1以下に丸める
x_hat(x_hat<0) = 0;
x_hat(x_hat>1) = 1;

image_x = image_x.*mask;
image_x=image_x';
image_x(image_x==0) = x_hat;
image_x=image_x';
%-----------------------------------STEP2
end
image_repaired(:,:,z)=image_x;

end

imwrite(image_repaired,strcat(image_name,'_',num2str(percent),'per_L2norm@random.jpg'),'jpg');
figure
imshow(image_repaired)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • rkhs

    2018/07/08 10:20

    要所々々でimshowなりimagescなりで表示して、どこまで正しく、どこから不具合があるのか、まずはご自身で調べてください。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • MATLAB

    171questions

    MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

  • Model

    86questions

    MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。