NumPy - 使用强度值矩阵进行图像(矩阵)阈值处理。

时间:2015-02-16 04:38:15

标签: python opencv image-processing numpy 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专家,我需要你的帮助!

2 个答案:

答案 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

如果连续,例如ab之间,那么您只需使用之前的方法......

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]])