2016-07-27 37 views
0

Ich lernte, wie man es tut, konnte sich jetzt nicht erinnern, und versäumt, etwas nützliches durch Suchen zu bekommen. Ich habe ein Bild und möchte dieses Bild verwenden, um ein größeres Bild der Größe 3x3 durch einfaches Stapeln zu erstellen. Der Rand musste geglättet werden, sodass die rechte Bildkante nahtlos in den linken Bildrand übergeht.Smooth-filtering Bildrand, um kreisförmiges Bild zu erstellen (Fourier-Vorbereitung)

enter image description here

Anwenden von Faltungsfilter sollten in der Lage sein, es zu tun, wie es das Bild als Kreis hält, aber wie genau sollen wir es tun? Wir könnten Matlab sprechen (oder jede andere Sprache, die Sie sprechen/tippen).

EDIT 1: Ich bevorzuge nur den Filter auf den Rand anwenden, während das ursprüngliche Bild so viel wie möglich erhalten.

EDIT 2: Ich versuchte einen Gauss-Filter. Während es das gesamte Bild verwischte, wurden die Ränder im Vergleich zur verschwommenen Mitte deutlicher. imshow(repmat(imfilter(imread('un1vY.jpg'), fspecial('gaussian',64,8), 'circular'), [3 3]))

enter image description here

+0

Was ist ein Verfassungs Filter? – rayryeng

+0

Rechtschreibprüfung ... Convolutional – hyiltiz

+0

Ich denke du redest über 'convolve2d' in Python mit' boundary = 'wrap'' oder 'imfilter' in MATLAB mit' circular'. – beaker

Antwort

1

Hier ist ein vollständiges 3x3 Beispiel:

function Test() 
    close all 
    I = imread('un1vY.jpg'); 
    I = double(I)/255;  %Convert uint8 to double  

    J = HorizFuse(I); 

    Jtag = cat(3, J(:,:,1)', J(:,:,2)', J(:,:,3)'); %Transpose across 2'nd dimension. 

    K = HorizFuse(Jtag); 

    K = cat(3, K(:,:,1)', K(:,:,2)', K(:,:,3)'); %Transpose back 

    K = uint8(K*255); %Convert back to uint8 
    figure;imshow(K); 

    imwrite(K, 'K.jpg');  
end 


function K = HorizFuse(I) 
    h = linspace(0,1,100); %Create ramp from 0 to 1 of 100 elements. 

    im_w = size(I, 2); %Image width 
    im_h = size(I, 1); %Image height 

    Hy = repmat(h, [size(I, 1), 1, 3]); %Replicate h to fit image height. 

    J = zeros(im_h, im_w*2-100, 3); 
    J(:, 1:im_w-100, :) = I(:, 1:im_w-100, :); %Fill pixels from the left to overlap. 
    J(:, im_w+1:end, :) = I(:, 101:end, :); %Fill pixels from the right of overlap. 

    %Fill overlap with linear intepolation between right side of left image and left side of right image. 
    J(:, im_w-99:im_w, :) = I(:, end-99:end, :).*(1-Hy) + I(:, 1:100, :).*Hy; 

    K = zeros(im_h, im_w*3-100*2, 3); 
    K(1:size(J,1), 1:size(J,2), :) = J; 
    K(1:size(J,1), end-(im_w+100)+1:end, :) = J(1:size(J,1), end-(im_w+100)+1:end, :); 
end 

Ergebnis:
enter image description here

+0

Schön! Das Programm war auch elegant. Als ich jedoch versuchte, das mittlere Bild um 1/3 und 2/3 Mittelpunkte zu zerschneiden, so dass ich es als Basis verwenden konnte, um Gitter der Größe nxn ('repmat (Basis, [nn])') endlos zu erzeugen, Rand links eine dünne Spur. Ist das systematisch im Algorithmus oder wegen eines Fehlers beim Zuschneiden? – hyiltiz

+0

Versuchen Sie dies: 'centerK = K (1 + Größe (I, 1) -100: (Größe (I, 1) -100) * 2, 1 + Größe (I, 2) -100: (Größe (I, 2) -100) * 2, :); R = repmat (centerK, [7, 7]); figure; imshow (R); ' – Rotem

0

Sie können die folgende Lösung versuchen:
Lassen Sie etwas Überlappungsbereich zwischen zwei angehängten Bilder.
Führen Sie eine lineare Interpolation zwischen zwei Bildern im überlappten Bereich durch.
Linearinterpolation: h * A + (1-h) * B, wenn h geht von 0 bis 1.

Illustration von h (replizierten ein Bild zu erzeugen), um Bilder horizontal anbringt:
enter image description here

Ich habe 100 Pixel breite Überlappung genommen.
Der folgende Code legt zwei Bilder horizontal:

I = imread('un1vY.jpg'); 
I = double(I)/255;  %Convert uint8 to double 
h = linspace(0,1,100); %Create ramp from 0 to 1 of 100 elements. 

im_w = size(I, 2); %Image width 
im_h = size(I, 1); %Image height 

Hy = repmat(h, [size(I, 1), 1, 3]); %Replicate h to fit image height. 

J = zeros(im_h, im_w*2-100, 3); 
J(:, 1:im_w-100, :) = I(:, 1:im_w-100, :); %Fill pixels from the left to overlap. 
J(:, im_w+1:end, :) = I(:, 101:end, :); %Fill pixels from the right of overlap. 

%Fill overlap with linear intepolation between right side of left image and left side of right image. 
J(:, im_w-99:im_w, :) = I(:, end-99:end, :).*(1-Hy) + I(:, 1:100, :).*Hy; 

J = uint8(J*255); %Convert back to uint8 

Dies ist nicht die perfekte Lösung, und nicht um einen vollständigen ein.
Sorry, aber ich lasse Sie (oder einen anderen SO-Benutzer) die Arbeit zu beenden.

Ergebnis:
enter image description here

+0

Das Ergebnis scheint viel besser zu sein; Ich konnte das geschrumpfte Bild vom h/2 Punkt ausschneiden. Da ich mich jedoch mit dem 3x3-Gitter beschäftigt habe, sollte ich mehr Gitter für die Interpolation machen. Eine einfache lineare Interpolation scheint jedoch zu versagen, wenn wir eine Ecke betrachten. Betrachten Sie die obere linke Ecke: In einem 3x3 Raster muss die obere linke Ecke des mittleren Bildes (2,2) mit (1,1), (2,1) und (1,2) diesen 3 Bildern interpoliert werden , so wird eine Methode benötigt, die mehr als 2 Überlappungsbereiche handhaben kann. – hyiltiz