python逐像素遍历
时间: 2025-05-29 15:20:40 浏览: 12
### Python 使用 PIL 和 NumPy 遍历图像的像素
在 Python 中,PIL (Pillow) 是处理图像的一个强大库。通过 Pillow 库读取图像并结合 NumPy 数组操作,可以高效地逐像素遍历图像。
以下是基于 PIL 和 NumPy 的示例代码:
#### 示例代码
```python
from PIL import Image
import numpy as np
# 打开图像文件
image = Image.open("example.png")
# 将图像转换为NumPy数组以便于计算
np_image = np.array(image)
# 获取图像尺寸
height, width, _ = np_image.shape
# 逐像素访问图像数据
for y in range(height):
for x in range(width):
pixel_value = image.getpixel((x, y)) # 使用getpixel方法获取单个像素值
print(f"Pixel at ({x}, {y}): {pixel_value}")
# 如果需要修改像素值并将结果保存到新图像中
new_image = Image.new(image.mode, image.size)
pixels = new_image.load()
for y in range(height):
for x in range(width):
pixels[x, y] = tuple(np_image[y][x]) # 设置新的像素值
# 保存修改后的图像
new_image.save("output.png")
```
上述代码展示了如何使用 `Image.getpixel()` 方法来逐像素访问原始图像的数据,并演示了如何创建一个新的图像对象并通过其 `.load()` 方法设置每个像素的新值[^1]。
如果希望进一步优化性能,可以直接利用 NumPy 对整个数组的操作代替嵌套循环。例如,对于简单的颜色变换操作,无需显式迭代每一个像素点。
---
#### 结合双线性插值进行图像缩放
当涉及到更复杂的场景比如图像缩放时,可以通过获取周围四个邻近像素的颜色值来进行双线性插值运算。下面是一个简化版的例子展示如何实现这一过程:
```python
def bilinear_interpolation(x, y, image):
"""
双线性插值函数
:param x: 插值目标位置横坐标
:param y: 插值目标位置纵坐标
:param image: 输入图像(PIL.Image对象)
:return: 计算得到的目标像素RGB值
"""
x_floor = int(np.floor(x))
y_floor = int(np.floor(y))
dx = x - x_floor
dy = y - y_floor
p1 = np.array(image.getpixel((x_floor, y_floor)))
p2 = np.array(image.getpixel((x_floor + 1, y_floor)))
p3 = np.array(image.getpixel((x_floor, y_floor + 1)))
p4 = np.array(image.getpixel((x_floor + 1, y_floor + 1)))
inter_y1 = (1-dx)*p1 + dx*p2
inter_y2 = (1-dx)*p3 + dx*p4
final_pixel = (1-dy)*inter_y1 + dy*inter_y2
return tuple(final_pixel.astype(int))
# 测试调用
resized_width = 800
resized_height = 600
new_image = Image.new('RGB', (resized_width, resized_height))
for i in range(resized_width):
for j in range(resized_height):
original_x = i * image.width / resized_width
original_y = j * image.height / resized_height
interpolated_color = bilinear_interpolation(original_x, original_y, image)
new_image.putpixel((i,j), interpolated_color)
new_image.show()
```
该部分实现了基本的双线性插值逻辑用于调整大小后的图像重建。
---
#### GDAL 处理大图逐行扫描方式
除了 PIL/Numpy 组合外,在面对超大规模遥感影像或其他大型栅格数据集的情况下,GDAL 提供了一种高效的分块或按行加载机制以减少内存占用。以下是从 PNG 文件逐行读入数据片段的小例子:
```python
from osgeo import gdal
dataset = gdal.Open("large_image.png", gdal.GA_ReadOnly)
band = dataset.GetRasterBand(1)
rows = band.YSize
cols = band.XSize
for row in range(rows):
scanline = band.ReadAsArray(0, row, cols, 1)[0]
print(scanline[:5])
del dataset
```
这里我们仅提取每行前五个样本打印出来验证效果[^2]。
---
阅读全文
相关推荐

















