machine-learning - 使用 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 在函数“应用”中
解决方案
我遇到了同样的问题,完全一样。这里断言的内容很重要:
(-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 光片进行分类,我希望这种增强是值得的。;)
推荐阅读
- python - 除 ValueError 外的 elif
- angular - 进口 angular/core 和 angular/cli 之间的区别
- java - 如何在 jar 中使用主类进行火花提交?
- kernel-mode - 陷阱指令:为什么必须原子地改变程序计数器和处理器状态寄存器?
- javascript - 对拖动的图像及其元素使用相同的位置
- web-services - 获取其他用户信息的 API?
- r - 操作列表
- python - 尝试在 MAC 上使用 pip 被拒绝?
- gmail - 根据与发送日期相比的内容在 Gmail 中标记电子邮件?
- scala - Spark 连接池 - 这是正确的方法吗