Получить элементы внутри изображения и удалить границу - PullRequest
4 голосов
/ 17 июня 2019

Я хочу обнаружить особенности внутри изображения (сканирование сетчатки).Изображение состоит из сканирования сетчатки внутри прямоугольной коробки с черным фоном.

Я работаю с Python 3.6 и использую Canny Edge Detection для обнаружения объектов внутри изображения.Я понимаю, что алгоритм обнаружения хитрых ребер использует градиенты ребер для поиска ребер.В то время как Canny Edge Detection предоставляет мне функции внутри сканирования сетчатки для правильного выбора пороговых значений, он всегда сохраняет круговой край между сканированием сетчатки и черным фоном в выходном изображении.

В выводимом изображении я хочу иметь только элементы внутри изображения (сканирование сетчатки), а не внешний край.Как я могу это сделать? Я ищу решения, которые используют Python.Я также открыт для использования методов, отличных от Canny Edge Detection, если они помогают выполнить требуемую задачу.

Ниже приведены фактическое изображение и выходное изображение, которое я получаю из Canny Edge Detection.

enter image description here

Ниже приводится круговой обод, о котором я говорю (выделено красным.)

enter image description here

Ниже приведено ожидаемое выходное изображение :

enter image description here

Мой код указан ниже:

import cv2
import matplotlib.pyplot as plt
from matplotlib.pyplot import imread as imread

plt.figure(1)
img_DR = cv2.imread('img.tif',0)
edges_DR = cv2.Canny(img_DR,20,40)

plt.subplot(121),plt.imshow(img_DR)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges_DR,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()

Здесь вы можете найти изображение, используемое в этом коде .

Заранее спасибо.

1 Ответ

4 голосов
/ 17 июня 2019

Вы можете исправить это в 3 шага:

1) Порог вашего входного изображения с очень низкой интенсивностью, так что сетчатка является единственной областью переднего плана.Глядя на ваше изображение, это должно работать очень хорошо, поскольку у вас нет реальных черных областей в области переднего плана:

img = cv2.imread('retina.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,bin = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)

enter image description here

enter image description here

2) Используйте эрозию, чтобы удалить небольшое поле с вашего переднего плана, вы хотите удалить часть, где развиваются ваши артефакты внешнего обода после применения canny:

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(bin,kernel,iterations = 1)

enter image description here

(визуализируется красным: размытая область)

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

edges_DR = cv2.Canny(img,20,40)
result = cv2.bitwise_and(edges_DR,edges_DR,mask = erosion)

enter image description here

enter image description here

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

...