Python中保留图像指定维度像素值及反向操作的Pythonic实现
嘿,很高兴能帮你搞定这两个关于图像像素操作的问题!咱们一步步来拆解:
一、如何在Python中保留图像特定维度范围内的像素值
在Python里处理图像,我们通常会用NumPy(因为图像本质上就是多维数组)或者OpenCV这类库。所谓“保留特定维度范围的像素值”,一般分为两种场景:提取该区域作为新图像,或者保留原图像中该区域的像素,其余区域置为0,我都给你举例子:
场景1:直接提取特定区域的像素
如果只是想把目标区域切出来作为独立的图像,直接用NumPy的切片语法就搞定了,简单粗暴又高效:
import numpy as np # 假设img是你的图像数组,shape可能是(h, w)(灰度图)或(h, w, 3)(RGB图) h, w = img.shape[:2] # 定义要保留的区域:y轴从y1到y2,x轴从x1到x2 y1, y2 = 100, 300 x1, x2 = 150, 400 # 直接切片提取目标区域 cropped_img = img[y1:y2, x1:x2]
场景2:保留原图像中目标区域,其余区域置0
如果要在原图像尺寸上只保留目标区域,其余像素设为0,有两种常用的Pythonic写法:
方法1:用掩码实现(清晰直观)
# 创建和图像同形状的全0掩码 mask = np.zeros_like(img) # 将目标区域的掩码设为1 mask[y1:y2, x1:x2] = 1 # 原图像和掩码相乘,非目标区域就会被置0 result_img = img * mask
方法2:复制原图像后修改非目标区域
# 先复制原图像,避免修改原数据 result_img = img.copy() # 依次将非目标区域置0 result_img[:y1, :] = 0 # 顶部区域 result_img[y2:, :] = 0 # 底部区域 result_img[:, :x1] = 0 # 左侧区域 result_img[:, x2:] = 0 # 右侧区域
二、实现与
ang[1:int(h*.8),1:int(w*.8)]=0完全相反的操作 先明确原操作的效果:它是把图像中从第1行到h0.8行、第1列到w0.8列的矩形区域全部置为0。那相反的操作就是:只保留这个矩形区域的像素,其余所有区域置为0。
这里给你几种Pythonic的实现方式,都是利用NumPy的向量化特性,简洁又高效:
方法1:掩码法(最推荐,可读性拉满)
import numpy as np h, w = ang.shape[:2] # 创建全0掩码 mask = np.zeros_like(ang) # 把目标区域的掩码设为1 mask[1:int(h*.8), 1:int(w*.8)] = 1 # 相乘后就只保留目标区域的像素 ang_reversed = ang * mask
方法2:复制后修改非目标区域
ang_reversed = ang.copy() # 将目标区域之外的部分全部置0 ang_reversed[:1, :] = 0 # 第0行(因为原操作从第1行开始) ang_reversed[int(h*.8):, :] = 0 # 从h*0.8行到末尾的所有行 ang_reversed[:, :1] = 0 # 第0列 ang_reversed[:, int(w*.8):] = 0 # 从w*0.8列到末尾的所有列
方法3:一步切片赋值(更紧凑)
如果你喜欢更简洁的写法,也可以直接对复制后的数组进行反向切片赋值:
ang_reversed = np.zeros_like(ang) ang_reversed[1:int(h*.8), 1:int(w*.8)] = ang[1:int(h*.8), 1:int(w*.8)]
这种写法直接把原图像的目标区域复制到全0数组的对应位置,效果和上面两种完全一致,也是很Pythonic的写法。
内容的提问来源于stack exchange,提问作者Laveena
相关产品推荐
相关产品推荐

