0

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

+0

'A = C/B;' ist nicht 'log A = log C/log B' –

+0

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 –

Antwort

0

Lassen Sie mich die Antwort auf meine Frage hinzufügen, als ich meinen Fehler fand, falls jemand in Zukunft demselben Problem gegenübersteht.

Fehler 1: Nach der Subtraktion muss ich exp (log C - log B) nicht wie offensichtlich anwenden. Nur Normalisierung ist erforderlich, um [0 255] Bereich zu erhalten.

Meine Intuition war, ich muss exp() nicht anwenden, um die ursprünglichen Werte zurück zu bekommen. Aber ich muss exp() anwenden. Log-Log LHS und RHS stornieren sich nie gegenseitig.

Wenn log (A) = log (B), um die Werte von A zurück zu bekommen, brauche ich A = exp (log (B)).

Fehler 2: In Log-Bereich, subtrahiere ich zwei Bilder, so dass ich nicht Unendlichkeitsproblem in der Log-Domain konfrontiert werden, die wir in der Regel im Falle einer Teilung Gesicht.

So einfach während Bild in Log-Domäne umwandelt, konnte ich nur tun,

cImage = log(biasedImage); 

statt,

cImage = log(biasedImage+1); 

Hier Zugabe +1 in den Bildern die unerwünschte Unschärfe schafft, weil in Schätzung während der Vorhersage der Oberfläche wird es die Oberfläche zu hohen Werten in den dunklen Bereichen drücken.

Verwandte Themen