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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MATLAB

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

Model

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

Q&A

0回答

1696閲覧

matlabでの画像修復

nikumanumama

総合スコア7

MATLAB

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

Model

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

0グッド

0クリップ

投稿2018/07/07 18:24

編集2018/07/07 21:09

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

matlab

1image = imread('kesson_kamome_abc.bmp'); 2image = double(image); 3image = image/255; 4imagesize = size(image); %画像のサイズ 5row = imagesize(1); %画像のサイズ(行数) 6column = imagesize(2); %画像のサイズ(列数) 7K = 2; %モデル次数 8%--------------------元の画像の出力 9% figure 10% imshow(image) 11 12 13%--------------------欠損部分のみ0の行列maskとベクトルmask_vを生成 14mask = logical(image_lucked(:,:,1)); 15mask_v = mask'; 16mask_v = mask_v(:); 17 18figure(11) 19imshow(image_lucked) 20 21image_repaired = image_lucked; 22 23 24%論理演算を用いるため、ゼロの要素に十分小さい値を代入 25image(image==0) = 1e-10; 26 27image_lucked = image; 28%--------------------欠損部分の指定(ランダムver) 29percent=0.50; 30lucked_part = rand(row,column); %画像と同サイズのランダム行列を生成 31lucked_part((mask==0)) = 0; %行列の1/x(欠損部分に対応)に0を代入 32lucked_part(1:K,:)=1; 33lucked_part(row-K:row,:)=1; 34lucked_part(:,1:K)=1; 35lucked_part(:,column-K:column)=1; 36image_lucked(:,:,1) = image_lucked(:,:,1).*logical(lucked_part); %画像(R)の欠損部分に0を代入 37image_lucked(:,:,2) = image_lucked(:,:,2).*logical(lucked_part); %画像(G)の欠損部分に0を代入 38image_lucked(:,:,3) = image_lucked(:,:,3).*logical(lucked_part); %画像(B)の欠損部分に0を代入 39LUCK=1; 40 41 42%% 43%------------------------------------------ここから画像修復 44for z=1:3 %R,G,Bそれぞれに対し適用 45 46image_x = image_lucked(:,:,z); %各成分 47 48%既知画素のベクトルを生成 49x_known = image_x'; 50x_known = x_known(:); 51x_known(x_known==0) = []; 52image_x(image_x==0) = mean(image_x(:)); %欠損部分に初期値として画素の平均値を代入 53%--------------------STEP1の準備 54x_hat = zeros(size(mask(mask==0)),1); 55x_before = ones(size(mask(mask==0)),1); 56count = 0; 57 58%sparse関数を利用するため、座標ixとiyを生成 59ixtemp = []; 60ix = []; 61iy = []; 62for j=1:(2*K+1) 63 ixtemp=[ixtemp (1:(2*K+1))+(j-1)*row]; 64end 65for k=1:(column-(2*K+1)+1) 66 for i=1:(row-(2*K+1)+1) 67 ix=[ix ixtemp+(i-1)+(k-1)*row]; 68 iy = [iy ((k-1)*(row-(2*K+1)+1)+i)*ones(1,(2*K+1)^2)]; 69 end 70end 71 72%% 73while norm(x_hat-x_before) >= (1e-3)/length(x_hat) && count <= 2 74count = count + 1; 75x_before = x_hat; 76 77%STEP 1----------------------Xaの最小二乗解の導出 78X = zeros((row-2*K)*(column-2*K),(2*K+1)^2); %Xのサイズ:(row-2K)*(column-2K)×(2K+1)^2 79%Xの生成 80for w=1+K:row-K 81 for v=1+K:column-K 82 x = image_x(w-K:w+K,v-K:v+K); 83 x = x'; 84 x = x(:); 85 x = x'; 86 X((column-2*K)*(w-1-K)+(v-K),:) = x; 87 end 88end 89%注目画素のベクトルを取り出す 90x = X(:,((2*K+1)^2+1)/2); 91X(:,((2*K+1)^2+1)/2) = []; 92 93a_hat = (X'*X) \ X' * x; 94%a_hat = (X'*X)\X'*x; %最小二乗法により係数ベクトルa_hatを推定 95a_hat = [a_hat(1:((2*K+1)^2-1)/2);-1;a_hat(((2*K+1)^2+1)/2:((2*K+1)^2-1))]; 96a_hat = a_hat'; 97%----------------------------------STEP1 98 99%STEP2----------------------------------Axの最小二乗解の導出 100s = kron(ones(1,(row-2*K)*(column-2*K)), a_hat); %クロネッカー積を利用し、係数行列Aの(i,j)要素に代入する値を代入 101A = sparse(iy,ix,s); 102A_unknown = A(:,not(logical(mask_v(:)'))); 103A_known = A(:,logical(mask_v(:)')); 104 105x_hat = -(A_unknown'*A_unknown) \ A_unknown' * A_known * x_known; %最小二乗法によりx_hatを推定 106 107%0以上1以下に丸める 108x_hat(x_hat<0) = 0; 109x_hat(x_hat>1) = 1; 110 111image_x = image_x.*mask; 112image_x=image_x'; 113image_x(image_x==0) = x_hat; 114image_x=image_x'; 115%-----------------------------------STEP2 116end 117image_repaired(:,:,z)=image_x; 118 119end 120 121imwrite(image_repaired,strcat(image_name,'_',num2str(percent),'per_L2norm@random.jpg'),'jpg'); 122figure 123imshow(image_repaired) 124 125

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WathMorks

2018/07/08 01:20

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問