Butterworth高通滤波器,Matlab

时间:2014-09-02 15:58:37

标签: matlab

我必须: 读取'cameraman.tif'并将其转换为double,然后使用高通Butterworth滤波器(在频域中),截止频率40 px和5级进行滤波。二值化(电平0.1,高通)。找到距离最近的“真实”像素20 px的所有像素。计算孤立地区的数量及其面积。这是对的吗?

  img = imread('cameraman.tif');
  img = double(img)/255;
  fft = fftshift(fft2(img));
  N = 5; D0 = 40; 
  D = zeros(256); H = zeros(256);

  for kz=1:256
  for kx=1:256
       %Butterworth
       D(kz,kx) = sqrt( (kz-128)^2 + (kx-128)^2);
       H(kz,kx) = 1/(1+(D(kz,kx)/D0)^2*N);
  end
end
filtered = fft.*(1-H);

result = ifft2(ifftshift(filtered));
 figure; subplot(121); imshow(img); title('Oryginalny');
 subplot(122); imshow(result); title('Przefiltrowany');

  binarized = im2bw(real(result), 0.1);

ilosc= bwdist(binarized)>20 ;
ilosc=sum(ilosc(:)) 
figure; imshow(binarized); title('Zbinaryzowany');

w = binarized == 1;
 b = binarized == 0;
 biale = sum(w(:)); 
czarne = sum(b(:));

[blab, blobs] = bwlabel(binarized); 

1 个答案:

答案 0 :(得分:0)

鉴于您对要完成的内容的描述,您的代码看起来是正确的。

这确实在频域中定义了Butterworth滤波器,然后高通只是从低通版本中的每个系数中减去1。根据您的评论,您只想计算距离最近的真实像素约20个像素的像素。假设欧几里德距离,那么这是正确的。

返回您的巴特沃斯滤镜:请注意,开始时用于定义滤镜和滤镜中心的for循环将根据图像的尺寸而变化。如果您想移动到另一个图像,则需要更改这些。


如果我可以提出一个小建议,我会创建过滤器矢量而不是使用for循环。它实际上更快,并且在创建更大尺寸的滤镜时,您会注意到一个巨大的差异。因此,用以下代码替换您的Butterworth构造代码:

[kx,kz] = meshgrid(1:256, 1:256);
D = sqrt((kz - 128).^2 + (kx - 128).^2);
H = 1 ./ ((1 + (D/D0)).^(2*N));