OpenCV和Python如何仅裁剪圆形区域

4

我想用一个点到中心来裁剪圆形,怎么做最简单?谢谢,这是我的代码

import numpy as np
import cv2

img = cv2.imread('lenna.png',cv2.IMREAD_COLOR)
cv2.circle(img,(312,237), 63, (0,0,0),2)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

只是为了明确,生成的图像将始终是带有圆形的矩形。那么矩形的大小是否与源图像相同?还是应该与圆的直径大小相同?理想情况下,您可以创建一个蒙版并使用蒙版复制图像(仅包括圆形部分)。 - api55
我需要一个大小为圆的直径的矩形。 - Abi sb
2个回答

4

您可以在此脚本中裁剪圆形

import cv2
import numpy as np
img = cv2.imread('test2.jpg', cv2.IMREAD_COLOR)
x=256
y=256
r=63
# crop image as a square
img = img[y:y+r*2, x:x+r*2]
# create a mask
mask = np.full((img.shape[0], img.shape[1]), 0, dtype=np.uint8) 
# create circle mask, center, radius, fill color, size of the border
cv2.circle(mask,(r,r), r, (255,255,255),-1)
# get only the inside pixels
fg = cv2.bitwise_or(img, img, mask=mask)

mask = cv2.bitwise_not(mask)
background = np.full(img.shape, 255, dtype=np.uint8)
bk = cv2.bitwise_or(background, background, mask=mask)
final = cv2.bitwise_or(fg, bk)
cv2.imshow('image',final)
cv2.waitKey(0)
cv2.destroyAllWindows()

-1

这是解决方案:

假设圆的中心为(a1,b1),半径为r。那么裁剪坐标将会是[ a1-r:a1+r , b1-r:b1+r ]

import numpy as np
import cv2

img = cv2.imread('lenna.png',cv2.IMREAD_COLOR)
a1=256
b1=256
r=63
cv2.circle(img,(a1,b1), r, (0,0,0),2)
result = img[a1-r:a1+r,b1-r:b1+r]
cv2.imshow('image',img)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

当且仅当x和y相等时,该代码才能正常工作,但在更改x和y坐标时无法正常工作。 - Abi sb
1
交换x和y坐标。也许你正在错误的方向上进行。在OpenCV中,第一坐标是y,第二坐标是x。 - Ishara Madhawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接