matlab對tif檔案的相關操作

2021-10-02 05:07:17 字數 2567 閱讀 8297

前言:

本片部落格記錄了使用matlab讀取tif檔案的畫素陣列、標籤資訊,以及寫tif檔案。

問題前瞻:

無法對已有的tif檔案重新讀取和寫操作

寫操作成功,但顯示跟原tif檔案不一樣,有時出現全黑的

**如下:

clear all;

% 讀取tif檔案標籤資訊,為下面tag設定做參考

% info = imfinfo('1.tif');

% 或者

t0 = tiff('1.tif','r');

tags = ["imagelength","imagewidth","sampleformat","bitspersample",...

"samplesperpixel","photometric","rowsperstrip","planarconfiguration"];

for i = 1:length(tags)

tag = gettag(t0, tags(i));

ta**alue(1,i) = tags(i);

ta**alue(2,i) = tag;

end%t0img = read(t0); % bitspersample 為12位!!!!

% 待儲存的影象陣列,可以為任意二維陣列,就以 1.tif 為例

data = imread('1.tif');

min1 = min(min(data));

max1 = max(max(data));

%data = data * 16;

data = uint16(data);

min2 = min(min(data));

max2 = max(max(data));

% imshow(data,) % 加使適應灰度值的顯示

% 生成乙個tif物件,為寫入資料做準備

mytif = 'demo.tif';

t = tiff(mytif,'w');

% 設定tif標籤資訊

tagstruct.imagelength = size(data,1); % 長度

tagstruct.imagewidth = size(data,2); % 寬度

tagstruct.sampleformat = 1; % 對資料型別的解釋(1-4)

tagstruct.bitspersample = 16; % 畫素數值位數,single為單精度,32位系統為32.!!!!=12

tagstruct.samplesperpixel = 1; % 畫素波段個數,一般為1或3(rgb),遙感影象常大於3

tagstruct.photometric = 1; % 顏色空間解釋方式:最小值表示黑色

tagstruct.rowsperstrip = 12; %

tagstruct.planarconfiguration = 1; %

tagstruct.software = 'matlab'; %生成的軟體

% 將上述tag資訊寫入

t.settag(tagstruct)

% 開始寫資料

t.write(data);

% 關閉

t.close;

% 檢驗矩陣是否相同,顯示是否正常

img = imread('demo.tif');

imshow(img)

isequal(img,data)

問題解決:

1. 無法對tif影象進行讀操作

tif原始檔bitspersample屬性為12位,無法使用matlab中的tiff直接讀取!這也是下面顯示為全黑的乙個原因。

2. 讀寫成功後的檔案,用電腦檢視顯示為幾乎全黑

以上述為例,待儲存的影象灰度值陣列範圍為 0 ~ 4095,這個數字正好是上述12位能夠儲存的資料範圍,即0 ~ 2^12 -1。但上面寫tif檔案時,設定bitspersample為16位(讀寫tif時都不能為12位,所以用imread讀資料,用16位寫tif),也就是說能夠儲存的灰度資料範圍為0~2^16-1。

顯示為幾乎全黑的原因就來了,儲存成功後,當用電腦自帶的瀏覽器檢視時,瀏覽器檢測到bitspersample為16位,所以就以 0~ 2^16-1 的灰階顯示,但實際上,的灰度值範圍只為 0~ 2^12-1。正常情況下,如果以0~ 2^12 -1灰階範圍來顯示,最暗為0,最亮為2^12-1,此時為正常,但如果以0~ 2^16-1灰階來顯示資料量為2 ^12 -1的灰度值影象時,同樣最暗為0,但此時2^12-1灰度值的畫素此時就不是最亮的了,而是最亮的1/16左右,因此會顯示為灰色,最大灰度值顯示尚且如此,那麼整張圖可不就顯示為幾乎全黑了嗎。

如果把原始的待儲存的影象灰度值陣列data*16,也就是使陣列灰度值範圍等比擴大到 致0~2^16-1範圍,最後就會發現,寫tif後顯示的跟原幾乎一樣。

btw,imshow()函式中,加入的意思就是以畫素灰度值 min~max的範圍顯示。

python中利用GDAL對tif檔案進行讀寫

利用gdal庫對tif影像進行讀取 示例 預設波段為 b g r nir的順序,且為四個波段 import gdal defreadtif filename dataset gdal.open filename ifdataset none print filename 檔案無法開啟 return ...

MATLAB的相關操作

matlab中txt檔案的相關操作 a cellfun isempty,a 這個操作將圖1所示的cell轉變為圖2所示的cell。返回值若為1,則兩cell相同 返回值若為1,則兩cell不同 fid fopen file path 把file path的txt檔案開啟 tline fgetl fi...

Matlab學習1 1 對於檔案的操作

一,對檔案的基本操作 1.edit 新建乙個.m檔案 2.如何使檔案中幾行 單獨執行?選中語句按f9,或者右鍵 執行所選內容 3.發布功能 用於將文字轉化成doc或者其他格式的檔案。4.執行節 每個節之間利用 進行分割,可以單獨執行一下節。二,讀取和寫入檔案 excel專題 1.讀取excel檔案 ...