Как я могу правильно загрузить изображение с помощью генератора данных с функцией предварительной обработки?

#python #tensorflow #opencv #matplotlib #keras

Вопрос:

я пытаюсь применить CLAHE к своему набору данных, но не уверен, правильно ли он применен. Я пытаюсь визуализировать результат после применения CLAHE, но я могу визуализировать только в том случае, если я использую plt.imshow(img[0].astype(‘uint8’)). Поэтому я не уверен, правильно ли это применяется. Я буду очень благодарен, если кто-нибудь сможет мне помочь.

 BSZ=64
tsize=(48,48)    

clahe = cv2.createCLAHE(clipLimit=0.01, tileGridSize=(8,8))    
def claheImage(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = gray.astype(np.uint16)
    eq = clahe.apply(gray)
    eq = cv2.cvtColor(eq, cv2.COLOR_GRAY2BGR)
    eq = eq.astype(np.float32)
    return eq

val_generator = ImageDataGenerator(rescale=1/255,
                                  preprocessing_function=claheImage)

tr_generator = ImageDataGenerator(rescale = 1/255,
                                  zoom_range=0.3,
                                  shear_range=0.3,
                                  horizontal_flip=True,
                                  rotation_range=15,
                                  fill_mode="nearest",
                                  preprocessing_function=claheImage)

val_data = val_generator.flow_from_directory("./test",
                                             batch_size= BSZ,
                                             target_size=tsize,
                                             color_mode="rgb",
                                             interpolation="nearest")
tr_data = tr_generator.flow_from_directory("./train",
                                          batch_size= BSZ,
                                          target_size=tsize,
                                          color_mode="rgb",
                                          interpolation="nearest")
 

Когда я использую этот код, я получаю пустое изображение и предупреждение:
«Обрезка входных данных в допустимый диапазон для imshow с данными RGB ([0..1] для поплавков или [0..255] для целых чисел)»

 for _ in range(1):
    img, label = next(val_data)
    print(img.shape)
    plt.imshow(img[0])
    type(img[0])
    plt.show()
 

Но когда я использую astype(‘unit8’) Я могу это показать. Итак, я не уверен, правильно ли применяется CLAHE.

 for _ in range(1):
    img, label = next(val_data)
    print(img.shape)
    #plt.imshow(img[0])
    plt.imshow(img[0].astype('uint8'))
    type(img[0])
    plt.show()
 

Более подробную информацию можно найти по следующей ссылке.

https://colab.research.google.com/drive/1RguAZ9_9pREQNDkP6ort2mY1ffsFOLms?usp=sharing

Ответ №1:

Это из-за Matplotlib. Диапазон значений пикселей должен находиться между [0, 255] целыми числами и [0., 1.] значениями с плавающей запятой. Ваша функция предварительной обработки не должна учитывать это.

Я предлагаю вам удалить rescale=1/255 , но убедитесь, что диапазон значений, выводимых вашей функцией, находится в диапазоне от 0 до 1.

 def claheImage(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = gray.astype(np.uint16)
    eq = clahe.apply(gray)
    eq = cv2.cvtColor(eq, cv2.COLOR_GRAY2BGR)
    eq = eq.astype(np.float32)
    eq = eq / np.max(eq) # this makes sure the output is between 0 and 1
    return eq