Вы можете исправить это в 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](https://i.stack.imgur.com/Z9Prn.jpg)
![enter image description here](https://i.stack.imgur.com/XnPdq.png)
2) Используйте эрозию, чтобы удалить небольшое поле с вашего переднего плана, вы хотите удалить часть, где развиваются ваши артефакты внешнего обода после применения canny:
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(bin,kernel,iterations = 1)
![enter image description here](https://i.stack.imgur.com/w52iQ.png)
(визуализируется красным: размытая область)
3) Используйте это размытое изображение в качестве двоичной маски на текущем изображении результата ,Это удалит внешнюю границу, сохранив все внутренние структуры без изменений:
edges_DR = cv2.Canny(img,20,40)
result = cv2.bitwise_and(edges_DR,edges_DR,mask = erosion)
![enter image description here](https://i.stack.imgur.com/V5w1C.png)
![enter image description here](https://i.stack.imgur.com/U7OpF.png)
Возможно, вам придется поэкспериментировать с размером ядра для эрозии, чтобы удалить всю границу, но только границу.Но в целом это должно дать действительно хорошие и надежные результатыДаже если ориентация или размер вашего сканирования не совпадают.