У меня есть целые слайд-изображения гигапиксельного размера раковой ткани, из которых я собираю пластыри для обучения CNN. Вот как выглядит один из них.
Сейчас я использую приведенный ниже код, чтобы попытаться отфильтровать фоновые патчи, которые более чем на 30% пусты, но, похоже, не работают.
i = random.randint(0, x - patch_size/(2**level))
j = random.randint(0, y - patch_size/(2**level))
grey = cv2.cvtColor(img[j:j+patch_size/(2**level), i:i+patch_size/(2**level)], cv2.COLOR_RGB2GRAY)
ret, thresh = cv2.threshold(grey, 80, 255, cv2.THRESH_BINARY)
if numpy.sum(thresh <= 10) >= 0.3*(patch_size**2):
arr.append((i, j))
Многие изпатчи, которые я создаю, все еще не заполнены, и я полагаю, что это может быть из-за нефильтрованных не совсем белых участков изображения. В любом случае, я не верю, что мой метод преобразования патча в оттенки серого с последующим установлением порога для подсчета белых пикселей является настолько эффективным. У меня была мысль о возможности сравнения по размеру файла, так как я заметил, что все пустые изображения имеют низкий размер файла, но сохранение патча, вычисление размера файла и последующее удаление его тоже не кажутся такими эффективными. Есть мысли о быстром и эффективном способе отфильтровывать нетканые пластыри?
РЕДАКТИРОВАТЬ: Просто некоторая дополнительная информация, которую я разместил в комментариях. Все, что не является розовым или фиолетовым, является фоном. Мои патчи имеют размер изображения 256x256, размер которого может превышать 1 000 000 x 1 000 000. Я выбираю патчи путем случайного генерирования координатных точек, представляющих верхний левый угол патча в пределах ширины и высоты уменьшенной выборки, проверяя, является ли патч в основном тканью, и затем сохраняя координаты в массив. У меня есть контуры, которые указывают области интереса, но мой код для выбора патчей внутри них работает нормально. Мне просто нужно выбрать области за пределами областей интереса, которые имеют нормальную ткань и не являются в основном пустым пространством