画像修復プログラムについて
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)
Categories
Find more on Image Preview and Device Configuration in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!