寻找详细:
kernel = np.zeros((2*radius+1, 2*radius+1))
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
第一行:
kernel = np.zeros((2*radius+1, 2*radius+1))
创建零的2-d阵列,其中的中心点和“半径”点在任一侧。对于半径= 2,你会得到:
# __r__ +1 __r__
[ 0, 0, 0, 0, 0, ] #\
[ 0, 0, 0, 0, 0, ] #_} r
[ 0, 0, 0, 0, 0, ] # +1
[ 0, 0, 0, 0, 0, ] #\
[ 0, 0, 0, 0, 0, ] #_} r
接下来,你从numpy.ogrid
创建的开放网格 2个阵列。网格网格在numpy中是一个“技巧”,它涉及存储一个“并行”数组或矩阵,该数组或矩阵将特定单元格的x或y坐标保存在该单元格的位置。
例如,y
-mesh电网可能是这样的:
[ 0, 0, 0, 0, 0, ]
[ 1, 1, 1, 1, 1, ]
[ 2, 2, 2, 2, 2, ]
[ 3, 3, 3, 3, 3, ]
[ 4, 4, 4, 4, 4, ]
而一个x
-mesh电网可能是这样的:
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
如果你看看他们,你”我会意识到Y_grid[x][y] == y
和X_grid[x][y] == x
这是经常使用,它有多个numpy函数来支持它。 ;-)
开放式网格与封闭式网格相似,只不过它只有“一维”。也就是说,不是一对(例如)5x5阵列,而是一个1x5阵列和一个5x1阵列。这就是ogrid
所做的 - 它返回两个打开的网格。这些值是从-radius到半径+ 1,根据蟒规则(意味着半径+ 1被省略了):
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
所以y是numpy的阵列从例如存储,-2..2 (含),x是-2..2的数组。下一步是构建一个布尔型掩码 - 即一个布满值的数组。如你所知,当你在一个numpy数组上操作时,你会得到另一个numpy数组。因此,在以恒定的表达涉及两个阵列产生另一个数组:
mask = x**2 + y**2 <= radius**2
掩模的值将是2色的位图,其中一个颜色是“真”,而另一颜色是“假。 “位图将描述实心圆或磁盘。 (由于<=
关系。请记住,x和y包含-2..2,而不是0..4。)
最后,从类型布尔转换通过使用掩蔽阵列作为kernel
阵列(的零)上的覆盖为int时,零设置到那些每当掩码为“真”:
kernel[mask] = 1
在这一点上,内核看起来像:
# __r__ +1 __r__
[ 0, 0, 1, 0, 0, ] #\
[ 0, 1, 1, 1, 0, ] #_} r
[ 1, 1, 1, 1, 1, ] # +1
[ 0, 1, 1, 1, 0, ] #\
[ 0, 0, 1, 0, 0, ] #_} r
你说,掩码标识图像中不会被改变的区域。但是,这不是过滤器改变图像的重点吗?或者你是说这是图像的副本,而不是原始图像本身,它是由滤镜更改的? – Jim421616
遮罩确实识别图像中不会被改变的区域。就像你脸上的面具来保护它,面具“保护”原始数据不被改变。这会使图像的其他部分暴露于过滤。图像的蒙版部分将通过坐标为1的'内核'meshgrid指示。曝光部分的坐标为0. –
噢,我向后隐藏了0和1!我的错。谢谢 :) – Jim421616