程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

RAW圖像詳解及使用Python讀取raw格式圖像並顯示

編輯:Python

一、RAW圖像詳解

1.1 什麼是raw格式圖像?

RAW在英文中的解釋是未處理的、自然狀態的,這也就是RAW文件的真谛。RAW圖像就是CMOS或者CCD圖像感應器將捕捉到
的光源信號轉化為數字信號的原始數據,因此RAW文件也被人們稱之為“數碼底片”。RAW格式的全稱是RAW Image Format,記
錄了由相機拍攝所產生的一些元數據,如ISO的設置、快門速度、光圈值、白平衡等信息。

1.2 RAW格式與JPG格式有什麼差別?

如果一句話概括,那就是JPG格式實際上就是由RAW格式處理而來的。RAW格式記錄的是拍攝現場的原始數據,然後經過相機自身進行白平衡、銳化、飽和度、色彩等等處理之後,再進行封裝,就成為了JPG格式的照片。

1.3 那麼RAW和JPG格式到底有什麼比較大的區別呢?

實際上,JPG格式所顯示的是照片,也可以說是最終的成片,而RAW是從影像傳感器中得到的最原始的信息數據包,而非圖像。

RAW我們通常用色彩深度來表示,色彩深度的單位是bit,一般的JPG照片色彩深度為8bit,這意味著RGB這三種顏色,每個顏色有256個等級,組合起來可以產生總共256256256即約1677萬種不同的顏色。

關於位深可以參考我的另一篇博客:8位, 16位,24位,32位圖片顯示原理及對比、讀自己的mask、判斷是否為灰度圖

一般的RAW格式照片,目前的主流水平是12bit和14bit,比如一些全畫幅機身能夠達到14bit的水准。另外一些高端的中畫幅相機能夠支持16bit RAW格式文件。色彩深度高了,攜帶的信息也就更加豐富,但是體積也就增加了,不過這個數值仍然是越大越好。

二、使用Python讀取raw格式圖像並顯示

首先確定我們的raw圖像是多少位的,我們的是16bit

實現只需兩個基本庫,能夠實現16位圖片的無損轉換,轉換裁切保存之後的圖片位深依然為16bit,方便以後處理。

  • 一律使用np.fromfile讀取之後再轉化為.png或者.tff格式,讀取的時候直接傳入文件路徑,不用加'r'

2.1 輸出為png圖像顯示

import os.path
import os
from PIL import Image
import numpy as np
import cv2
import imageio
def read(input_dir, shape, save_dir):
if not os.path.exists(save_dir):
os.makedirs(save_dir)
# img = cv2.imread('D:\Installer\\h_1_3_00_2_4_0_0_5_30_01_0_00.raw')
# type = img.dtype
w, h, c = shape
input_dir = os.path.join('D:\\JS17\rawData\\', input_dir)
list = os.listdir(input_dir)
for path in list:
if path.endswith('.xml'):
continue
### 直接傳入文件路徑,不用加'r'
imgData = np.fromfile(input_dir + '\\' + path, dtype='uint16') ### 這裡是16bit所以要uint16
w, h, c = 5120, 4096, 1
# # imgData = np.fromfile(r'D:\Installer\\h_1_1_0_2_0_4_1_5_38_63_0.raw', dtype='uint16') # SAR
# # w, h, c = 2048, 2048, 1
imgData = imgData.reshape(w, h, c)
cv2.imwrite(save_dir + path.split('.')[0] + '.png', imgData)
if __name__ == '__main__':
#### 傳入raw文件夾;圖像的w, h, c;圖像的保存路徑
read('SAR', [2048, 2048, 1], 'D:\\JS17\TIFData\SAR\\')
read('中波紅外', [1024, 1280, 1], 'D:\\JS17\TIFData\MiddleHW\\')
read('可見光', [4096,5120, 1], 'D:\\JS17\TIFData\KJG\\')

2.2 輸出為tif圖像顯示

import imageio
import numpy as np
raw=np.memmap('140-200-1000(2).raw',dtype=np.uint16,shape=(4288,3524))#讀取16位raw圖片
imageio.imsave('raw.tif',raw)#轉換格式與保存
### 上面兩行其實就已經讀取並且轉換完成了,已經可以顯示了
### 下面是做裁剪的,僅供參考
tif=np.memmap('raw.tif',dtype=np.uint16,shape=(4288,3524))#讀取16位tif圖片
resize=tif[1200:1700,1200:1700]
imageio.imsave('resize.tif',resize)#對16位tif圖片裁切

參考:關於RAW格式照片 你不可不知的十件事
使用Python讀取raw格式圖像並顯示
[史上最全]16bit RAW圖片讀取、轉換、裁切、保存


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved