<p>对于这些任务,您应该查看OpenCV。您可以将圆转换为整个轮廓并计算圆的半径。然后你可以画圆,在蒙版上画出它们,然后执行<code>cv2.bitwise_and</code>在图像上画出圆形感兴趣区域。你可以用你选择的一个整数(在我的例子中是10)来迭代和多个ROI圆的半径。希望有帮助。干杯!在</p>
<p>示例代码:</p>
<pre><code>import cv2
import numpy as np
img = cv2.imread('circle.png')
h, w = img.shape[:2]
mask = np.zeros((h, w), np.uint8)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
kernel = np.ones((10,10),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,kernel, iterations = 2)
_, contours, hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = max(contours, key=cv2.contourArea)
extLeft = tuple(cnt[cnt[:, :, 0].argmin()][0])
extRight = tuple(cnt[cnt[:, :, 0].argmax()][0])
radius = (extRight[0] - extLeft[0])/2
print(extRight[0], extLeft[0])
print(radius)
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
print(cx, cy)
for i in range(1,30):
if i*10<radius:
print(i*10)
cv2.circle(mask,(cx,cy), i*10, 255, -1)
res = cv2.bitwise_and(img, img, mask=mask)
pixels = np.sum(res == 255)
cv2.putText(res,'Pixel count: '+str(pixels),(30,30), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255), 1, cv2.LINE_AA)
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
res = cv2.bitwise_and(img, img, mask=opening)
pixels = np.sum(res == 255)
cv2.putText(img,'Pixel count: '+str(pixels),(30,30), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255), 1, cv2.LINE_AA)
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
break
</code></pre>
<p>结果:</p>
<p><a href="https://i.stack.imgur.com/8gnST.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/8gnST.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/laeFT.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/laeFT.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/yyFC9.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/yyFC9.png" alt="enter image description here"/></a></p>
<p>编辑:</p>
<p>尝试用不同的方法计算中间值</p>
^{pr2}$
<p>编辑2:</p>
<p>好吧,我从你的第一个例子中假设你的形象从一开始就几乎是一个圆。因为它不是你必须计算不同的中心(从我的第一个编辑-从边界框)和做一个更大的内核(40,40)-因为事实上,图像非常大。再加上你必须使我在范围内的阈值(如10000)。这将起作用:</p>
<pre><code>import cv2
import numpy as np
img = cv2.imread('circleroi.jpg')
h, w = img.shape[:2]
mask = np.zeros((h, w), np.uint8)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
kernel = np.ones((40,40),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,kernel, iterations = 2)
_, contours, hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = max(contours, key=cv2.contourArea)
extLeft = tuple(cnt[cnt[:, :, 0].argmin()][0])
extRight = tuple(cnt[cnt[:, :, 0].argmax()][0])
radius = (extRight[0] - extLeft[0])/2
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cx = int(x+(w/2))
cy = int(y+h/2)
for i in range(1,10000):
if i*10<radius:
cv2.circle(mask,(cx,cy), i*10, 255, -1)
res = cv2.bitwise_and(img, img, mask=mask)
pixels = np.sum(res == 255)
cv2.putText(res,'Pixel count: '+str(pixels),(30,30), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255), 1, cv2.LINE_AA)
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
res = cv2.bitwise_and(img, img, mask=opening)
pixels = np.sum(res == 255)
cv2.putText(img,'Pixel count: '+str(pixels),(30,30), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255), 1, cv2.LINE_AA)
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
break
</code></pre>