NumPy - 使用强度值矩阵的图像(矩阵)阈值处理。
NumPy - Image (matrix) thresholding using an intensity value matrix.
我需要在灰度图像中分割出异常。在我的算法的某个地方,我计算了一个矩阵,其中包含我需要设置为零的已知像素强度。我该怎么做?
例如:
计算出的像素强度:
(数组([ 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 专家我需要你的帮助!
要将图像数组中值为 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]])
简单
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)
当然,您可以在任何一组 连续 和 非连续 组数字中组合掩码。只有 |
他们。
希望这对您有所帮助...
我需要在灰度图像中分割出异常。在我的算法的某个地方,我计算了一个矩阵,其中包含我需要设置为零的已知像素强度。我该怎么做?
例如:
计算出的像素强度:
(数组([ 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 专家我需要你的帮助!
要将图像数组中值为 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]])
简单
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)
当然,您可以在任何一组 连续 和 非连续 组数字中组合掩码。只有 |
他们。
希望这对您有所帮助...