#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