Lassen Sie uns ein beschädigtes Bild C, Bias-Profil, B und True Image A. Also, wenn wir ein Modell definieren können,Warum funktioniert die Oberflächenanpassung in der logarithmischen Domäne nicht?
C = A * B;
Wir können das Original-Bild wieder wie
A = C/B;
in der Log-Domäne,
log A = log C - log B.
Lassen Sie uns jetzt sagen, ich wahre Bild haben, A, und ich bin die Vorspannung B Einführung und ich bin das beschädigte Bild bekommen C. Nun kann ich dieses verzerrte Bild C mit der Polynomregression korrigieren. Ich werde die Oberfläche anpassen, sobald ich das beschädigte Bild C in der Log-Domäne konvertiert habe, und ich kann das Bias-Profil davon abziehen, wie oben gezeigt. Nach der Subtraktion muss ich exp (log C - log B) nicht wie offensichtlich anwenden. Eine Onnu-Normalisierung ist erforderlich, um den Bereich [0 255] zu erhalten.
Algorithmus:
Originalbild ohne Vormagnetisierungsfeld wird mit dem Polynom Profil eingeführt, das in einem Bild resultiert, die nicht gleichförmige Ausleuchtung.
Biased Bild wird in logarithmischen Bereich umgewandelt und Oberfläche angenähert wird unter Verwendung von Polynomanpassung
approximierte Oberfläche von der vorgespannten Bild subtrahiert wird, die Rückseite ohne Vormagnetisierungsfelder in Originalbildes resultiert. (Im Idealfall).
messen RMSE zwischen approximierter Oberfläche und eingeführtem Polynomfeld in Schritt 1. Messen Sie RMSE zwischen dem Biased Image und dem Bild, das wir nach der Subtraktion am Ende erhalten.
Code:
clear;clc;close all;
%read the image, on which profile is to be generated
I = ones(300);
I = padarray(I,[20,20],'both','symmetric'); % padding
%%
%creating a bias profile using polynomial modeling
[x,y] = meshgrid(1:size(I,1),1:size(I,2));
profile = -2.5.*x.^3 - 2.5.* y.^3 + 0.25 .*(x.* y.^2) - 0.3*(x.^2 .* y) - 0.5.* x .* y - x + y - 2.5*(x.^2) - y.^2 + 0.5 .* x .*y + 1;
% come to scale [0 1]
profile = profile - min(profile(:));
profile = profile/max(profile(:));
figure,imshow(profile,[]); %introduced bias profile
%% corrupt the image
biasedImage = (I .* profile);
figure,imshow(biasedImage,[]); %biased Image
cImage = log(biasedImage+1);% conversion to log domain/ +1 is needed to avoid infinite values in case of 0 intensty values in corrupted image.
%% forming the input for prediction of surface
colorChannel = cImage;
rows = size(colorChannel, 1);
columns = size(colorChannel, 2);
[X,Y] = meshgrid(1:columns, 1:rows);
z = colorChannel;
x1d = reshape(X, numel(X), 1);
y1d = reshape(Y, numel(Y), 1);
z1d = double(reshape(z, numel(z), 1)); %dependent variables
x = [x1d y1d]; % two regressors
%% surface fitting
m = 3; %define the order of polynomial
p = polyfitn(x,z1d,m); %prediction step
zg = polyvaln(p, x);
modeledColorChannel = reshape(zg, [rows columns]); % predicted surface
%modeledColorChannel = exp(modeledColorChannel)-1; if we use this step then the step below will be division instead of subtraction
%f = biasedImage./ modeledColorChannel; Same as the step below but as we are using exponential, it will be devision.
%% correction
f = cImage- modeledColorChannel; %getting the original image back.
%grayImage = f(21:end-20,21:end-20);
%modeledColorChannel = modeledColorChannel(21:end-20,21:end-20); %to remove the padding
figure,imshow(f,[]);
figure,imshow(modeledColorChannel,[]);
%% measure the RMSE for image
y = (I - f);
RMSE = sqrt(mean(y(:).^2));
disp(RMSE);
% RMSE for profile
z = (modeledColorChannel - profile);
RMSE = sqrt(mean(z(:).^2));
disp(RMSE);
Ergebnisse:
Bei f = cImage- modeledColorChannel
1,0000
0,2127
korrigiertes Bild: enter image description here
Bei Teilung: f = CImage ./ modeledColorChannel (obwohl es nicht die richtige pro Theorie.)
0,0190
0,2127
korrigiertes Bild: enter image description here
Jetzt Die Frage ist: Ich bekomme einen niedrigeren RMSE-Wert am Ende, wenn ich die Division in der Log-Domäne anstelle der Subtraktion mache, wie ich es hier mache (Siehe %% correction Abschnitt). Wie ist es möglich, einen höheren RMSE für die Subtraktion zu haben, wenn dieser theoretisch korrekt ist?Nach meinem Verständnis, wenn ich alle meine Berechnung in Log-Domain Bildaufteilung behalten wird Bild Subtraktion werden. Es ist offensichtlich, wenn Sie den Code ausführen und sehen Sie das Bild f am Ende der Korrektur für Division und Subtraktion in Log-Domain.
Hinweis: In beiden Fällen ist RMSE zwischen dem eingeführten und dem wahrgenommenen Profil dasselbe wie meine Schätzung in der Log-Domäne in beiden Fällen. Eine Bildteilung oder eine Bildsubtraktion.
Sehen Sie dies für polyfitn Werkzeugkasten. www.mathworks.com/matlabcentral/fileexchange/34765-polyfitn
'A = C/B;' ist nicht 'log A = log C/log B' –
Ja ist es nicht. Deshalb mache ich f = cImage - modeledColorChannel, das das Schrittlog ausführt A = log C - log B. und das ist meine Frage, warum ich weniger RMSE für Division anstelle von Subtraktion bekomme. lass es mich wissen, wenn ich dich falsch verstehe. @AnderBiguri –