如何在 Matlab 中傅立叶相位扰乱灰度 JPEG 图像?
How can I Fourier phase scramble a grayscale JPEG image in Matlab?
我需要在 Matlab 中对全部 JPEG 图像进行傅立叶相位扰乱。
使用以下脚本我可以对彩色图像进行相位扰乱,但是当我在灰度上尝试时它不起作用。我已经在Matlab中安装了图像处理。
任何关于如何修改代码以使其相位扰乱灰度的建议将不胜感激,因为我已经尝试将 ImSize 从 3 减少到 2,并将 (:,:,layer) 减少到 (:,layer) -但还是不开心!
提前致谢,
玛丽亚
Im = mat2gray(double(imread('c:\nick\matlab\randomphase\Bear.jpg')));
%read and rescale (0-1) image
ImSize = size(Im);
RandomPhase = angle(fft2(rand(ImSize(1), ImSize(2))));
%generate random phase structure
for layer = 1:ImSize(3)
ImFourier(:,:,layer) = fft2(Im(:,:,layer));
%Fast-Fourier transform
Amp(:,:,layer) = abs(ImFourier(:,:,layer));
%amplitude spectrum
Phase(:,:,layer) = angle(ImFourier(:,:,layer));
%phase spectrum
Phase(:,:,layer) = Phase(:,:,layer) + RandomPhase;
%add random phase to original phase
ImScrambled(:,:,layer) = ifft2(Amp(:,:,layer).*exp(sqrt(-1)*(Phase(:,:,layer))));
%combine Amp and Phase then perform inverse Fourier
end
ImScrambled = real(ImScrambled); %get rid of imaginery part in image (due to rounding error)
imwrite(ImScrambled,'BearScrambled.jpg','jpg');
imshow(ImScrambled)
在您的代码中,您使用的是 ImSize = size(Im);
和 ImSize(3)
,问题是灰度图像 ImSize
只有两个元素,因为它是一个二维矩阵。
而是使用 size(Im,3)
其中 returns 1,因为 matlab 总是假定额外的单例维度。出于同样的原因,您的进一步代码已经可以与灰度图像相媲美,因为 Im(:,:,layer)
和 layer=1
returns 完整图像,这就是您在这种情况下想要的。
我需要在 Matlab 中对全部 JPEG 图像进行傅立叶相位扰乱。
使用以下脚本我可以对彩色图像进行相位扰乱,但是当我在灰度上尝试时它不起作用。我已经在Matlab中安装了图像处理。
任何关于如何修改代码以使其相位扰乱灰度的建议将不胜感激,因为我已经尝试将 ImSize 从 3 减少到 2,并将 (:,:,layer) 减少到 (:,layer) -但还是不开心!
提前致谢,
玛丽亚
Im = mat2gray(double(imread('c:\nick\matlab\randomphase\Bear.jpg')));
%read and rescale (0-1) image
ImSize = size(Im);
RandomPhase = angle(fft2(rand(ImSize(1), ImSize(2))));
%generate random phase structure
for layer = 1:ImSize(3)
ImFourier(:,:,layer) = fft2(Im(:,:,layer));
%Fast-Fourier transform
Amp(:,:,layer) = abs(ImFourier(:,:,layer));
%amplitude spectrum
Phase(:,:,layer) = angle(ImFourier(:,:,layer));
%phase spectrum
Phase(:,:,layer) = Phase(:,:,layer) + RandomPhase;
%add random phase to original phase
ImScrambled(:,:,layer) = ifft2(Amp(:,:,layer).*exp(sqrt(-1)*(Phase(:,:,layer))));
%combine Amp and Phase then perform inverse Fourier
end
ImScrambled = real(ImScrambled); %get rid of imaginery part in image (due to rounding error)
imwrite(ImScrambled,'BearScrambled.jpg','jpg');
imshow(ImScrambled)
在您的代码中,您使用的是 ImSize = size(Im);
和 ImSize(3)
,问题是灰度图像 ImSize
只有两个元素,因为它是一个二维矩阵。
而是使用 size(Im,3)
其中 returns 1,因为 matlab 总是假定额外的单例维度。出于同样的原因,您的进一步代码已经可以与灰度图像相媲美,因为 Im(:,:,layer)
和 layer=1
returns 完整图像,这就是您在这种情况下想要的。