Python 如何在正方形中遮罩图像?
我试图用一个矩形图像来遮罩一个正方形。那些不成正方形的区域将被漆成白色。我编写代码如下Python 如何在正方形中遮罩图像?,python,image,numpy,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-ce
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)
photo_data=imageio.imread('./demo/dog.jpg')
总计行,总计列,图层=照片数据.shape
十、 Y=np.ogrid[:总计行,:总计列]
中心行=总行数/2
中心列=总列数/2
上部遮罩=X中心\u行>500
低屏蔽=X-中心屏蔽行500
我认为你把事情弄得比你需要的复杂一点。从概念上讲,我认为您需要按照以下思路做一些事情:
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)
我认为你让事情变得比你需要的更复杂。从概念上讲,我认为您需要按照以下思路做一些事情:
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
但实际上,您的任务需要或,所以正确的方法是使用:
upper_mask | low_mask | left_mask | right_mask
那么你的代码工作得很好
完整更正代码如下:
与
而不是
np.logical_and(upper_mask,low_mask,left_mask,right_mask)
你可以用
upper_mask & low_mask & left_mask & right_mask
但实际上,您的任务需要或,所以正确的方法是使用:
upper_mask | low_mask | left_mask | right_mask
那么你的代码工作得很好
完整更正代码如下:
与
谢谢你的评论。我试图运行这条线,但低于错误。“TypeError:切片索引必须是整数或无或具有索引方法”。这是因为“total_rows/2”是一个浮点数吗?但我尝试用int()函数将其转换为整数,但仍然收到此错误。我真的没有任何线索。此外,我想做的是在中心区域切掉一个正方形,然后将其余区域变成黑色。您共享的代码似乎是将中心正方形区域设置为黑色。按照您的建议,我重新编写了代码,如下所示photo_data=imageio.imread('./demo/dog.jpg')
总计行,总计列,图层=photo_data.shape
photo_data[0:half_rows-500,:,:]=0
photo_data[half_rows+500,:,:]=0
photo_data[:,0:half_columns-500,:]=0
photo
它确实起作用了。但是如何让它更优雅呢?谢谢你的评论。我试图运行这条线,但低于错误。“TypeError:切片索引必须是整数或无或具有索引方法”。这是因为“total_rows/2”是一个浮点数吗?但我尝试用int()函数将其转换为整数,但仍然收到此错误。我真的没有任何线索。此外,我想做的是在中心区域切掉一个正方形,然后将其余区域变成黑色。您共享的代码似乎是将中心正方形区域设置为黑色。按照您的建议,我重新编写了代码,如下所示photo_data=imageio.imread('./demo/dog.jpg')
总计行,总计列,图层=photo_data.shape
photo_data[0:half_rows-500,:,:]=0
photo_data[half_rows+500,:,:]=0
photo_data[:,0:half_columns-500,:]=0
photo
它确实起作用了。但是如何让它更优雅呢?你需要上遮罩|下遮罩|左遮罩|右遮罩
而不是逻辑and,这样,你的代码就可以工作了,如果你想要白色而不是黑色,那么就用照片数据[最终遮罩]=0
替换0
为255
,我发布了这个解决方案。你需要upper_mask | low_mask | left_mask | right_mask
而不是逻辑and,完成后,你的代码会工作的,如果你想要白色而不是黑色,那么就用photo_data[final_mask]=0
替换0
为255
,我发布了这个解决方案。谢谢你的评论!谢谢你的评论!