% 加载原始图像
img = imread('wpz.jpg');
% 生成随机运动模糊核
kernel_size = 15; % 核大小
angle = rand() * 360; % 运动方向
distance = rand() * 10; % 运动距离
kernel = fspecial('motion', distance, angle) * 255;
% 对原始图像进行运动模糊加密
enc_img = imfilter(img, kernel, 'conv');
% 保存加密后的图像和运动模糊核
imwrite(enc_img, 'encrypted_image.jpg');
imwrite(kernel, 'kernel.jpg');
% 加载加密后的图像和运动模糊核
enc_img = imread('encrypted_image.jpg');
kernel = imread('kernel.jpg');
% 最小二乘方修复
kernel_size = size(kernel, 1);
A = zeros(size(enc_img, 1) * size(enc_img, 2), kernel_size ^ 2);
b = reshape(enc_img, [], 1);
for i = 1 : kernel_size
for j = 1 : kernel_size
k = (i - 1) * kernel_size + j;
A(:, k) = im2col(padarray(eye(size(enc_img, 1)), [i - 1, j - 1], 0), [kernel_size, kernel_size], 'sliding');
end
end
x = pinv(A) * b;
dec_kernel = reshape(x, [kernel_size, kernel_size]);
% 显示修复后的运动模糊核
figure;
imshow(dec_kernel, []);
% 对加密后的图像进行最小二乘方修复
dec_img = deconvwnr(enc_img, dec_kernel);
subplot(2,3,1);imshow(img);
subplot(2,3,2);imshow(enc_img);
subplot(2,3,3);imshow(dec_img);
图像大小不一致,裁剪一下才能赋值
我可以按照以下步骤使用Matlab修复运动模糊图像:
加载需要修复的运动模糊图像。
创建一个点扩散函数(PSF),用于描述运动模糊的程度。可以使用fspecial函数创建运动模糊的PSF,根据需要进行参数的调整。
对于无噪声的运动模糊图像,可以使用deconvwnr函数进行复原。该函数需要输入原始图像和PSF。可以根据需要调整其他参数,如噪声标准误差、自相关、颜色转换等。
例如,复原无噪声的运动模糊图像可以使用以下代码:
restored = deconvwnr(I, PSF);
其中I是原始图像,PSF是用fspecial函数创建的运动模糊的PSF。
restored = deconvwnr(I, PSF, NSR);
其中NSR是噪声标准误差。
以下是一个简单的例子,展示了如何使用以上步骤对运动模糊图像进行修复:
% 加载需要修复的图像 I = imread('motion_blur_image.jpg'); % 创建运动模糊的点扩散函数 PSF = fspecial('motion', 20, 45); % 对无噪声的运动模糊图像进行复原 restored = deconvwnr(I, PSF); % 显示修复后的图像 imshow(restored); % 保存修复后的图像到本地 imwrite(restored, 'restored_motion_blur_image.jpg');