读取raw文件,并将像素值写入到csv文件中

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第35天,点击查看活动详情

为了保证处理时的精度更高,0-255个灰度级无法满足处理要求,但图像又是灰度图,没有办法,因此可以利用硬件优势,将图像保存为16位,这样灰度级就由0-255变为了0-4095,随着灰度级的增多,处理的精度也得到了提升。

raw文件作为相机的底片,未加任何的处理,因此可塑性更好,可以在该格式文件的基础上进行更多的图像处理方式以达到最佳的处理效果,虽然raw文件在保存时保留了一些对比度的信息,但是对后期的处理没有影响,算是最干净的图像信息,但是带来的问题是该类型的文件较大,以本人使用的灰度相机为例,1920x1200的图像大小为4.39M,足足有4,608,000 字节,tiff格式图像有4.40M,是4,617,746 字节,相比看来raw原始图像竟然比tiff格式还小了一些,其实tiff格式的图像相比于原始图像是做了处理的,被称为无损压缩格式,在惊醒曝光调整时,raw是无损的而tiff是有损的。

上面说了这么多,下面直接上代码

import numpy as np
import csv


# 根据对采集图像的大小,预先指定原图像大小的宽高以及通道数,通道数为1表示处理灰度图
rows = 1920
cols = 1200
channels = 1
# 读取图片时dtype表示图像格式,图象是8位就写uint8,我的是16位就写unit16
# uint8的像素灰度值范围是0-255,uint16的像素灰度值范围是0-4095
img = np.fromfile("./Image__2022-06-28__16-44-47.raw", dtype='uint16')
img = img.reshape(rows, cols, channels)


# 写入到csv文件中
with open("file.csv", "w", encoding="gbk", newline="") as f:
    # 构建写入的对象
    csv_writer = csv.writer(f)
    # 写入时按照图像在屏幕中的显示方向进行写入,行和列不能写反
    for i in range(cols):
        csv_writer.writerow(img[:, i])
    print("数据保存完毕")
    f.close()

上述代码中没有通过opencv进行图像显示,需要显示时自己加入这一部分代码即可,需要注意的是显示时需要将uint16转换为uint8进行,否则可能会报错。

上述代码中处理的图片好像浏览器显示不出来

写入到csv文件中的值是这个样子的

image.png

image.png

image.png

image.png

写入到csv文件中文件直接大了几倍,数据量还是挺大的,直接对于raw的处理相随来说还是更节省时间一点,写入到csv文件的目的主要是为了查看像素的灰度等级。

猜你喜欢

转载自juejin.im/post/7114465805663731748