公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+1 投票
4.9k 浏览
我先贴一下自己实现的代码,pic要先自己Import

picgray = ColorConvert[pic, "Grayscale"];
data = Fourier[ImageData[picgray]];
ArrayPlot[Log[1 + Abs[data]]]

得到如下的结果

(为什么四个角是黑的,其余是白的)

如何做出像下面一样的效果

 

分类:图像处理 | 用户: WMN7 (606 分)
修改于 用户:xzczd

3 个回答

+3 投票
 
已采纳

通常习惯下大家习惯移频一下看频谱,主要原因是让低频( 图片中的信号多是低频平滑、非突变的,突变的噪点一般而言都是高频)集中在一起方便观察图片信息,但这不是必须的,有时候甚至要避免,这主要是根据你希望得到什么信息,以及后期需要做什么处理,如 xzczd 所说,正常使用mma自带的ImagePeriodogram就可以了(当然,这个函数默认是会移频的,注意选项Alignment,如果指定Alignment -> {Left, Top},那就是不移了)。如果要自造轮子,参考如下

 

pic = ColorConvert[ExampleData[{"TestImage", "Lena"}], "Grayscale"];

Method one:

ImageAdjust[
 Image[RotateLeft[Log10[PeriodogramArray[pic]], 
   Floor[Dimensions@ImageData[pic]/2]]]]

这办法PeriodogramArray的帮助文档也有,不过我通常不用,因为我不喜欢用RotateLeft,感觉如果图片维数是奇数就落了一格,心里有疙瘩,虽然对图片处理并无明显影响。

Method two:

ImageAdjust@
 Image@Log10@
   Abs@Fourier[
     ImageData[pic]*
      PadRight[{{}}, Dimensions[ImageData[pic]], {{1, -1}, {-1, 1}}]]

用户: Lozmlve*永 (1.2k 分)
修改于 用户:Lozmlve*永
原来如此……如果我理解不错的话,这利用的是时域上乘-1等效于频域上移动Pi个相位这一点?
话说其实维数是奇数的时候并没有“落下”一格,这种情况下就是零频率在正中心的。我的疙瘩主要在找不到一个简洁的公式把奇偶移位给统一起来。(是我太笨……)
是的,不过我的方法也是书上的,不是我自己想的
……等下,“通常习惯下大家习惯移频一下看频谱,主要原因是让高频集中在一起方便观察图片信息”,前面也说了我相关知识有限,可是移频不是把零频率移到中间去了吗,为什么这样反而让高频集中在一起了?
前面也说了,我手抖,不好意思,我稍后更正一下
+2 投票

……这确实是件很神奇的事,版本9其实加了一大批数据处理相关的功能,其中有好多都是Fourier的“壳”,可是不知道为什么,这些函数长期遭到忽略,(包括曾经的我在内的)很多人还是在用Fourier造轮子。

简单地说,用ImagePeriodogram就行了。

至于为什么Fourier造出来的东西不像,其原因是Fourier变换出的数据需要移位,移位的长度……是每个维度向右轮换-Floor[-(datalength - 1)/2]个位置(这个是我上一次研究这个问题时得出的结论,应该还存在更简单的表示法——我真的不太善长这种凑奇偶的活……),唉不过就算凑错了也问题不大啦,因为也就是移偏一个位置,做傅立叶变换时点量通常都很多,偏一个位置根本不影响视觉效果。总之,如果非要用Fourier造轮子:

picgray = ColorConvert[(*图*), "Grayscale"];
data = Fourier[1 - ImageData[picgray]];
n = Floor[Length@data/2];
Image@RotateRight[Rescale@Log@Abs@data, {-n, -n}]

这个和ImagePeriodogram的效果是一样的,你可以试试。

用户: xzczd (2.2k 分)
我也不喜欢移,乘以一个PadRight[{{}}, dimension, {{0, 1}, {1, 0}}]矩阵,就自动中心化了
……说实话我相关知识有限,不是很理解你这种方法。能否解说一下?还有这样好像是重采样了?
原来是这样,高维要移位的。
好的,那我等下post一个答案吧
上面回复的时候用的手机,手抖了,矩阵是{{1, -1}, {-1, 1}},没有重采样,执行的是矩阵变换,不丢失原数据的信息
+1 投票

Fourier是可以设置参数的,请详细阅读该函数的帮助。

在设置 FourierParameters->{a,b} 下,由 Fourier 计算所得的离散傅里叶变换是:

$$\frac{1}{n^{\frac{1-a}{2}}}\sum _{r=1}^n u_re^{\frac{2 \pi  b i (r-1) (s-1)}{n}}$$

默认值:a=0,b=1,即:

$$\frac{1}{\sqrt{n}}\sum _{r=1}^n u_re^{\frac{2 \pi  i (r-1) (s-1)}{n}}$$

{a,b} 的一些通用选择是 {0,1} (默认)、{-1,1} (数据分析)、{1,-1} (信号处理).


比如下面这样:

picgray = ColorConvert[pic, "Grayscale"];
data = Fourier[ImageData[picgray], FourierParameters -> {2, 2}];
ArrayPlot[Log[1 + Abs[data]]]

 

用户: 野鹤 (5.1k 分)
很遗憾,不对……这里的主要问题是移位。参看我的答案。
...