Python numpy图像局部涂黑失效及反选保留区域方法咨询
问题原因与实现方案
代码执行后图像无变化的原因
你写的两行赋值代码根本没有选中任何有效像素,自然不会修改图像内容,核心是对NumPy数组切片规则不熟悉导致的:
NumPy切片默认遵循左闭右开规则,且默认步长为1时,只要切片的起始索引大于等于结束索引,选中的就是空数组,对空数组赋值不会产生任何实际效果:
- 第一行
img2[0:0, 640:150] = [0, 0, 0]:第一个维度(行/高度方向)切片0:0起止索引完全相同,选中0行像素;第二个维度(列/宽度方向)切片640:150起始索引远大于结束索引,默认步长下选不中任何列,整行代码没有操作任何像素点。 - 第二行
img2[0:490, 640:640] = [0, 0, 0]:第二个维度切片640:640起止索引相同,同样选中空区域,赋值无效。
额外提一句:就算你把第一行的0:0改成有效行范围,640:150的写法也是错的,要选列150到640的区域必须写成150:640,小索引放冒号前、大索引放冒号后。
保留指定矩形、其余区域一次性涂黑的实现方法
不需要拆分4个外围矩形涂黑,逻辑非常简单,两步就能完成,出错概率远低于多块区域拼接涂黑的方案。
首先明确:NumPy格式存储的图像维度顺序为(图像高度, 图像宽度, 通道数),第一个轴对应垂直方向(行/y坐标),第二个轴对应水平方向(列/x坐标)。假设你要保留的矩形区域满足:
- 垂直方向覆盖行索引
y1到y2(注意左闭右开,y2要取保留区域最后一行的索引值+1) - 水平方向覆盖列索引
x1到x2(同理x2取保留区域最后一列的索引值+1)
直接用下面的代码就能实现需求:
import numpy as np # 生成和原图尺寸、数据类型完全一致的全黑画布(所有像素值为0) img_black = np.zeros_like(img2) # 把原图中要保留的矩形区域像素复制到全黑画布对应位置 img_black[y1:y2, x1:x2] = img2[y1:y2, x1:x2]
如果你不想生成新数组,要直接修改原img2,可以用下面的写法:
# 先备份要保留的区域像素,避免全图涂黑后数据丢失 keep_pixels = img2[y1:y2, x1:x2].copy() # 把整张图所有像素设为0(全黑) img2[:] = 0 # 把备份的保留区域像素填回对应位置 img2[y1:y2, x1:x2] = keep_pixels
内容的提问来源于stack exchange,提问作者sharkyenergy
相关产品推荐
相关产品推荐

