Обнаружение присутствия черных областей в изображении в оттенках серого

#python #opencv #image-processing #machine-learning #computer-vision

#python #opencv #обработка изображений #машинное обучение #компьютерное зрение

Вопрос:

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

Я хочу разработать сеть, которую я обучаю определенным типам изображений в сером цвете, которые будут обнаруживать области, превышающие определенный порог интенсивности оттенков серого.

Как мне поступить с этим дальше? Нужна ли мне для этого нейронная сеть?

Ниже приведены некоторые примеры изображений. Та, что в крайнем левом углу, — это то, как это должно выглядеть, та, что посередине, — это когда он обнаруживает, что есть несколько черных линий (не совсем черных, но выше некоторого порога интенсивности оттенков серого), а та, что в крайнем правом углу, — это то, что я ожидаю получить в результате моего кода.

PS Это особенно интересно при обнаружении трещин на компьютерной томографии, которые отображаются в виде темно-черных пятен / линий на другом фоне в оттенках серого

введите описание изображения здесь

Комментарии:

1. Это слишком расплывчато, вы, вероятно, можете добавить несколько образцов изображений. Эта ссылка может дать вам некоторое направление — scikit-image.org/docs/dev/auto_examples/segmentation /…

2. для чего вам нужна сеть? если ваша цель — глобальный порог, просто примените его.

3. Добавьте несколько примеров изображений того, что нормально, а что нет, и я уверен, что кто-нибудь сможет помочь.

4. Черные области будут представлены низкими числами на изображениях, поскольку они имеют низкую яркость или интенсивность, поэтому вы, вероятно, захотите обнаружить элементы, ниже порогового значения. Вероятно, для этого вам не нужна нейронная сеть, но вам понадобятся более репрезентативные изображения.

5. @vedantgala До тех пор, пока интенсивность трещины не изменится, ограничение все равно будет давать тот же результат, независимо от сканируемой части тела.

Ответ №1:

Это очень тривиально, и вам определенно не понадобится нейронная сеть для решения этой проблемы. Если вы работаете с изображениями в оттенках серого и знаете интересующий вас порог интенсивности (например, вы допускаете значение интенсивности до 3), вы можете просто выполнить простую пороговую операцию для идентификации черных областей.

Это, вероятно, также сработало бы в вашем приложении для компьютерной томографии, если предположить, что эти «трещины» всегда имеют очень низкую интенсивность.

Например. для ct-изображения, где я применил ваши «трещины» в вашем примере изображения, пороговое значение этих трещин будет работать довольно хорошо (вы получите только некоторый фоновый шум / артефакты). Смотрите следующий фрагмент OpenCV:

 import numpy as np
import cv2

# Load an color image in grayscale
img = cv2.imread('chest-ct-lungs.jpg',0)
ret,thresh = cv2.threshold(img,3,255,cv2.THRESH_BINARY)
cv2.imwrite('output.png',thresh)
  

ввод:

введите описание изображения здесь

исходный источник изображения: www.radiologyinfo.org

вывод:

введите описание изображения здесь

Как вы видите, это буквально всего лишь 3 строки кода, не всегда предполагайте, что вам придется использовать нейронные сети для всего, иногда лучше просто решить проблему обработки изображений «старомодным способом». Особенно, если проблема тривиальна.

Комментарии:

1. Есть идеи, как я мог бы расположить эти красные прямоугольники вокруг строк и оставить эти строки на том же изображении, что и раньше?

2. @vedantgala Вместо этого вычислите обратное двоичное изображение (используйте опцию THRESH_BINARY_INV ), затем вычислите количество для этого изображения с помощью findContours . Используйте boundingRect функцию для вычисления ограничивающих рамок для каждого из ваших контуров и, наконец, нарисуйте их на исходном изображении. Должно быть много руководств о том, как это сделать с помощью OpenCV.