first: HoughCircles
используется для обнаружения кругов на изображении, а не для его обрезки.
Вы не можете иметь изображение круга. Изображение всегда прямоугольное, но некоторые пиксели могут быть прозрачными (альфа-канал в RGBA
), и программы не будут отображать их.
Таким образом, вы можете сначала обрезать изображение, чтобы получить квадрат, а затем добавить альфа-канал с информацией о том, какие пиксели должны быть видны. И здесь вы можете использовать маску с белым кружком на черном фоне. В конце вы должны сохранить его как png
или tiff
, потому что jpg
не может поддерживать альфа-канал.
Я использую модуль PIL
/ pillow
для этого.
Я обрезаю квадратную область в центре изображения, но вы можете использовать для этого разные координаты.
Далее я создаю изображение в градациях серого с тем же размером и черным фоном и рисую белый круг / эллипс.
Наконец, я добавляю это изображение как альфа-канал к кадрированному изображению и сохраняю его как png
.
from PIL import Image, ImageDraw
filename = 'dog.jpg'
# load image
img = Image.open(filename)
# crop image
width, height = img.size
x = (width - height)//2
img_cropped = img.crop((x, 0, x+height, height))
# create grayscale image with white circle (255) on black background (0)
mask = Image.new('L', img_cropped.size)
mask_draw = ImageDraw.Draw(mask)
width, height = img_cropped.size
mask_draw.ellipse((0, 0, width, height), fill=255)
#mask.show()
# add mask as alpha channel
img_cropped.putalpha(mask)
# save as png which keeps alpha channel
img_cropped.save('dog_circle.png')
img_cropped.show()
Результат
![enter image description here](https://i.stack.imgur.com/nbFgq.png)
Кстати:
В маске вы можете использовать значения от 0 до 255, и разные пиксели могут иметь разную прозрачность - некоторые из них могут быть полупрозрачными, чтобы сделать гладкую границу.
Если вы хотите использовать его в HTML на своей странице, вам не нужно создавать круговое изображение, потому что веб-браузер может закруглять углы изображения и отображать его в виде круга. Вы должны использовать CSS для этого.
РЕДАКТИРОВАТЬ: Пример с большим количеством кругов на маске.
![enter image description here](https://i.stack.imgur.com/NMrjS.png)
from PIL import Image, ImageDraw
filename = 'dog.jpg'
# load image
img = Image.open(filename)
# crop image
width, height = img.size
x = (width - height)//2
img_cropped = img.crop((x, 0, x+height, height))
# create grayscale image with white circle (255) on black background (0)
mask = Image.new('L', img_cropped.size)
mask_draw = ImageDraw.Draw(mask)
width, height = img_cropped.size
mask_draw.ellipse((50, 50, width-50, height-50), fill=255)
mask_draw.ellipse((0, 0, 250, 250), fill=255)
mask_draw.ellipse((width-250, 0, width, 250), fill=255)
# add mask as alpha channel
img_cropped.putalpha(mask)
# save as png which keeps alpha channel
img_cropped.save('dog_2.png')
img_cropped.show()