Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在正方形中遮罩图像?_Python_Image_Numpy - Fatal编程技术网

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
,我发布了这个解决方案。谢谢你的评论!谢谢你的评论!