如何根据python中的自定义蒙版裁剪图像?

Pav*_*van 0 python processing opencv image python-imaging-library

下面我附上了两张图片。我希望根据蒙版图像(第二张图像)将第一张图像裁剪成心形。

我搜索了解决方案,但我无法获得更简单的方法来做到这一点。请帮助我解决问题。

2张图片:

  1. 要裁剪的图像: 在此处输入图片说明

  2. 掩码图像:

在此处输入图片说明

yat*_*atu 5

让我们从加载寺庙图像开始sklearn

from sklearn.datasets import load_sample_images

dataset = load_sample_images()     
temple = dataset.images[0]
plt.imshow(temple)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

由于我们需要使用第二张图像作为掩码,我们必须进行二值阈值操作。这将创建一个黑白蒙版图像,然后我们可以使用它来蒙版之前的图像。

from matplotlib.pyplot import imread

heart = imread(r'path_to_im\heart.jpg', cv2.IMREAD_GRAYSCALE)
_, mask = cv2.threshold(heart, thresh=180, maxval=255, type=cv2.THRESH_BINARY)
Run Code Online (Sandbox Code Playgroud)

我们现在可以修剪图像,使其尺寸与寺庙图像兼容:

temple_x, temple_y, _ = temple.shape
heart_x, heart_y = mask.shape

x_heart = min(temple_x, heart_x)
x_half_heart = mask.shape[0]//2

heart_mask = mask[x_half_heart-x_heart//2 : x_half_heart+x_heart//2+1, :temple_y]
plt.imshow(heart_mask, cmap='Greys_r')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

现在我们必须对我们想要遮罩的图像进行切片,以适应实际遮罩的尺寸。另一种形状是调整蒙版的大小,这是可行的,但我们最终会得到扭曲的心脏图像。要应用面具,我们有cv2.bitwise_and

temple_width_half = temple.shape[1]//2
temple_to_mask = temple[:,temple_width_half-x_half_heart:temple_width_half+x_half_heart]
masked = cv2.bitwise_and(temple_to_mask,temple_to_mask,mask = heart_mask)
plt.imshow(masked)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您想让蒙版(黑色)区域变得透明:

tmp = cv2.cvtColor(masked, cv2.COLOR_BGR2GRAY)
_,alpha = cv2.threshold(tmp,0,255,cv2.THRESH_BINARY)
b, g, r = cv2.split(masked)
rgba = [b,g,r, alpha]
masked_tr = cv2.merge(rgba,4)

plt.axis('off')
plt.imshow(dst)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明