簡體   English   中英

如何屏蔽正方形的圖像?

[英]How to mask an image in a square shape?

我試圖從矩形圖像中掩蓋一個正方形。 那些非方形的區域將被漆成白色。 我寫的代碼如下。

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 無法處理具有不同數字大小的數組。 如何解決這個問題?

我認為你讓事情變得比你需要的更復雜。 從概念上講,我認為您需要按照以下方式做一些事情:

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 wise 乘法來應用掩碼:

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)

代替

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

那么你的代碼運行良好!

完整更正的代碼如下:

在線試試吧!

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

輸出:

圖片1

另外,如果您想要白色環境而不是黑色,請更換

photo_data[final_mask]=0

photo_data[final_mask]=255

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM