我必须: 读取'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);
答案 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));