[英]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()
輸入:
輸出:
另外,如果您想要白色環境而不是黑色,請更換
photo_data[final_mask]=0
和
photo_data[final_mask]=255
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.