python - 如何使用OpenCV裁剪圆形图像?

标签 python

我想知道 openCV 中是否有一种方法可以让我在两个圆圈之间裁剪图像,以忽略较小内圈中的所有内容和较大圆圈之外的所有内容的方式。像 donut 形状。

最佳答案

这是在 Python/OpenCV 中执行此操作的一种方法。

  • 读取输入并获取其尺寸
  • 定义两个圆的半径和圆心坐标
  • 在黑色背景上为每个半径创建一个白色实心圆掩码
  • 从较大的半径掩码中减去较小的半径掩码
  • 将生成的蒙版图像放入输入的alpha channel
  • 保存结果

输入:

enter image description here

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()


较小的半径掩码:

enter image description here

更大的半径 mask :

enter image description here

差异掩码:

enter image description here

结果图像:

enter image description here

关于python - 如何使用OpenCV裁剪圆形图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61516526/

相关文章:

python - 使用 3 列按唯一值查找前 5 个 pandas dataframe

python - 删除 Django 模板中字符串的最后 3 个字母 [ :-3]

python - 如何刺激kivy中的按钮?

java - Python "Event"等同于 Java?

python - 在python中将0/1矩阵转换为二维网格图

python 正则表达式匹配行开头定义的单词与其他行中定义的单词之间的所有内容

python - 如何在 Python 中将字母表映射为整数?

Powershell 远程处理的 Python 包装器

python : Allowing methods not specifically defined to be called ala __getattr__

python - 下载网站中的所有文件