1

在下面的代码中,我有一个 8 位整数的 numpy 数组。我想对它们应用一个阈值,所以我调用cv2.threshold(img,128,1,cv2.THRSH_TOZERO)[1]。文档表明该函数应该返回一个数组,该数组0在每个单元格中的值都小于128,并且每个单元格中的原始值大于或等于128

更奇怪的是,cv2.threshold对于不同单元格中的相同值,它的行为似乎不同。

In [48]:img
Out[48]: 
array([[128, 128, 128, ..., 133, 133, 133],
       [128, 128, 128, ..., 134, 134, 134],
       [128, 128, 128, ..., 136, 136, 136],
       ..., 
       [132, 132, 132, ..., 128, 128, 128],
       [132, 132, 132, ..., 128, 128, 128],
       [132, 132, 132, ..., 128, 128, 128]], dtype=uint8)

In [49]:imgThresh=cv2.threshold(img,128,1,cv2.THRESH_TOZERO)[1]

In[50]:imgThresh
Out[50]: 
array([[  0,   0,   0, ...,   0, 151, 133],
       [  0,   0,   0, ...,   0, 151, 133],
       [  0,   0,   0, ...,   0, 151, 133],
       ..., 
       [  0,   0,   0, ...,   0, 151, 133],
       [  0,   0,   0, ...,   0, 151, 133],
       [  0,   0,   0, ...,   0, 151, 133]], dtype=uint8)

关于可能导致这种行为的任何想法?

编辑:我在 Ubuntu 12.04 上运行并遵循文档中的安装说明 另外,根据请求,我正在添加更简化的修改......这似乎正在工作。不知道该怎么做 In 1 :import numpy, cv2

In[2]:img=numpy.random.randint(0,255,(100,100)).astype(numpy.uint8)



In[3]:img
Out[3]: 
array([[122, 192, 125, ..., 224, 138, 157],
       [ 46,  90,  33, ...,  95, 251,  24],
       [238,  87, 113, ...,  60, 190, 175],
       ..., 
       [ 30,  33, 100, ..., 182, 123,  79],
       [ 84, 180,  34, ...,  37,  52, 194],
       [ 94,  51,  96, ..., 243,  69, 241]], dtype=uint8)

In[4]:img1=cv2.threshold(img,244,1,cv2.THRESH_TOZERO)
In[5]:
Out[5]:
(244.0,
 array([[  0,   0,   0, ...,   0,   0,   0],
       [  0,   0,   0, ...,   0, 251,   0],
       [  0,   0,   0, ...,   0,   0,   0],
       ..., 
       [  0,   0,   0, ...,   0,   0,   0],
       [  0,   0,   0, ...,   0,   0,   0],
       [  0,   0,   0, ...,   0,   0,   0]], dtype=uint8))
4

1 回答 1

1

在当前版本中,据我所知,在最近的一些版本中,它返回

  • img(x,y),如果 img(x,y)>thresh
  • 0,否则

OpenCV 文档

因此,如果您执行cv2.threshold(img,128,1,cv2.THRSH_TOZERO)所有值 128 将设置为 0。如果您希望它们保持在 128 使用cv2.threshold(img,129,1,cv2.THRSH_TOZERO)

您为相同的输入获得不同的值这一事实可能意味着您的安装已损坏。你是如何安装 OpenCV 和什么操作系统的?你用什么版本?您是否尝试过代码的 ac 版本?

我尝试使用以下代码重现您的错误。对我来说一切都很好。您能否尝试以下代码并发布您的输出。

import numpy,cv2
img=numpy.random.randint(0,255,(100,100)).astype(numpy.uint8)
img1=cv2.threshold(img,128,1,cv2.THRESH_TOZERO)
于 2013-06-29T06:03:44.377 回答