我正在使用 size 的图像512x512
。使用einops
补丁大小为32
. 总体而言,补丁的数量是256
,换句话说,我们得到了一个大小为 的新“图像” 256x1024
。
由于该图像实际上是分割问题的掩码,因此该图像实际上仅包含 4 个值(4 类):0
用于背景、1
用于第一类、2
用于第二类、3
用于第三类。
我的目标是获取每个补丁,并为每个类计算C
以下内容:
此补丁中的像素数/标记的像素数C
。
这应该给我一个大小为 4 的数组,其中第一个条目是补丁中的像素总数(1024)超过背景像素数(标记为 0),第二个、第三个和第四个条目是相同的,但对于对应的类。
理论上,我知道我需要遍历每个补丁,然后计算当前补丁中每个类的像素数,然后除以1024
. 这样做256
正是我想要的。问题是我有(非常)大量的图像需要为此执行此操作,并且大小512
只是使问题更简单的一个示例,因此 for 循环是不可能的。
我知道我可以使用 numpy 得到我想要的结果。我都试过了:numpy.apply_over_axes
但numpy.apply_along_axis
我不知道哪一个更适合这项任务,还有numpy.where
一个我不知道它是如何应用在这里的。
这是我所做的:
from einops import rearrange
import numpy as np
labn = np.random.randint(4,size= (512,512)) # Every pixels in this image is of value: 0,1,2,3
to_patch = rearrange(labn, "(h p1) (w p2) -> (h w) (p1 p2)", p1=32, p2=32)
print(to_patch.shape) # (256,1024)
c0 = np.full(1024, 0)
c1 = np.full(1024, 1)
c2 = np.full(1024, 2)
c3 = np.full(1024, 3)
def f(a):
_c0 = a == c0
_c1 = a == c2
_c2 = a == c2
_c3 = a == c3
pr = np.array([np.sum(_c0), np.sum(_c1), np.sum(_c2), np.sum(_c3)]) / 1024
return pr
resf = np.apply_along_axis(f, 1, to_patch)
print(resf.shape) # (256, 4, 1024)
两件事情:
- 我希望输出是
256x4
沿第二个轴的每个数组总和为 1 的位置。 - 有没有更快/更好/pythonic的方法来做到这一点,最好是矢量化的?
编辑:我忘了加总和,所以现在我得到了256x4
.