Python数字图像处理:像素访问与裁剪实战
本文详解Python中如何访问和修改图像像素。通过skimage库读取图片为NumPy数组,讲解彩色与灰度图的索引方式,演示随机添加椒盐噪声、图像裁剪、二值化及通道判断等具体操作,帮助开发者掌握基础像素级处理技巧。
引言
将图片加载至程序后,其数据以NumPy数组形式存储。因此,针对NumPy数组的所有功能同样适用于图像数据。访问数组元素即等同于访问图像的像素点。
对于彩色图像,其访问语法如下:
img[i,j,c]
其中,i代表图像的行索引,j代表列索引,c代表通道索引(分别对应0、1、2,对应RGB三通道)。坐标原点位于图像左上角。
对于灰度图像,访问方式更为简化:
gray[i,j]
示例1:获取小猫图像G通道第20行、第30列的像素值
from skimage import io,data
img=data.chelsea()
pixel=img[20,30,1]
print(pixel)输出结果为129
示例2:显示红色单通道图像
from skimage import io,data
img=data.chelsea()
R=img[:,:,0]
io.imshow(R)
除了读取像素,还可以直接修改像素值。
示例3:向小猫图像随机添加椒盐噪声
from skimage import io,data
import numpy as np
img=data.chelsea()
#随机生成5000个椒盐
rows,cols,dims=img.shape
for i in range(5000):
x=np.random.randint(0,rows)
y=np.random.randint(0,cols)
img[x,y,:]=255
io.imshow(img)
此处利用NumPy库中的random模块生成随机数。randint(0,cols)用于生成0到cols范围内的随机整数。
通过语句img[x,y,:]=255修改像素值,将原有的三通道像素值统一设置为255。
利用数组切片功能,即可实现图像的裁剪操作。
示例4:对小猫图像进行裁剪
from skimage import io,data
img=data.chelsea()
roi=img[80:180,100:200,:]
io.imshow(roi)
对多个像素点进行操作时,可采用数组切片方式访问。切片方式返回的是按指定间隔下标访问的数组像素值。以下是关于灰度图像的一些示例:
img[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行
img[:,i] = 100 # 将第 i 列的所有数值设为 100
img[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和
img[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
img[i].mean() # 第 i 行所有数值的平均值
img[:,-1] # 最后一列
img[-2,:] (or im[-2]) # 倒数第二行最后,再展示两个关于像素值访问与修改的示例:
示例5:对Lena图像进行二值化处理
像素值大于128的设为1,否则设为0。
from skimage import io,data,color
img=data.lena()
img_gray=color.rgb2gray(img)
rows,cols=img_gray.shape
for i in range(rows):
for j in range(cols):
if (img_gray[i,j]<=0.5):
img_gray[i,j]=0
else:
img_gray[i,j]=1
io.imshow(img_gray)
本例使用了color模块的rgb2gray()函数,将彩色三通道图像转换为灰度图。转换后的结果是一个float64类型的数组,数值范围在[0,1]之间。
示例6:判断R通道所有像素值
from skimage import io,data
img=data.chelsea()
reddish = img[:, :, 0] >170
img[reddish] = [0, 255, 0]
io.imshow(img)
该示例首先判断R通道的所有像素值,若大于170,则将该位置像素值修改为[0,255,0],即G通道值为255,R和B通道值为0。
以上为Python数字图像处理中像素访问与裁剪的详细内容,更多关于Python数字图像处理像素访问裁剪的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









