Numerický výpočet dvourozměrné konvoluce neboli filtrace obrazu.
</pre> <pre>%% Konvoluce 2D / Fitrace obarzu % Tomas Krejci, 11.4.2015 clc close all clear all <!--more--> %% konvolucni jadro / filtr %h = [0 -1 0; -1 5 -1; 0 -1 0]; % doostreni h = [1 1 1; 1 3 1; 1 1 1]; % rozostreni h = h / sum(sum(h)); % normalizace %% obraz img = rgb2gray(double(imread('grey2.png'))/256); %img = [1 1 1; .5 .5 .5; 0 0 0]; imgc = conv2(img,h); % pomoci normani konvoluce imgc = imfilter(img,h); % pomoci funkce... sp = abs(fftshift(fft2(h, 1024, 1024))); % spektrum 2D %% rozsireni obrazu % okrajove podminky..... % predpoklad kernelu 3x3 [m n] = size(img); img2 = zeros(m+2, n+2); img3 = img2; img2(2:end-1, 2:end-1) = img; % stred img2(2:end-1, 1) = img(:, 2); % levy sloupec img2(2:end-1, end) = img(:, end-1); % pravy sloupec img2(1, 2:end-1) = img(2, :); % prvni radek img2(end, 2:end-1) = img(end-1, :); % posledni radek img2(1, 1) = img(2, 2); % levy horni roh img2(1, end) = img(2, end-1); % pravy horni roh img2(end, 1) = img(end-1, 2); % levy dolni roh img2(end, end) = img(end-1, end-1); % pravy dolni roh %% vypocet [m n] = size(img2); for mm = 2:m-1 for nn = 2:n-1 sub = img2( (mm-1):(mm+1), (nn-1):(nn+1) ) .* h; % pronasobeni danych boud/pixelu img3(mm, nn) = sum( sum(sub) ); % soucet / vysledek 2D konvoluce end end img4 = img3(2:end-1, 2:end-1); % orezani okraju figure; subplot(2, 2, 1); imshow(img); title('original'); subplot(2, 2, 2); mesh(sp); title('spketrum filtru'); subplot(2, 2, 3); imshow(imgc); title('po fitraci - imfilter'); subplot(2, 2, 4); imshow(img4); title('po fitraci - rucne');
Download