Просто нарисуйте круг на маске:
In [27]: mask = np.zeros((9, 9), dtype=np.uint8)
In [28]: cv2.circle(mask, center=(4, 4), radius=4, color=255, thickness=1)
Out[28]:
array([[ 0, 0, 0, 0, 255, 0, 0, 0, 0],
[ 0, 0, 255, 255, 0, 255, 255, 0, 0],
[ 0, 255, 0, 0, 0, 0, 0, 255, 0],
[ 0, 255, 0, 0, 0, 0, 0, 255, 0],
[255, 0, 0, 0, 0, 0, 0, 0, 255],
[ 0, 255, 0, 0, 0, 0, 0, 255, 0],
[ 0, 255, 0, 0, 0, 0, 0, 255, 0],
[ 0, 0, 255, 255, 0, 255, 255, 0, 0],
[ 0, 0, 0, 0, 255, 0, 0, 0, 0]], dtype=uint8)
И теперь вы можете использовать его для индексирования вашего изображения, как вам нравится. Например, вот случайное изображение:
In [33]: img
Out[33]:
array([[ 88, 239, 212, 160, 89, 85, 249, 242, 88],
[ 47, 230, 206, 206, 63, 143, 152, 67, 58],
[162, 212, 0, 213, 208, 169, 228, 14, 229],
[230, 45, 103, 201, 188, 231, 80, 122, 131],
[159, 31, 148, 158, 73, 215, 152, 158, 235],
[213, 177, 148, 237, 92, 115, 152, 188, 223],
[234, 67, 141, 173, 14, 18, 242, 208, 147],
[ 53, 194, 229, 141, 37, 215, 230, 167, 82],
[ 72, 78, 152, 76, 230, 128, 137, 25, 168]], dtype=uint8)
Вот значения по периметру:
In [34]: img[np.nonzero(mask)]
Out[34]:
array([ 89, 206, 206, 143, 152, 212, 14, 45, 122, 159, 235, 177, 188,
67, 208, 229, 141, 215, 230, 230], dtype=uint8)
Установка значения изображения по периметру круга на 0:
In [35]: img[np.nonzero(mask)] = 0
In [36]: img
Out[36]:
array([[ 88, 239, 212, 160, 0, 85, 249, 242, 88],
[ 47, 230, 0, 0, 63, 0, 0, 67, 58],
[162, 0, 0, 213, 208, 169, 228, 0, 229],
[230, 0, 103, 201, 188, 231, 80, 0, 131],
[ 0, 31, 148, 158, 73, 215, 152, 158, 0],
[213, 0, 148, 237, 92, 115, 152, 0, 223],
[234, 0, 141, 173, 14, 18, 242, 0, 147],
[ 53, 194, 0, 0, 37, 0, 0, 167, 82],
[ 72, 78, 152, 76, 0, 128, 137, 25, 168]], dtype=uint8)
Вы также можете легко получить координаты:
In [56]: np.where(mask)
Out[56]:
(array([0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 8]),
array([4, 2, 3, 5, 6, 1, 7, 1, 7, 0, 8, 1, 7, 1, 7, 2, 3, 5, 6, 4]))