在 Python 中使用 Nan 对图像进行高斯滤波

2024-03-28

根据 2D 坐标列表和第三个变量(速度),我创建了一个覆盖整个采样区域的 2D numpy 数组。我的目的是创建一个图像,其中每个像素包含位于其中的点的平均速度。之后用高斯滤波器过滤该图像。

问题是该区域没有均匀采样。因此我有几个没有信息的像素(Nan)在图像的中间。当我尝试通过高斯滤波器过滤数组时,Nan传播破坏整个形象。

我需要过滤该图像,但拒绝所有没有信息的像素。换句话说,如果一个像素不包含信息,那么过滤时不应该考虑它。

这是我的平均代码示例:

Mean_V = np.zeros([len(x_bins), len(y_bins)])

for i, x_bin in enumerate(x_bins[:-1]):
    bin_x = (x > x_bins[i]) & (x <= x_bins[i+1])
    for j, y_bin in enumerate(y_bins[:-1]):
        bin_xy = (y[bin_x] > y_bins[j]) & (y[bin_x] <= y_bins[j+1])
        if (sum(x > 0 for x in bin_xy) > 0) :
            Mean_V[i,j]=np.mean(V[bin_x][bin_xy])
        else:
            Mean_V[i,j]=np.nan

EDIT:

网上冲浪我结束了我在2013年提出的这个问题。这个问题的解决方案可以在astropy库中找到:

http://docs.astropy.org/en/stable/convolution/ http://docs.astropy.org/en/stable/convolution/

Astropy 的卷积将 NaN 像素替换为来自相邻像素的核加权插值。

谢谢各位!!


用言语来说:

忽略给定数组中 NaN 的高斯滤波器U通过将标准高斯滤波器应用于两个辅助阵列可以轻松获得V and W并通过取两者的比率来得到结果Z.

Here, V是原件的副本UNaN 被零替换并且W是一个由 0 组成的数组,表示原始 NaN 的位置U.

这个想法是,用零替换 NaN 会在滤波后的数组中引入误差,但是,可以通过将相同的高斯滤波器应用于另一个辅助数组并将两者组合来补偿。

在Python中:

import numpy as np
import scipy as sp
import scipy.ndimage

sigma=2.0                  # standard deviation for Gaussian kernel
truncate=4.0               # truncate filter at this many sigmas

U=sp.randn(10,10)          # random array...
U[U>2]=np.nan              # ...with NaNs for testing

V=U.copy()
V[np.isnan(U)]=0
VV=sp.ndimage.gaussian_filter(V,sigma=sigma,truncate=truncate)

W=0*U.copy()+1
W[np.isnan(U)]=0
WW=sp.ndimage.gaussian_filter(W,sigma=sigma,truncate=truncate)

Z=VV/WW

以数字表示:

这里,出于演示目的,高斯滤波器的系数被设置为[0.25,0.50,0.25],并且它们的总和为1 0.25+0.50+0.25=1,而不失一般性。

用零替换 NaN 并应用高斯滤波器(参见下面的 VV)后,很明显零会引入错误,即,由于“丢失”数据,系数 0.25+0.50=0.75 的总和不再为 1因此低估了“真实”价值。

然而,这可以通过使用第二个辅助数组(参见下面的 WW)来补偿,该数组在使用相同的高斯滤波后,仅包含系数之和。

因此,划分两个滤波后的辅助数组会重新调整系数,使其总和为 1,同时忽略 NaN 位置。

array U         1   2   NaN 1   2    
auxiliary V     1   2   0   1   2    
auxiliary W     1   1   0   1   1
position        a   b   c   d   e

filtered VV_b   = 0.25*V_a  + 0.50*V_b  + 0.25*V_c
                = 0.25*1    + 0.50*2    + 0
                = 1.25

filtered WW_b   = 0.25*W_a  + 0.50*W_b  + 0.25*W_c
                = 0.25*1    + 0.50*1    + 0
                = 0.75

ratio Z         = VV_b / WW_b  
                = (0.25*1 + 0.50*2) / (0.25*1    + 0.50*1)
                = 0.333*1 + 0.666*2
                = 1.666

更新 - 除以零:

以下内容包含@AndyL 和@amain 在下面的评论中提出的有用问题和答案,谢谢!

当高斯核的支持范围内只有 NaN 条目时,大面积的 NaN 可能会在某些位置导致分母为零(WW = 0)(理论上支持是无限的,但实际上核通常会被截断,请参见'上面代码示例中的截断'参数)。在这种情况下,提名器也会变为零(VV=0),因此 numpy 会抛出“RuntimeWarning:true_divide 中遇到无效值”并在相应位置返回 NaN。

这可能是最一致/最有意义的结果,如果您可以忍受麻木的警告,则无需进一步调整。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中使用 Nan 对图像进行高斯滤波 的相关文章

随机推荐

  • 使用邮件规则和 Applescript 将 vcard 添加到联系人

    我通过特定的电子邮件地址收到了很多客户电子名片 我想通过邮件规则和 AppleScript 自动将电子名片添加到我的联系人中 我搜索了很多并找到了一些东西 我稍微修改了一下 并且打开和添加过程运行良好 但只有当我选择一个文件时 我无法将文件
  • 防止 DOMDocument::loadHTML() 转换实体

    我有一个字符串值 我正在尝试为其提取列表项 我想提取文本和任何子节点 但是 DOMDocument 正在将实体转换为字符 而不是保留原始状态 我尝试将 DOMDocument resolveExternals 和 DOMDocument s
  • opencv中的骨架化

    opencv中有没有可以使用的特定函数来进行骨架化 另外 我搜索了一段时间 想知道opencv是否实现了voronoi 骨骼 似乎有 但真的是 看起来 Voronoi Skeleton 是在 cvConstructSkeleton and
  • HTML5网络存储:不同网站可以互相覆盖用户计算机上的数据吗?

    我有一些关于 HTML5 存储概念的问题 我浏览了 w3c 规范 书籍和教程 但我仍然对某些概念有点不清楚 假设我访问网站 A 一些 JavaScript 在我的浏览器中运行 用于设置键值对 例如 username deepak 然后我访问
  • 从选择标签中的数据库获取值 HTML PHP MySQL [重复]

    这个问题在这里已经有答案了 我是 PHP MySQL 的初学者 我成功地从数据库中获取了值INPUT类型 但我无法从数据库中获取数据SELECT type 这是我的示例编辑表单 其中Gender 用户类型无法从我的数据库输出值 and he
  • 如何将雪花中单词的第一个字母大写?

    我需要在 Snowflake 中将 mySQL 查询中某些单词的首字母大写 我目前正在使用这个功能 SELECT case when FLAG1 is null then upper FLAG2 else FLAG1 END as STAT
  • 为什么新的 gradle 测试过滤功能不适用于我的构建脚本?

    我正在开发一个具有以下结构的 项目 proj dbfit junit module db1 db2 提供一些背景信息 所有这些 模块 db1 db2 都有 JUnit 测试 这些测试使用 FitNesseRunner 将它们集成到 Bamb
  • 某些图像无法在 IE7 或 IE8 中显示

    我不明白为什么这个图像 以及其他类似的图像 不会在 IE7 或 IE8 中显示 它在 IE9 Chrome Safari Firefox Mac 或 PC 以及这些浏览器的多个版本中完美显示 http images appletree co
  • Google Cloud CDN 开始忽略存储桶的查询字符串

    几个月前 为存储桶激活了 Cloud CDN 我们的存储数据会通过后端定期更改 因此 为了使缓存版本无效 我们添加了一个查询参数changedDate到提供给客户端的 url 当时这很有效 在过去几个月 可能是几周 的某个时候 谷歌似乎改变
  • 如何在 Python 中使用日期时间和 scipy 峰值绘制绘图?

    我从一个问题中举了一个例子 并将其适应我的数据集 但当涉及到绘制绘图时 我陷入了困境 我知道如何制作日期时间 值图 但我不知道如何进行组合 我得到的答复如下 Response https datascience stackexchange
  • 部署套件建议[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 Net 4 0 下编写了一些应
  • iOS 8 代码适用于 iPhone 5s,但不适用于 iPhone 5

    在 iPhone 5s 模拟器上一直测试我的 spritekit 游戏后 我终于尝试在 iPhone 5 模拟器上运行它 不幸的是 当我第一次触摸时 我就收到了一个我不明白的错误 我的touchesBegan函数调用我的addCoin函数
  • React router dom将数据从父组件传递到子路由器组件不传递props.match

    父组件App js的内容 import React useEffect useState from react import NavBar from components NavBar import Signup from pages Si
  • 如何使 formControl 只读

    如何以角度只读方式制作表单控件 我知道我可以用 html 来做
  • Numpy 索引重新排序数组

    我刚刚偶然发现了一个我不太理解的 numpy 索引行为 看起来 numpy 正在根据索引模式改变我的轴的顺序 不幸的是 我在文档中找不到以下内容的解释 有人可以向我解释一下发生了什么事吗 This is expected dimension
  • SignalR 响应覆盖标头

    我构建了一个位于 WebAPI 服务中的简单 SignalR 中心 并在 WebAPI 和 SignalR 上包含了所有必需的 CORS 属性 我的 WebAPI 端点都按预期工作 但 SignalR 却没有 我已经尝试了我能想到的所有方法
  • C中使用函数计算数组长度

    我想创建一个函数来计算传递数组的大小 我将传递一个数组作为输入 它应该返回其长度 我想要一个函数 int ArraySize int Array Or int Array Calculate Length of Array and Retu
  • Dash Python 应用程序按钮用于操作和刷新页面

    Dash App 中需要有一个回调函数来执行某些操作然后刷新页面 只能使用 HTML A 标签实现页面重新加载 html A html Button Refresh Data href 必需的 app layout html Div htm
  • 为什么 std::vector::insert 需要复制赋值?

    我试图理解以下行为 include
  • 在 Python 中使用 Nan 对图像进行高斯滤波

    根据 2D 坐标列表和第三个变量 速度 我创建了一个覆盖整个采样区域的 2D numpy 数组 我的目的是创建一个图像 其中每个像素包含位于其中的点的平均速度 之后用高斯滤波器过滤该图像 问题是该区域没有均匀采样 因此我有几个没有信息的像素