python - 将图像拆分为重叠补丁的有效方法,对补丁进行数学运算,然后通过获取每个像素的最大值将图像重新合并在一起
问题描述
基本上试图按照蒂塔尔所说的去做,我有一个工作功能,但它的运行速度很慢。此函数的输入图像将始终具有相同的形状和尺寸 (2d)。
这是我的工作但速度慢的代码
def z_score_detect():
data = currentData - bkgData
tileY =12
tileX =12
h,w = data.shape
DETECTED = np.zeros(data.shape).astype(np.float32)
for curY in range(tileY//2, h-tileY//2,tileY//2):
for curX in range(tileX//2, w-tileX//2,tileX//2):
# Get one of the patches of data
S = data[curY-tileY//2:curY+tileY//2,curX-tileX//2:curX+tileX//2]
# comput stdev, median
rms_bot_75 = rms(np.sort(S,axis=None)[:int((tileX*tileY)*.75)])
std_dev = np.std(S)
if std_dev != 0:
# IF SIGMA NOT ZERO
S = (S-rms_bot_75)/std_dev
# Done with processing this patch so update our output image
else:
continue
DETECTED[curY-tileY//2:curY+tileY//2,curX-tileX//2:curX+tileX//2] = np.maximum(S,DETECTED[curY-tileY//2:curY+tileY//2,curX-tileX//2:curX+tileX//2])
return DETECTED
解决方案
您可以使用view_as_windows
which 在引擎盖下使用 strides 来平铺您的图像并在平铺上进行计算。请注意,这会创建一个视图,并且应谨慎进行任何更改其内容的计算尝试。在这里,您的 if 语句计算是顺序的,必须谨慎处理(甚至顺序)。就标准和中位数而言,您可以使用:
from skimage.util import view_as_windows
#this tiles your image into shape (tileX,tileY) overlapping tiles
tiles = view_as_windows(data, (tileX,tileY))
#std and median of each tile
std_dev = tiles.std(axis=(-2,-1))
median = np.median(tiles, axis=(-2,-1))
推荐阅读
- java - 将 JSON 字符串反序列化为 Java POJO 列表列表
- python - 如何将多个参数从 pandas 数据帧传递给函数并将结果返回到数据帧中特定位置的数据帧
- sql - PSQL左外连接不返回不匹配连接的值
- java - 为我的课程中使用的通用 pojo 建模
- mpi - mpi4py 创建多个组并从每个组分散
- java - 尝试在空对象引用上调用虚拟方法“java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String)”
- angularjs - 如何在弹出窗口中显示 Steam OpenID 页面?
- forms - 如何使用 react 和 redux 更改表单中的输入值?
- java - 将默认 Toast 样式应用于自定义 Toast
- java - Java在第6列丢硬币时连接四个对角线获胜错误和错误