【问题标题】:Adaptive Threshold error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'adaptiveThreshold'自适应阈值错误:(-215:Assertion failed) src.type() == CV_8UC1 in function 'adaptiveThreshold'
【发布时间】:2021-01-14 11:27:56
【问题描述】:

我正在研究预训练的 vgg16 模型,为此我需要将图像文件的输入大小设为 (224,224,3)。

我正在处理的代码是:

from tensorflow.keras.preprocessing import image
import cv2
import matplotlib.pyplot as plt

img = image.load_img('abc.jpg',target_size=(224,224))
img = image.img_to_array(img)

print(img.shape)
## output : (224,224,3)
img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#plt.imshow(img_grey)

th3 = cv2.adaptiveThreshold(img_grey,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
plt.figure(figsize=(20,10))
plt.imshow(th3)
error                                     Traceback (most recent call last)
<ipython-input-88-2a8a27b965ed> in <module>
     17 #plt.imshow(img_grey)
     18 
---> 19 th3 = cv2.adaptiveThreshold(img_grey,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
     20 plt.figure(figsize=(20,10))
     21 plt.imshow(th3)

error: OpenCV(4.1.0) /io/opencv/modules/imgproc/src/thresh.cpp:1627: error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'adaptiveThreshold'

帮助我解决问题。

【问题讨论】:

    标签: python opencv keras adaptive-threshold


    【解决方案1】:

    错误说明解决方案:src.type() == CV_8UC1 表示您需要将图像类型设置为uint8 source

    因此,如果您重新定义 img 变量:

    img = image.img_to_array(img, dtype='uint8')
    

    问题将得到解决,但我有一个问题。

    为什么要定义下面的语句?

    img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    

    你怎么知道load_imgBGR 方式加载图像?

    我们知道 opencv 以 BGR 的方式加载图像 cv2.imread

    语句错误,因为load_imgRGB格式加载图像source

    因此正确的说法是:

    img_grey = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    

    或者你可以这样做:

    img = image.load_img('15f8U.png', grayscale=True, target_size=(224, 224))
    

    正确代码:

    from keras.preprocessing import image
    import cv2
    import matplotlib.pyplot as plt
    
    img = image.load_img('15f8U.png', grayscale=True, target_size=(224, 224))
    img = image.img_to_array(img, dtype='uint8')
    
    print(img.shape)
    ## output : (224,224,3)
    #plt.imshow(img_grey)
    
    th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
    plt.figure(figsize=(20,10))
    plt.imshow(th3, cmap="gray")
    plt.show()
    

    【讨论】:

      【解决方案2】:

      cv2.adaptive_threshold 需要一个 dtype 为 uint8 的输入数组:

      img_grey = img_grey.astype(np.uint8)
      
      th3 = cv2.adaptiveThreshold(img_grey...
      

      【讨论】:

      • 这对我不起作用...img2 = img.astype(np.uint8); type(img2) -&gt; numpy.ndarray; img2.dtype -&gt; dtype('uint8') 但我仍然得到src.type() == CV_8UC1 in function 'adaptiveThreshold'...
      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 2019-11-12
      • 2019-06-26
      • 2020-09-17
      • 2020-10-13
      • 2021-04-14
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多