简体   繁体   中英

how to apply butterwoth filter on an image

I want to apply a butterworth filter to a photo. The filter design method is bilinear .

The filter I designed is:

[N, Wn]=buttord(2, 4.83, -3, -15, 's');
[b,a]=butter(N,Wn,'s');
[num,den]=bilinear(b,a,1);

How could the filter be applied to a 2D image?

buttord is used in 1D signal processing. You can write a simple code to design a 2D butterworth filter yourself. Below is a sample code of a bandpass butterworth filter. You can remove the d1 on high pass filter, or remove d0 on low pass filter.

filter1 = ones(2*nx-1,2*ny-1);
filter2 = ones(2*nx-1,2*ny-1);
filter3 = ones(2*nx-1,2*ny-1);

for i = 1:2*nx-1
    for j =1:2*ny-1
        d = ((i-(nx+1))^2 + (j-(ny+1))^2)^.5;

        filter1(i,j)= 1/(1 + (d/d1)^(2*n)); % d1:higher cutoff frequency
        filter2(i,j) = 1/(1 + (d/d0)^(2*n)); % d0:lower cutoff frequency
        filter3(i,j)= 1 - filter2(i,j);
        butterworthf(i,j) = filter1(i,j).*filter3(i,j); % Create Butterworth filter.

    end
end

You may use that code which is given on that link:

https://www.mathworks.com/matlabcentral/fileexchange/30946-butterworth-bandpass-filter-for-image-processing

Code is

function filtered_image = butterworthbpf(I,d0,d1,n)
    % Butterworth Bandpass Filter
    % This simple  function was written for my Digital Image Processing course
    % at Eastern Mediterranean University taught by
    % Assoc. Prof. Dr. Hasan Demirel
    % for the 2010-2011 Spring Semester
    % for the complete report:
    % http://www.scribd.com/doc/51981950/HW4-Frequency-Domain-Bandpass-Filtering
    %
    % Written By:
    % Leonardo O. Iheme (leonardo.iheme@cc.emu.edu.tr)
    % 23rd of March 2011
    %
    %   I = The input grey scale image
    %   d0 = Lower cut off frequency
    %   d1 = Higher cut off frequency
    %   n = order of the filter
    %
    % The function makes use of the simple principle that a bandpass filter
    % can be obtained by multiplying a lowpass filter with a highpass filter
    % where the lowpass filter has a higher cut off frquency than the high pass filter.
    %
    % Usage BUTTERWORTHBPF(I,DO,D1,N)
    % Example
    % ima = imread('grass.jpg');
    % ima = rgb2gray(ima);
    % filtered_image = butterworthbpf(ima,30,120,4);
    f = double(I);
    [nx, ny] = size(f);
    f = uint8(f);
    fftI = fft2(f,2*nx-1,2*ny-1);
    fftI = fftshift(fftI);
    subplot(2,2,1)
    imshow(f,[]);
    title('Original Image')
    subplot(2,2,2)
    fftshow(fftI,'log')
    title('Image in Fourier Domain')
    % Initialize filter.
    filter1 = ones(2*nx-1,2*ny-1);
    filter2 = ones(2*nx-1,2*ny-1);
    filter3 = ones(2*nx-1,2*ny-1);
    for i = 1:2*nx-1
        for j =1:2*ny-1
            dist = ((i-(nx+1))^2 + (j-(ny+1))^2)^.5;
            % Create Butterworth filter.
            filter1(i,j)= 1/(1 + (dist/d1)^(2*n));
            filter2(i,j) = 1/(1 + (dist/d0)^(2*n));
            filter3(i,j)= 1.0 - filter2(i,j);
            filter3(i,j) = filter1(i,j).*filter3(i,j);
        end
    end
    % Update image with passed frequencies.
    filtered_image = fftI + filter3.*fftI;
    subplot(2,2,3)
    fftshow(filter3,'log')
    title('Filter Image')
    filtered_image = ifftshift(filtered_image);
    filtered_image = ifft2(filtered_image,2*nx-1,2*ny-1);
    filtered_image = real(filtered_image(1:nx,1:ny));
    filtered_image = uint8(filtered_image);
    subplot(2,2,4)
    imshow(filtered_image,[])
    title('Filtered Image')
end

I don't know about MATLAB builtin functions but I've wrote a butterworth filter you can use for Image

function Filter = MyButterWorth(grade, cutoff_freq, img_name,type)

img=imread(img_name); %read image
[rows,cols] = size(img);
img_double=double(img);
FImg = fftshift(fft2(img_double)); %Fast Fourier transform 2D and shift it to Center 
%immagphase(FImg);

% compute distance to center with consider image size
x =  (ones(rows,1) * [1:cols]  - (fix(cols/2)+1))/cols;
y =  ([1:rows]' * ones(1,cols) - (fix(rows/2)+1))/rows;

radius = sqrt(x.^2 + y.^2); 
% create filter
Filter = 1 ./ (1.0 + (radius ./ cutoff_freq).^(2*grade));
% change filter type low pass or high
if(strcmp(type, 'hpf'))
    Filter = 1 - Filter;
end
figure;
surf([-1:2/(cols-1):1],[-1:2/(rows-1):1], Filter);
shading interp;
title('Butterworth filter');
xlabel('x');
ylabel('y');
zlabel('intensity');
grid on;

%applay filter
resultFImg = FImg .* Filter;

resultImg = real(ifft2(ifftshift(resultFImg)));

%show image
figure;
subplot(1,2,1); imshow(img); title('Orginal Image')
subplot(1,2,2); imshow(resultImg,[]); title('Filtered Image')

end for more information check here or here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM