python - 如何使用 OpenCV 裁剪圆形图像?
问题描述
我想知道openCV中是否有一种方法可以让我在两个圆圈之间裁剪图像,以忽略较小内圈中的所有内容以及较大圆圈之外的所有内容。像一个甜甜圈形状。
解决方案
这是在 Python/OpenCV 中执行此操作的一种方法。
- 读取输入并获取其尺寸
- 定义两个圆的半径和中心坐标
- 在黑色背景上为每个半径创建一个白色实心圆形蒙版
- 从较大半径蒙版中减去较小半径蒙版
- 将生成的蒙版图像放入输入的 alpha 通道
- 保存结果
输入:
import cv2
import numpy as np
# read image
img = cv2.imread('lena.jpg')
hh, ww = img.shape[:2]
hh2 = hh // 2
ww2 = ww // 2
# define circles
radius1 = 25
radius2 = 75
xc = hh // 2
yc = ww // 2
# draw filled circles in white on black background as masks
mask1 = np.zeros_like(img)
mask1 = cv2.circle(mask1, (xc,yc), radius1, (255,255,255), -1)
mask2 = np.zeros_like(img)
mask2 = cv2.circle(mask2, (xc,yc), radius2, (255,255,255), -1)
# subtract masks and make into single channel
mask = cv2.subtract(mask2, mask1)
# put mask into alpha channel of input
result = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
result[:, :, 3] = mask[:,:,0]
# save results
cv2.imwrite('lena_mask1.png', mask1)
cv2.imwrite('lena_mask2.png', mask2)
cv2.imwrite('lena_masks.png', mask)
cv2.imwrite('lena_circle_masks.png', result)
cv2.imshow('image', img)
cv2.imshow('mask1', mask1)
cv2.imshow('mask2', mask2)
cv2.imshow('mask', mask)
cv2.imshow('masked image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
小半径遮罩:
更大半径的遮罩:
差异掩码:
结果图像:
推荐阅读
- jquery - 如何使用引导程序将列表转换为可折叠列表
- tensorflow - tensorflow-gpu 比 tensorflow 慢
- python - 如何在 clojure 中包含 python 代码?
- apache-kafka - 是否可以从 kafka 消息中获取消息键的最新值
- android - 由于 lint 错误,无法生成签名的 apk
- c# - 如何在C#中删除分隔符
- visual-studio - Xamarin.Messaging.Broker wants firewall access
- pytorch - pytorch中每行的第k个值?
- android - 如何将我的通知详细信息添加到另一个片段中的回收站?
- python - Matplotlib 无法保存动画