画像修復プログラムについて
3 views (last 30 days)
Show older comments
画像修復プログラムを作成したのですが上手く修復されません どのようにしたらうまくいきますか
if true
%
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)
end
1 Comment
michio
on 8 Jul 2018
コードだけでは「上手く修復され」ない状況を理解するのはなかなかの難題です。 どういう画像に対して(入力)どう修復されたいのか(期待される出力)などもう少し詳細も記載いただきますと、回答も付きやすいかと思います。よろしくお願いします。
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!