代码之家  ›  专栏  ›  技术社区  ›  Mustafa Magdy

从numpy数组使用opencv的灰度图像失败

  •  2
  • Mustafa Magdy  · 技术社区  · 6 年前

    我使用下面的numpy数组来保存一个黑白图像,其形状如下

    print(img.shape)
    
    (28, 112)
    

    当我尝试将图像灰度化时,使用opencv通过以下步骤获取轮廓

    #grayscale the image
     grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
     #thredshold image
     thresh = cv2.threshold(grayed, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    

    我有以下错误

    <ipython-input-178-7ebff17d1c18> in get_digits(img)
          6 
          7     #grayscale the image
    ----> 8     grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          9 
         10 
    
    error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:11073: error: (-215) depth == 0 || depth == 2 || depth == 5 in function cv::cvtColor
    

    opencv错误中没有任何信息,无法得到错误的内容

    1 回复  |  直到 6 年前
        1
  •  3
  •   Zev    6 年前

    以下是您尝试的工作代码:

    img = np.stack((img,) * 3,-1)
    img = img.astype(np.uint8)
    grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(grayed, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    

    获得相同结果的一种更简单的方法是自己反转图像:

    img = (255-img)
    thresh = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)[1]
    

    正如您所发现的,当您对图像执行不同的操作时,图像需要采用不同的格式。

    thresh_binary_inv和cv2.thresh_binary的设计目的是获取彩色图像(并将其转换为灰度),因此需要三通道表示。

    thresh_otsu可以处理灰度图像,所以一个通道就可以了。

    因为你的图像从一开始就已经是灰度的,你不能把它从颜色转换成灰度,也不需要。我想你是想把图像颠倒过来,但这很简单( 255-img )

    有一次你试图用浮点值来做一个cv2.thresh_otsu,但是cv2.thresh_otsu需要0到255之间的整数。

    如果opencv有更多用户友好的错误消息,它将真正有助于解决这些问题。