Get sigma gaussian blur between two images

Suppose I have an image A, I applied Gaussian Blur on it with Sigam=3So, I got another image B. Is there a way to find out the applicable sigma if A, B are given?

Further clarification:

Image A:

Original image

Image B:

enter image description here

I want to write a function that accepts A,Band returns Sigma:

double get_sigma(cv::Mat const& A,cv::Mat const& B);

Any suggestions?

+4
source share
1 answer

EDIT1: (.. 9 3 x 3), . . EDIT1 EDIT2 , .

EDIT2: Humam, (LSE), .

, ​​, . , . , 3 x 3

kernel

result_pix_value = h11 * a(y, x) + h12 * a(y, x+1) + h13 * a(y, x+2) +
                   h21 * a(y+1, x) + h22 * a(y+1, x+1) + h23 * a(y+1, x+2) +
                   h31 * a(y+2, x) + h32 * a(y+2, x+1) + h33 * a(y+2, x+2)

a's - . 3 x 3 9 , 9 . 9 , 9 . Ax = b x, . , , .

, . wins

. , , , .

, . .

Octave. , Octave/Matlab. Octave .

, :

h =

   0.10963   0.11184   0.10963
   0.11184   0.11410   0.11184
   0.10963   0.11184   0.10963

, 5, . , , , .

g =

  9.5787e-015  -3.1508e-014  1.2974e-015  -3.4897e-015  1.2739e-014
  -3.7248e-014  1.0963e-001  1.1184e-001  1.0963e-001  1.8418e-015
  4.1825e-014  1.1184e-001  1.1410e-001  1.1184e-001  -7.3554e-014
  -2.4861e-014  1.0963e-001  1.1184e-001  1.0963e-001  9.7664e-014
  1.3692e-014  4.6182e-016  -2.9215e-014  3.1305e-014  -4.4875e-014

EDIT1: , .

  • . filt = conv2(a, h, 'same'); . , uint8, , . filt = floor(conv2(a, h, 'same'));, .
  • , , . , , b . , , , Ax = b .
  • Mv = 0 Mv squared-norm v = 1, SVD. , .
  • . ​​ 3x3 3 9. , v .
  • , .

EDIT2:

  • LSE, pinv(A'A)A'b. ( ) LSE.

:

clear all

im = double(imread('I2vxD.png'));

k = 5;
r = floor(k/2);

a = im(:, :, 1);  % take the red channel
h = fspecial('gaussian', [3 3], 5); % filter with a 3x3 gaussian
filt = conv2(a, h, 'same');

% use non-overlapping windows to for the Ax = b syatem
% NOTE: boundry error checking isn't performed in the code below
s = floor(size(a)/2);
y = s(1);
x = s(2);

w = k*k;
y1 = s(1)-floor(w/2) + r;
y2 = s(1)+floor(w/2);
x1 = s(2)-floor(w/2) + r;
x2 = s(2)+floor(w/2);

b = [];
A = [];
for y = y1:k:y2
  for x = x1:k:x2
    b = [b; filt(y, x)];
    f = a(y-r:y+r, x-r:x+r);
    A = [A; f(:)'];
  end
end

% estimated filter kernel
g = reshape(A\b, k, k)

LSE:

clear all

im = double(imread('I2vxD.png'));

k = 5;
r = floor(k/2);

a = im(:, :, 1);  % take the red channel
h = fspecial('gaussian', [3 3], 5); % filter with a 3x3 gaussian
filt = floor(conv2(a, h, 'same'));

s = size(a);
y1 = r+2; y2 = s(1)-r-2;
x1 = r+2; x2 = s(2)-r-2;

b = [];
A = [];

for y = y1:2:y2
  for x = x1:2:x2
    b = [b; filt(y, x)];
    f = a(y-r:y+r, x-r:x+r);
    f = f(:)';
    A = [A; f];
  end
end

g = reshape(A\b, k, k) % A\b returns the least squares solution
%g = reshape(pinv(A'*A)*A'*b, k, k)
+4

All Articles