【问题标题】:Crop a circle area (ROI) of an image and put it onto a white mask裁剪图像的圆形区域 (ROI) 并将其放在白色蒙版上
【发布时间】:2020-01-23 08:00:45
【问题描述】:

我想裁剪图像的圆形区域 (ROI) 并将其放在具有相同尺寸和位置的白色蒙版上。

制作白色面具:

h, w = img.shape[:2]
mask = np.ones((h,w,3), np.uint8)*255

图像中的圆形区域(ROI)(-->这是错误的,因为它只是一个圆形,我想要一个所有像素都在这个圆形中的区域并将其复制到白色蒙版中) :

roi = cv2.circle(img, (656,517), 505, (0,0,0), -1)

如何将图像圆圈中的所有像素复制到具有相同尺寸和相同圆圈位置的蒙版上?

图片尺寸:1280x1024。

【问题讨论】:

  • 在 C++ 中有一个 mat.copyTo 方法可以接受掩码。可证明 numpy 有类似的东西。

标签: python opencv image-processing


【解决方案1】:

基本上,您只需要正确使用 OpenCV 的 bitwise_and 方法,即您需要为圆形 ROI 附加一个掩码。此外,您需要两次 bitwise_and 调用,因为您希望在最终图像中保持白色背景。

import cv2
import numpy as np

# Original image
image = cv2.imread('path/to/your/image.png')
cv2.imshow('image', image)

# Circular ROI in original image; must be selected via an additional mask
roi = np.zeros(image.shape[:2], np.uint8)
roi = cv2.circle(roi, (175, 125), 100, 255, cv2.FILLED)
cv2.imshow('roi', roi)

# Target image; white background
mask = np.ones_like(image) * 255
cv2.imshow('mask before operation', mask)

# Copy ROI part from original image to target image
mask = cv2.bitwise_and(mask, image, mask=roi) + cv2.bitwise_and(mask, mask, mask=~roi)
cv2.imshow('mask after operation', mask)

cv2.waitKey(0)
cv2.destroyAllWindows()

一些输入图像:

生成的输出:

希望有帮助!

----------------------------------------
System information
----------------------------------------
Platform:  Windows-10-10.0.16299-SP0
Python:    3.8.1
NumPy:     1.18.1
OpenCV:    4.1.2
----------------------------------------

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2016-06-03
    相关资源
    最近更新 更多