Как быстро и эффективно проверить, является ли изображение в основном фоновым? - PullRequest
2 голосов
/ 02 ноября 2019

У меня есть целые слайд-изображения гигапиксельного размера раковой ткани, из которых я собираю пластыри для обучения 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. Я выбираю патчи путем случайного генерирования координатных точек, представляющих верхний левый угол патча в пределах ширины и высоты уменьшенной выборки, проверяя, является ли патч в основном тканью, и затем сохраняя координаты в массив. У меня есть контуры, которые указывают области интереса, но мой код для выбора патчей внутри них работает нормально. Мне просто нужно выбрать области за пределами областей интереса, которые имеют нормальную ткань и не являются в основном пустым пространством

1 Ответ

1 голос
/ 05 ноября 2019

Подход к порогу Оцу, поэтому значения либо 255 для белого, либо 0 для черного, затем примените cv2.countNonZero(). Функция будет подсчитывать все небелые пиксели, если это значение меньше предварительно определенного порога (половина области изображения), то это в основном фон пустого пространства. Вот пороговое изображение

image

Мы вычисляем соотношение пикселей белого и черного пикселей, а затем используем это соотношение для определения результата с использованием минимального порогового значения фона

Pixel ratio: 9.88%
Mostly Background

Код

import cv2

image = cv2.imread('1.png')
h, w, _ = image.shape
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)[1]

pixels = cv2.countNonZero(thresh)
ratio = (pixels/(h * w)) * 100
print('Pixel ratio: {:.2f}%'.format(ratio))

if ratio < 50:
    print('Mostly Background')
else:
    print('Not Mostly Background')

cv2.imshow('thresh', thresh)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...