把他们整合成一套能直接用的代码
时间: 2024-09-29 07:15:17 浏览: 24
当然,这里是一个基本的流程,将上述各个步骤整合成可以直接使用的Python代码。请注意,为了实际运行,需要安装`numpy`, `zlib`, 和 `torch`(如果用于GPU)。另外,因为GPU操作通常涉及到深度学习框架,这里假设你已经熟悉了PyTorch环境。
```python
import numpy as np
import os
import zlib
import struct
import torch
from PIL import Image
class ImageCompressor:
def __init__(self, img_path, block_size=8, save_path='compressed.bin'):
self.img_path = img_path
self.block_size = block_size
self.save_path = save_path
def load_image(self):
img = Image.open(self.img_path)
width, height = img.size
pixels = np.array(list(img.getdata()), dtype=np.uint8) # RGB转换为numpy数组
return pixels, width, height
def convert_to_3d(self, pixels):
return pixels.reshape(height, width, 3)
def divide_and_compress(self, img_3d):
blocks = self.divide_img_into_blocks(img_3d)
compressed_blocks = [self.compress_block(block) for block in blocks]
return compressed_blocks
def divide_img_into_blocks(self, img_3d):
block_height, block_width = self.block_size, self.block_size
blocks = [(i, j, img_3d[i:i+block_height, j:j+block_width]) for i in range(0, img_3d.shape[0], block_height) \
for j in range(0, img_3d.shape[1], block_width)]
return blocks
def compress_block(self, block_data):
compressed_data = zlib.compress(np.array(block_data, dtype=np.uint8).tobytes())
return compressed_data, block_data.shape
def write_to_file(self, compressed_blocks):
with open(self.save_path, 'wb') as f:
for block_data, shape in compressed_blocks:
f.write(struct.pack('<ii', *shape)) # 序列化形状信息
f.write(zlib.decompress(block_data))
def move_to_gpu(self, device):
if not torch.cuda.is_available():
print("No CUDA device available.")
return
compressed_blocks = [(torch.tensor(compressed_data, device=device), shape) for compressed_data, shape in compressed_blocks]
return compressed_blocks
def run_on_gpu(self, device):
self.move_to_gpu(device)
# 这里只是一个示例,实际GPU操作可能会更复杂,比如将压缩数据映射到内存,然后执行特定的GPU算法
# 您可以创建一个自定义的GPU运算函数,比如卷积、矩阵乘法等
for _, _ in self.compressed_blocks:
pass # 替换为您的GPU运算
# 使用示例
compressor = ImageCompressor('input.bmp')
pixels, width, height = compressor.load_image()
img_3d = compressor.convert_to_3d(pixels)
compressed_blocks = compressor.divide_and_compress(img_3d)
compressor.write_to_file(compressed_blocks)
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
compressed_blocks_gpu = compressor.run_on_gpu(device)
```