Удаление цветового шума из фрагмента изображения всего слайда

После полудня,

Я занимаюсь глубоким изучением целых изображений слайдов (биомедицинских изображений физических образцов). Я использую openslide, чтобы разбить все изображение слайда (размером 5 ГБ) на более мелкие фрагменты всего изображения, а затем преобразовать его в цветовое пространство RGB (я полагаю, что патч находится в RGBA как объект изображения PIL). Если я использую 5-кратное увеличение, я обнаруживаю, что когда я сохраняю изображение, я обнаруживаю, что в пикселях присутствует странный шум, который выглядит так, как будто многие пиксели флуоресцентны (отсутствуют при более высоких увеличениях). Мой вопрос: кто-нибудь знает, почему функция read_region библиотеки Openslide вызывает это, или знают ли они, как я могу выполнить некоторую постобработку, чтобы удалить этот артефакт из изображения? Я попытался преобразовать изображение, как показано ниже.

1.

for w in range(boundaries[0][0], boundaries[0][1], 500):
        for h in range(boundaries[1][0], boundaries[1][1], 500):
            patch = scan.read_region((w-2000, h-2000), 3, (500, 500))
            img2 = img[h-2000:h+2000, w-2000:w+2000,:]
            patch=np.asarray(patch)
            patchRGB = cv2.cvtColor(patch, cv2.COLOR_RGBA2RGB)
            print(np.mean(patchRGB), img2.shape)
            if (img2.shape == (4000, 4000, 3) and np.mean(patchRGB) < 200) and np.mean(patchRGB) > 50:
                    cv2.imwrite('output/test/images/'+os.path.basename(ndpi)[:-5]+'_'+str(w)+'_'+str(h)+'.png', patchRGB)
                    cv2.imwrite('output/test/masks/'+os.path.basename(ndpi)[:-5]+'_'+str(w)+'_'+str(h)+'_masks.png', img2) 

2.

for w in range(boundaries[0][0], boundaries[0][1], 500):
        for h in range(boundaries[1][0], boundaries[1][1], 500):
            patch = scan.read_region((w-2000, h-2000), 3, (500, 500))
            img2 = img[h-2000:h+2000, w-2000:w+2000,:]
            patchRGB = patch.convert('RGB')
            print(np.mean(patchRGB), img2.shape)
            if (img2.shape == (4000, 4000, 3) and np.mean(patchRGB) < 200) and np.mean(patchRGB) > 50:
                    patchRGB.save('output/5x/images/'+os.path.basename(ndpi)[:-5]+'_'+str(w)+'_'+str(h)+'.png')
                    cv2.imwrite('output/5x/masks/'+os.path.basename(ndpi)[:-5]+'_'+str(w)+'_'+str(h)+'_masks.png', img2) 

заплатка из всего изображения слайда, содержащая шум


person maracuja    schedule 25.02.2020    source источник
comment
То, как вы задали свой вопрос, делает число людей, которые могут ответить вам, исчезающе малым. Вы ищете кого-то, кто знает OpenSlide, PIL/Pillow, OpenCV, Numpy и кто готов отработать все недостающие операторы импорта, пробраться через все ваши лишние вложенные циклы, ненужную запись файлов и генерацию имен, и угадать, что должно быть в вашем изображении. выглядит как. Если вы удалили циклы и посмотрели на один квадрат, удалили запись в файл, добавили операторы импорта и предоставили изображения до/правильно и после/неправильно, вы, надеюсь, стать удачливее. Удачи.   -  person Mark Setchell    schedule 26.02.2020
comment
Спасибо за отзыв о заголовке - я отредактирую код и сосредоточусь на одном изображении. Я включил запись файла, так как не был уверен, что это происходит во время записи файла.   -  person maracuja    schedule 26.02.2020
comment
Можно уточнить, когда это происходит? После преобразования или после увеличения? Что должно быть вместо этих пикселей?   -  person code-lukas    schedule 29.02.2020
comment
Возможно, это либо ошибка интерполяции при увеличении, либо какое-то переполнение при преобразовании RGB...   -  person code-lukas    schedule 29.02.2020


Ответы (1)


Я бы начал с того, что разбил вопрос, чтобы выяснить, где возникает проблема.

  1. Начните с проверки файла. Попробуйте открыть его в QuPath и убедитесь, что файл открывается без ошибок и шума нет. Иногда я обнаруживаю шум от сканера слайдов, и мне приходится заново сканировать.
  2. Проверьте, как выглядит патч openslide. Мне нравится использовать для этого блокнот Jupyter, чтобы вы могли быстро позвонить plt.imshow(patch) и посмотреть, как он выглядит.
  3. Затем проверьте преобразование RGB plt.imshow(patchRGB), чтобы визуализировать его, а затем посмотреть, есть ли еще шум.
  4. Если на этом этапе он все еще выглядит изворотливым, я бы попробовал разные методы сохранения и посмотрел, присутствует ли там шум.
person Callum    schedule 10.05.2021