我需要在灰度图像中分割出异常。在算法的某个地方,我计算一个矩阵,其中包含我需要设置为零的已知像素强度。我该怎么做?
例如:
计算出的像素强度:
(数组([94,95,96,97,98,99,100,101,102,103,104,105,106,
107,108,109,110,111,112,113,114,115,116,117,118,119,
120,121,122,123,124,125,126,127,128,129,130,131,132,
133,134,135,136,137,138,139,140,141,142,143,144,145,
146,147,148,149,150,151]),)
图片大小(480,640):
印刷它给出:[[86 90 97 ...,142 152 157]
[85 89 97 ...,145 154 158]
[83 87 95 ...,154 158 159]
...,
[130 134 139 ...,156 154 154]
[130 134 140 ...,154 153 152]
[130 134 141 ...,154 153 152]]
我意识到每个像素我都可以通过强度矩阵。然而,这将太昂贵。 NumPy专家,我需要你的帮助!
答案 0 :(得分:3)
简单地
oI[ (oI >93) & (oI < 152) ] = 0
我应该认为......
根据您的问题,您希望在数组中包含特定的非连续数字。最好由map
- reduce
算法处理。我们假设您希望将以下数字设置为0
:
numList = np.array([2, 15, 100, 56])
然后你可以像这样设置一个面具,并将它们缩小为一个面具:
mask = (oI == 2)|(oI == 15)|(oI == 100)|(oI == 56)
oI[mask] = 0
对于一大堆数字来说,这显然不是一个好的解决方案。所以你可以......
mask = reduce( lambda m, n: m|n ,[ oI == i for i in numList])
oI[mask] = 0
如果连续,例如a
和b
之间,那么您只需使用之前的方法......
mask = (oI > a) & (oI < b)
当然,您可以在任何连续和非连续数字集合中组合掩码。只需|
他们。
希望这会有所帮助......
答案 1 :(得分:1)
要将图像数组中所有像素设置为零,其值为91到151(包括91和151),请使用:
import numpy as np
newimage = np.where(np.logical_and(91<=oldimage, oldimage<=151), 0, oldimage)
要将值属于某个数组vct
的图像数组中的所有像素设置为零,请使用:
newimage = np.where(np.in1d(oldimage, vct).reshape(oldimage.shape), 0, oldimage)
假设我们有oldimage
这样:
In [12]: oldimage
Out[12]:
array([[0, 1, 2],
[3, 4, 5]])
我们有一个名为vct
的数字列表:
In [13]: vct
Out[13]: array([3, 5])
我们将oldimage
中同样位于vct
的所有像素设为零:
In [14]: newimage = np.where(np.in1d(oldimage, vct).reshape(oldimage.shape), 0, oldimage)
In [15]: newimage
Out[15]:
array([[0, 1, 2],
[0, 4, 0]])