首页 > 解决方案 > 使用 CLAHE 函数处理图像时出现错误 (-215)

问题描述

def AHE(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    eq = clahe.apply(gray)
    return eq   
IMG_SIZE = (120,120)
batch_size = 8
epoch = 10
train_image_generator = ImageDataGenerator(rescale=1./119,rotation_range=30, horizontal_flip=0.5, preprocessing_function=AHE)
validation_image_generator = ImageDataGenerator(rescale=1./119)
test_image_generator = ImageDataGenerator(rescale=1./119,preprocessing_function=AHE) 
train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_dir,
                                                           shuffle=True,
                                                           target_size=IMG_SIZE,
                                                           )

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=validate_dir,
                                                              shuffle=True,
                                                              target_size=IMG_SIZE,
                                                              )

test_data_gen = test_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=test_dir,
                                                              shuffle=True,
                                                              target_size=IMG_SIZE,
                                                              )
sample_test_images, labels = next(test_data_gen)
print(labels[0:10])
sample_test_images.shape
labels.shape

即使我将图像转换为灰度我得到这个错误: OpenCV(4.1.2)/io/opencv/modules/imgproc/src/clahe.cpp:351:错误:(-215:断言失败)_src。类型() == CV_8UC1 || _src.type() == CV_16UC1 在函数“应用”中

标签: machine-learningdeep-learning

解决方案


我遇到了同样的问题,完全一样。这里断言的内容很重要:

(-215:Assertion failed) _src.type() == CV_8UC1 || _src.type() == CV_16UC1

这表示应用函数期望接收特定类型,“CV_8UCI”或“CV_16UCI”。这些分别对应于 np.unit8 或 np.uint16,因此更改输入数组的类型可以解决错误。

然后出现的另一个问题是图像数组的形状不再与 preprocessing_function 的输入具有相同的形状。根据 Keras 文档,“该函数应采用一个参数:一张图像(等级为 3 的 Numpy 张量),并且应输出具有相同形状的 Numpy 张量。” 为了解决这个问题,我将图像重新转换回 RGB 颜色(3 个通道)。(BGR 是 OpenCV 原生的,但我更改为在 RGB 之间进行转换。)我还将数组转换回 np.float32 类型。

所以你的功能可能是这样的:

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))    
def AHE(img):
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    gray = gray.astype(np.uint16)
    eq = clahe.apply(gray)
    eq = cv2.cvtColor(eq, cv2.COLOR_GRAY2RBG)
    eq = eq.astype(np.float32)
    return eq

顺便说一句,通过这种添加的预处理,每个 epoch 的时间大约增加了两倍(Colab 笔记本上的 GPU)。目前正在对胸部 X 光片进行分类,我希望这种增强是值得的。;)


推荐阅读