Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
巴特沃斯高通滤波器,Matlab_Matlab - Fatal编程技术网

巴特沃斯高通滤波器,Matlab

巴特沃斯高通滤波器,Matlab,matlab,Matlab,我必须: 读取“cameraman.tif”并将其转换为双精度,然后使用高通巴特沃斯滤波器(在频域中)、截止频率40 px和电平5对其进行滤波。二值化(0.1级,高通)。查找最接近的“真”像素上方20像素的所有像素。数一数被孤立的领土及其区域的数量。对吗 img = imread('cameraman.tif'); img = double(img)/255; fft = fftshift(fft2(img)); N = 5; D0 = 40; D = zeros(256)

我必须: 读取“cameraman.tif”并将其转换为双精度,然后使用高通巴特沃斯滤波器(在频域中)、截止频率40 px和电平5对其进行滤波。二值化(0.1级,高通)。查找最接近的“真”像素上方20像素的所有像素。数一数被孤立的领土及其区域的数量。对吗

  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。根据您的评论,您只想计算那些比最接近的真实像素高出大约20像素的像素。假设欧几里德距离,那么这是正确的

回到巴特沃斯过滤器:请记住,开始时的
for
循环定义过滤器,过滤器中心将根据图像的尺寸而变化。如果要移动到其他图像,则需要更改这些设置


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

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

你有什么错误吗?没有,它可以工作,它给了我像素数,但我不确定这个数字是否正确。我很确定过滤器本身(我在过去做过的部分),但我对bwdist是个新手:)我只使用bwdist来计算比最接近的“真”像素高20像素的像素。这是正确的吗?@user3748496-是的@用户3748496不客气!如果你觉得我帮了你,请接受我的回答。这可以通过转到我文章的顶部,向左看并单击上下箭头下方的复选标记按钮来完成。