- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
图像代表我在 openCV 练习中使用傅里叶变换所做的事情。这是一个消除周期性噪声的练习。我正在检测发出噪音的波段,并使用 mask 将其删除。如您所见,我正在使用掩码从 dft_shift
中生成产品。我假设它的乘积为 0,我的问题是:如果该值为 0,为什么那条线是白色的???
代码:
dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT) #calcula la transf. Fourier
dft_shift = np.fft.fftshift(dft) #proyecta los cuadrantes de la imagen
dft_shift = dft_shift*mask2
f_ishift = np.fft.ifftshift(dft_shift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
完整脚本 Here
最佳答案
如果打印出 product
图像数组中的值,您会发现白色带中的所有像素实际上都具有 -inf
的值,不是 0
。在您的代码中,作为创建 product
过程的一部分,您使用 np.log
来重新缩放一些数据。该数据中有 0
,np.log(0)
的结果是 -inf
。
您可以通过几种不同的方式解决此问题。最简单的选择是将 product
中的所有 -inf
值替换为 0
。创建 product
后,如果添加以下行:
product[np.isneginf(product)] = 0
然后当您绘制 product
时,它会像您预期的那样出现黑带:
这就是您在 product
中以 -inf
结尾的原因。这是您的代码中创建 product
的行:
product = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
如果我们把它分成两行,我们就能弄清楚发生了什么:
magnitude = cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1])
product = 20*np.log(magnitude)
magnitude
沿波段有 0
,正如您预期的那样。但是,如果您尝试直接绘制星等,您最终会得到一个非常暗的图,显示不多:
这是因为 Matplotlib 会在选择颜色时缩放数据,使图像数组中的最小值为黑色,最大值为白色。这里的问题是 magnitude
中的最大值比几乎所有其他值都大得多。因此,您会得到一些白色像素(靠近中心),而其他所有像素都接近黑色。
您可以通过将 vmax=1000
传递给您使用的 imshow
函数,使 magnitude
图显示更多的底层细节绘制图像。这为颜色图设置了一个明确的最大数据值:
这远非理想,因为这意味着图像的很大一部分显示为完全饱和的白色,而不管其底层细节如何。
实际上,您已经在代码中对这个问题进行了更好的修复:使用 np.log
以 magnitude
重新缩放数据。此重新缩放的结果 product
数组的所有值将更接近。这样做的好处是,您可以在绘制 product
时看到图像中的细节。然而,你在这里遇到的问题是 0 的对数是无穷大:
print(np.log(0))
# this outputs
# -inf
因此,magnitude
中的 0
波段成为 product
中的 -inf
波段。 Matplotlib 处理这些 -inf
值的方法是将它们着色为与输入数组中的最大值相同的颜色(即白色)。因此,您会得到在绘制的 product
图像中看到的白色 strip 。
关于python - FFT 频谱中的 0 是白色的?,为什么? - 开放式简历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53693330/
我在将示例 laravel 5.2 应用程序部署到 openshift 时遇到问题。我找到了这个quickstart在 github 上并尝试了下面列出的手动安装。 rhc app create la
我刚刚开始使用 OpenCV,我发现了 contourArea 函数的一些非常奇怪的行为。 看到这张图片。 它有三个不相连的区域,左侧是一组长笔划,顶部中心有一个点,最后是右侧的一个大方块。 当我运行
我经常发现自己尝试从数值变量+用户提供的一组范围创建分类变量。 例如,假设我有一个带有数值变量 df$V 的 data.frame并想创建一个新变量 df$VCAT这样: df$VCAT = 0 如果
启动 MXBean 时,我收到错误提示 Method SampleServiceMXBean.register 具有无法转换为开放类型的参数或返回类型。根据错误消息,很明显我的 MXBean 无法 c
大多数时候在 CUDA 或 OpenCL 程序中需要分支,例如: for (int i=0; i
我们有一个可能有用的自制框架实现基于 REST 的网络服务。 这是一个 .net c# 项目,用于 web 应用程序。 它的用途是:用动态内容内联替换模板“标签”。示例标签:{{recentposts
是否有 Java 中 SMB/CIFS 服务器的开放实现?我能找到的唯一实现是 Alfresco 的,但它不是开源的。 一个相关的问题:假设没有这样的实现,我很惊讶没有一个库提供甚至是 SMB 的一个
我已将我的应用程序从本地主机移至 OpenShift,发现 PostgreSQL 连接存在问题。我已经配置了pom.xml: org.postgresql postgresql
我正在尝试在 AWS ec2 实例上配置 SSL 证书,我遵循了以下步骤: 使用 ubuntu 操作系统在 ec2 上创建实例。 通过证书管理器在我的域上颁发证书 -> 例如:*.domains.co
我正在尝试在打开的模式上执行 jQuery 脚本,以便将其中一个字段转换为 jQuery UI Spinner。 我正在使用Angular UI中记录的opened promise 。 问题:jQue
有没有办法将服务帐户 secret 内容填充到环境变量中? 示例:当一个 pod 启动时,它包含一个 /var/run/secrets/kubernetes.io/secrets/serviceacc
我在 security 和 components/securitySchemes 中定义了我的身份验证。在Swagger documentation about response ,他们提供了这个例子
我是一名优秀的程序员,十分优秀!