我想将butterworth filter应用于照片。滤波器的设计方法是bilinear。如何将butterwoth过滤器应用于图像
我设计的滤波器是:
[N, Wn]=buttord(2, 4.83, -3, -15, 's');
[b,a]=butter(N,Wn,'s');
[num,den]=bilinear(b,a,1);
怎么能过滤器被应用到2D图像?
我想将butterworth filter应用于照片。滤波器的设计方法是bilinear。如何将butterwoth过滤器应用于图像
我设计的滤波器是:
[N, Wn]=buttord(2, 4.83, -3, -15, 's');
[b,a]=butter(N,Wn,'s');
[num,den]=bilinear(b,a,1);
怎么能过滤器被应用到2D图像?
buttord
用于1D信号处理。你可以编写一个简单的代码来自己设计2D butterworth过滤器。以下是带通巴特沃思滤波器的示例代码。您可以在高通滤波器上删除d1
,或在低通滤波器上删除d0
。
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
看看下面的例子:
我不知道MATLAB内置函数,但我已经写了一巴斯沃斯过滤器,您可以使用图片
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')