How can I write noise removal and blur deblur codes in a single matlab code using fft?
9 次查看(过去 30 天)
显示 更早的评论
I was able to write the noise removal code, but I need to add blur and deblur to it. How should I do this?
采纳的回答
Hassaan
2023-12-25
编辑:Hassaan
2023-12-25
Performs noise removal, blurring, and deblurring operations using the Fast Fourier Transform (FFT) in MATLAB.
This code assumes that you have an image matrix image loaded into your MATLAB workspace. The code adds noise to this image, performs blurring using a Gaussian kernel, and then attempts to deblur the image using the Fourier transform. The imnoise function is used to add Gaussian noise to the image, and the blurring is done by creating a Gaussian kernel and applying it in the frequency domain.
% Assuming you have a variable `image` with your data
% Add some noise to the image
noisy_image = imnoise(image, 'gaussian', 0, 0.01);
% Perform FFT on the noisy image
fft_noisy_image = fft2(noisy_image);
% Generate a Gaussian blur kernel
kernel_size = 21; % Size of the kernel
sigma = 5; % Standard deviation of the Gaussian blur
[x, y] = meshgrid(round(-kernel_size/2):round(kernel_size/2), round(-kernel_size/2):round(kernel_size/2));
gaussian_kernel = exp(-x.^2/(2*sigma^2)-y.^2/(2*sigma^2));
gaussian_kernel = gaussian_kernel / sum(gaussian_kernel(:));
% Pad the kernel to the size of the image
padded_kernel = zeros(size(noisy_image));
padded_kernel(1:kernel_size, 1:kernel_size) = gaussian_kernel;
% Perform FFT on the padded kernel
fft_gaussian_kernel = fft2(padded_kernel);
% Apply the Gaussian blur in the frequency domain
fft_blurred_image = fft_noisy_image .* fft_gaussian_kernel;
% Inverse FFT to obtain the blurred image
blurred_image = ifft2(fft_blurred_image);
% Deblurring (for simplicity, we are using the reciprocal of the Gaussian kernel)
% In practice, this might need regularization to prevent amplifying noise
fft_deblurred_image = fft_blurred_image ./ fft_gaussian_kernel;
% Inverse FFT to obtain the deblurred image
deblurred_image = ifft2(fft_deblurred_image);
% Display the images
subplot(2,2,1), imshow(image), title('Original Image');
subplot(2,2,2), imshow(noisy_image), title('Noisy Image');
subplot(2,2,3), imshow(blurred_image, []), title('Blurred Image');
subplot(2,2,4), imshow(deblurred_image, []), title('Deblurred Image');
Remember that this simple deblurring method assumes that you know the exact Gaussian blur that was applied to the image and does not include any regularization. In real scenarios, the deblurring process can be much more complex, and techniques such as Wiener filtering or constrained least squares filtering are used to achieve better results.
-----------------------------------------------------------------------------------------------------------------------------------------------------
If you find the solution helpful and it resolves your issue, it would be greatly appreciated if you could accept the answer. Also, leaving an upvote and a comment are also wonderful ways to provide feedback.
0 个评论
更多回答(1 个)
Sulaymon Eshkabilov
2023-12-25
This is what you are trying to obtain:
O_img = imread('MATLAB.jpg');
% Create a blur kernel, e.g., Gaussian noise type of blur:
B_kernel = fspecial('gaussian', [13, 13], 3); % Adjust kernel size and sigma you want
% Convert the original image to double:
O_img = im2double(O_img);
% Apply FFT to the original image and the blur kernel:
FFT_O_img = fft2(O_img);
FFT_B_kernel = fft2(B_kernel, size(O_img, 1), size(O_img, 2));
% Convolution in Frequency domain to get blurs into an image:
FFT_B_img = FFT_O_img .* FFT_B_kernel;
% Inverse FFT to get the blurred image:
B_img = ifft2(FFT_B_img);
% Original vs. blurred images:
figure;
subplot(211); imshow(O_img); title('Original Image');
subplot(212); imshow(abs(B_img), []); title('Blurred Image');
0 个评论
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!