在下面的代码中,我有一个8位整数的numpy数组。我想对它们应用阈值,因此我将其称为cv2.threshold(img,128,1,cv2.THRSH_TOZERO)[1].docs指出该函数应返回一个数组,该数组在每个小于0的单元格中具有128的值,而在每个大于或等于128的单元格中均具有原始值等于cv2.threshold

奇怪的是,对于不同单元格中的相同值,ojit_code表现出不同的行为。

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上运行,并按照docs的安装说明进行操作
另外,根据请求,我要添加一个更简化的修改...似乎可行。不知道该怎么做
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))

最佳答案

在当前版本中,据我所知,在某些最新版本中,它会返回

  • img(x,y),如果img(x,y)>脱粒
  • 0,否则为

  • OpenCV docs

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

    对于相同的输入获得不同的值的事实可能意味着您的安装已损坏。您如何安装OpenCV以及什么操作系统?您使用什么版本?您是否尝试过C版本的代码?

    我尝试使用以下代码重现您的错误。对我来说,一切都很好。您可以尝试以下代码并发布输出吗?
    import numpy,cv2
    img=numpy.random.randint(0,255,(100,100)).astype(numpy.uint8)
    img1=cv2.threshold(img,128,1,cv2.THRESH_TOZERO)
    

    关于python - cv2.threshold不应转换的单元格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17376212/

    10-16 12:06