在matlab中创建高通滤波器

use*_*312 3 matlab image-processing

我正在尝试在Matlab中创建一个高通滤波器.我使用生成高斯内核

function kernel = compute_kernel(sigma,size)
[x,y] = meshgrid(-size/2:size/2,-size/2:size/2);
constant = 1/(2*pi*sigma*sigma);
kernel = constant*exp( -(y.^2 + x.^2 )/(2 * sigma * sigma));
kernel = (kernel - min(kernel(:)))./(max(kernel(:)) - min(kernel(:)));
end
Run Code Online (Sandbox Code Playgroud)

然后在创建内核后,我用它来为图像(变量im2)创建一个低通滤波器:

g = compute_kernel(9,101);
im2_low = conv2(im2,g,'same');
Run Code Online (Sandbox Code Playgroud)

据我所知,我可以使用从原始图像中减去滤波后的图像(在频域中)来提取高频率,使其相当于高通滤波器.

F = fft2(im2_low);
IM2 = fft2(im2);
IM2_high = IM2 - F;

figure; fftshow(IM2_high);
im2_high = ifft2(IM2_high);
figure; imshow(im2_high,[]);
Run Code Online (Sandbox Code Playgroud)

但这似乎有些不对劲.当我查看高通滤波图像时,它似乎是一个颜色反转的模糊图像,而不是像我在网上看到的边缘定义的图像.我不确定我的进程是否错误,或者我是否只是使用了高斯内核的错误值.

And*_*uri 5

您想要用于维护图像特征的任何内核(即您不想要某种程度的东西,但图像看起来像人类可识别的图像),您需要确保对内核做一些事情:规范化它.

你似乎已经尝试过了,但你误解了内核中规范化的含义.不需要[0-1],它们的总和需要为1.

所以,拿你的代码:

im2=imread('https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png');
im2=double(rgb2gray(im2));

sigma=9;
sizei=101;
[x,y] = meshgrid(-sizei/2:sizei/2,-sizei/2:sizei/2);
constant = 1/(2*pi*sigma*sigma);
kernel = constant*exp( -(y.^2 + x.^2 )/(2 * sigma * sigma));
%%%%%% NORMALIZATION
kernel=kernel/sum(kernel(:));
%%%%%%

im2_low = conv2(im2,kernel,'same');

F = fft2(im2_low);
IM2 = fft2(im2);
IM2_high = IM2 - F;


im2_high = ifft2(IM2_high);
figure; imshow(im2_high,[]);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,正如CrisLuengo所提到的,减法是一种在傅立叶域中不会改变的运算,因此答案是

im2_high=im2-im2_low
Run Code Online (Sandbox Code Playgroud)