Вы будете там весь день с for
петлями! Вы были бы на много миль быстрее, чтобы сделать морфологическую свертку с кольцевым ядром. Я могу показать вам, как это сделать быстро в ImageMagick , но вы можете сделать то же самое с OpenCV .
Вот команда basi c:
magick stars.png -morphology convolve ring:3.5,4.5 result.png
Я запусту его снова и на этот раз, попросите ImageMagick показать мне ядро - надеюсь, вы увидите, что 1s образуют кольцо с внутренним радиусом 3,5 пикселя и внешним радиусом 4,5 пикселя:
convert stars.png -define morphology:showkernel=1 -morphology convolve ring:3.5,4.5 result.png
Вывод
Kernel "Ring" of size 9x9+4+4 with values from 1 to 1
Forming a output range from 0 to 32 (Sum 32)
0: nan nan 1 1 1 1 1 nan nan
1: nan 1 1 nan nan nan 1 1 nan
2: 1 1 nan nan nan nan nan 1 1
3: 1 nan nan nan nan nan nan nan 1
4: 1 nan nan nan nan nan nan nan 1
5: 1 nan nan nan nan nan nan nan 1
6: 1 1 nan nan nan nan nan 1 1
7: nan 1 1 nan nan nan 1 1 nan
8: nan nan 1 1 1 1 1 nan nan
Существует превосходное описание увлекательной темы морфологии и того, как она работы Энтони Тиссена здесь .
Вот версия OpenCV Python той же техники:
#!/usr/bin/env python3
import cv2
from skimage.draw import circle_perimeter
import numpy as np
# Load image
im = cv2.imread('stars.png')
# Ring shape structuring element 9x9 with a central circle radius 4 of 1s
selem = np.zeros((9, 9), dtype=np.uint8)
rr, cc = circle_perimeter(4, 4, 4)
selem[rr, cc] = 1
# Do the morphology just on red channel
dilated = cv2.dilate(im[...,2], selem, iterations=1)
# Put modified red channel back into original image and save
im[:,:,2] = dilated
cv2.imwrite('result.png', im)
Результаты те же, что и выше .