如何以正方形遮罩图像?

时间:2020-10-29 13:20:34

标签: python image numpy

我正在尝试从矩形图像中遮盖正方形。那些正方形以外的区域将被漆成白色。我写下面的代码。

photo_data = imageio.imread('./demo/dog.jpg')
total_rows,total_columns,layer=photo_data.shape
X,Y=np.ogrid[:total_rows,:total_columns]
center_rows=total_rows/2
center_columns=total_columns/2
upper_mask=X-center_rows>500
low_mask=X-center_rows<-500
left_mask=Y-center_columns>500
right_mask=Y-center_columns<-500
final_mask=np.logical_and(upper_mask,low_mask,left_mask,right_mask)
photo_data[final_mask]=0
plt.figure(figsize=(15,15))
plt.imshow(photo_data)

我猜np.logical_and无法处理具有不同数字大小的数组。如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我认为您会使事情变得比您需要的复杂。从概念上讲,我认为您需要按照以下方式做一些事情:

photo_data = imageio.imread('./demo/dog.jpg')
total_rows,total_columns,layer=photo_data.shape
mask_size = 500
photo_data[total_rows/2-mask_size/2:total_rows/2+mask_size/2,
    total_columns/2-mask_size/2:total_columns/2+mask_size/2,
    :] = 0
plt.figure(figsize=(15,15))
plt.imshow(photo_data)

编辑:

我认为执行此操作的方式甚至更优雅,但是我个人喜欢的一种方式是使用numpys elemet明智的乘法来应用蒙版:

import numpy as np

photo_data = imageio.imread('./demo/dog.jpg')
total_rows,total_columns,layer=photo_data.shape
mask_size = 500

mask = np.zeros(photo_data.shape)
mask[total_rows/2-mask_size/2:total_rows/2+mask_size/2,
    total_columns/2-mask_size/2:total_columns/2+mask_size/2,
    :] = 1
photo_data = photo_data * mask
plt.figure(figsize=(15,15))
plt.imshow(photo_data)

答案 1 :(得分:0)

代替

np.logical_and(upper_mask,low_mask,left_mask,right_mask)

您可以使用

upper_mask & low_mask & left_mask & right_mask

但是实际上您需要OR来完成任务,因此正确的方法是使用:

upper_mask | low_mask | left_mask | right_mask

然后您的代码运行良好!

下面完整的更正代码:

Try it online!

import imageio, numpy as np, matplotlib.pyplot as plt

photo_data = imageio.imread('https://i.stack.imgur.com/lb6U1.jpg')
total_rows,total_columns,layer=photo_data.shape
X,Y=np.ogrid[:total_rows,:total_columns]
center_rows=total_rows/2
center_columns=total_columns/2
upper_mask=X-center_rows>100
low_mask=X-center_rows<-100
left_mask=Y-center_columns>100
right_mask=Y-center_columns<-100
final_mask=upper_mask | low_mask | left_mask | right_mask
photo_data[final_mask]=0
plt.figure(figsize=(7,5))
plt.imshow(photo_data)
plt.show()

输入:

img0

输出:

img1

如果您想要白色而不是黑色,请替换

photo_data[final_mask]=0

使用

photo_data[final_mask]=255