Python 将jpg/png格式图转成mat

数据转numpy数组再转mat
博客提到数据处理流程,需先将数据转读到numpy数组(npy数据),然后再转换为mat格式,涉及信息技术领域的数据转换操作。

要先转读到numpy数组(npy数据)再转mat 。

# -*- coding: utf-8 -*-
"""
jpg2mat
"""
import glob
import os
import numpy as np
from PIL import Image
import scipy.io as io

#src_dir = '123/'
save_dir = 'npy_data/'
#file_list = glob.glob(src_dir+'*.jpg')  # get name list of all .png files    
print('Start...')
# initrialize

img = Image.open('123/223.jpg')
# save to .npy
res = np.array(img, dtype='uint16')
print('Saving data...')
if not os.path.exists(save_dir):
	os.mkdir(save_dir)
np.save(save_dir+'origin.npy', res)
print('Done.')

numpy_file = np.load('npy_data/origin.npy')

io.savemat('origin.mat',{'data':numpy_file})

 

<think> 我们正在处理的是如何将像保存为PNG格式的问题。参考引用内容,我们可以从多个角度来回答:使用不同的库和方法。 引用[1]提到了使用stb_image_write库保存PNG,引用[2]展示了使用OpenCV保存像(虽然例子是JPEG,但OpenCV同样支持PNG),引用[3]和[4]分别展示了使用MATLAB和Python(imageio库)保存PNG的方法。 因此,我们可以整理出以下方法: 1. 使用C++的stb_image_write库 2. 使用C++的OpenCV库 3. 使用MATLAB 4. 使用Python的imageio库(或OpenCV、PIL等) 由于用户没有指定编程语言,我们将提供几种常见语言的方法。 注意:引用[3]中还涉及到了16位PNG的保存,我们也可以提及。 步骤: 1. 介绍每种方法的基本步骤和代码示例 2. 注意代码的正确性和可读性 3. 根据引用标注来源 另外,引用[4]中提到了从nii格式转换为PNG,但用户的需求是“将像保存成png格式”,所以我们主要关注保存为PNG,而不限定源格式(假设已经有了像数据)。 我们将按照以下结构回答: - 使用C++和stb_image_write库 - 使用C++和OpenCV库 - 使用MATLAB - 使用Python(多种库) 每个部分给出简单示例。 </think> 以下是将像保存为PNG格式的四种实用方法,覆盖主流编程语言和工具: ### 一、C++实现方案 #### 1. 使用stb_image_write库(轻量级) ```cpp #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" int main() { int width = 800, height = 600, channels = 3; unsigned char* image_data = new unsigned char[width*height*channels]; // 填充像数据(示例) for(int y=0; y<height; y++) for(int x=0; x<width; x++) image_data[(y*width+x)*channels] = x%256; // 渐变灰度 // 保存PNG(无损压缩) stbi_write_png("output.png", width, height, channels, image_data, width*channels); delete[] image_data; } ``` > ✓ 单头文件无依赖 ✓ 支持16位深度[^3] ✓ 跨平台 #### 2. 使用OpenCV库(功能全面) ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("input.jpg"); if(!image.empty()) { // 设置PNG压缩参数(0-无损,9-最高压缩) std::vector<int> params {cv::IMWRITE_PNG_COMPRESSION, 5}; cv::imwrite("output.png", image, params); } } ``` > ✓ 支持透明度通道(Alpha) ✓ 自动处理颜色空间转换 ### 二、Python实现方案 #### 1. 使用OpenCV-Python ```python import cv2 img = cv2.imread('input.jpg') # 保存RGBA带透明通道的PNG cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 8]) ``` #### 2. 使用imageio库(支持医学像) ```python import imageio import numpy as np # 从NIfTI医学像转换[^4] nii_data = np.load('scan.nii') for slice_idx in range(nii_data.shape[2]): slice_img = nii_data[:, :, slice_idx] imageio.imwrite(f'slice_{slice_idx}.png', slice_img) ``` #### 3. 保存16位深度像 ```python from PIL import Image import numpy as np # 创建16位灰度像 data = np.random.randint(0, 65535, (1024,1024), dtype=np.uint16) Image.fromarray(data).save('16bit_depth.png') ``` > ✓ 适合医学/科学像 ✓ 保留高动态范围数据[^3] ### 三、MATLAB实现方案 ```matlab % 读取TIFF并转为16位PNG tif_img = imread('input.tif'); uint16_img = uint16(tif_img); imwrite(uint16_img, '16bit_output.png'); ``` > ✓ 一键转换位深度 ✓ 内置色彩管理 --- ### **关键参数对比表** | 参数 | 作用描述 | 典型值范围 | |---------------------|----------------------------|--------------| | 压缩级别(IMWRITE_PNG_COMPRESSION) | 平衡文件大小与编码速度 | 0(最快)-9(最小) | | 位深度 | 控制色彩精度 | 8位/16位 | | 色彩模式 | 决定是否支持透明度 | RGB/RGBA | --- ### **保存注意事项** 1. **透明度处理**:RGBA模式需确保$\alpha$通道数据正确,否则透明区域显示异常 2. **位深度转换**:16位像保存公式: $$I_{16bit} = \left\lfloor \frac{I_{float} \times 65535}{max} \right\rfloor$$ 3. **色彩空间**:PNG默认为sRGB色彩空间,专业摄影建议嵌入ICC配置文件 4. **元数据保留**:使用ExifTool等工具可保存EXIF信息 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值