1. 程式人生 > >matlab ( octave ) imshow顯示影象詳解

matlab ( octave ) imshow顯示影象詳解

最近在用octave (類似於matlab的計算軟體, 函式和matlab一致) 寫程式的時候, 在顯示影象和儲存影象的時候遇到了一些小問題, 所以簡單的總結了一下。

本文用的影象為灰度影象:


imread() 返回的影象型別是uint8型別, 這時用imshow顯示影象的時候, imshow會認為輸入矩陣的範圍在0-255, 如果imshow的引數為double型別的,那麼imshow認為輸入矩陣的值為0-1.

很多時候需要將影象轉換為double型別的, 但是轉換以後直接使用imshow顯示的是一片白色, 是因為當imshow顯示影象的時候, 會認為double型別的影象矩陣的範圍在0-1, 超過1的畫素值當作1處理, 這樣就是幾乎所有的畫素都是白色。

情況1:

% img will be uint8 type
img = imread('syz.bmp');


% imshow: when the parameter img is uint8 type, 
% imshow will default make the range of pixel value as [0-255]
imshow(img);
fprintf('Program paused. Press enter to continue.\n');
pause;

這個時候直接顯示讀入的影象是正確的, 因為這個時候影象的型別是uint8

顯示結果:


情況2:

當把影象轉換double資料型別後:

% sometimes we need to process the img by double type,
% so, you may convert the data type to double
dimg = double(img);

% but, right now you will not get the correct display,
% because if the parameter of imshow is double type, if will defaultly 
% take range of [0-1], but now the range is [0-255]
% all the value over 1 is ceilled to 1. (clamped to 1)
% so, the displayed image will be a whole white picture.
imshow(dimg);
fprintf('Program paused. Press enter to continue.\n');
pause;

這個時候, 因為imshow的引數為double型別, imshow認為引數的值為0-1, 但是實際還是0-255, 這樣超過1的值被認為是1, 顯示幾乎全是白色


情況3: 如何正確的顯示 double 型別的影象呢, 有兩種方式

% how to correctly display double typed image
% way 1: convert double to uint8
imshow(uint8(dimg));
fprintf('Program paused. Press enter to continue.\n');
pause;

% way 2: change the value of double typed image to [0-1]
maxVal = max(max(dimg));
imshow(dimg / maxVal);
fprintf('Program paused. Press enter to continue.\n');
pause;

方式1 將影象轉換為uint8型別, 方式2將影象畫素值歸約到0-1之間

顯示結果:



這兩個顯示結果是一樣的。

情況4: 有些時候,影象經過處理以後會存在值為負數的畫素, 如何顯示呢?

這需要將所有的負數處理掉, 可以將所有的畫素減去這個影象的最小的畫素值, 最小的畫素值為負數, 那麼影象的畫素值就都為正數了。

%% some other occurence, the image maybe in double type, 
% but some normalization operation will lead to negative pixel value
% In order to display the image, we need to add a value that make
% all negative value to positive value

% here i just minus a specific value, in real application,
% a face image maybe normalized by substract mean face.
normImg = dimg - 127; % then normImg will have some negative values

minVal = min(min(normImg));
imshow(uint8(normImg - minVal));
fprintf('Program paused. Press enter to continue.\n');
pause;

顯示結果:


下面是整個示例程式碼:

%% this file is used to show how to use imshow or imagesc and so on
% there is some different when you use imshow to display double image or uint8 image
% here all the code will process gray image, RGB color image will not suitable for this file's code
% but you can convert RGB color image to gray image if you want to exercise by this code

% img will be uint8 type
img = imread('syz.bmp');


% imshow: when the parameter img is uint8 type, 
% imshow will default make the range of pixel value as [0-255]
imshow(img);
fprintf('Program paused. Press enter to continue.\n');
pause;

% sometimes we need to process the img by double type,
% so, you may convert the data type to double
dimg = double(img);

% but, right now you will not get the correct display,
% because if the parameter of imshow is double type, if will defaultly 
% take range of [0-1], but now the range is [0-255]
% all the value over 1 is ceilled to 1. (clamped to 1)
% so, the displayed image will be a whole white picture.
imshow(dimg);
fprintf('Program paused. Press enter to continue.\n');
pause;

% how to correctly display double typed image
% way 1: convert double to uint8
imshow(uint8(dimg));
fprintf('Program paused. Press enter to continue.\n');
pause;

% way 2: change the value of double typed image to [0-1]
maxVal = max(max(dimg));
imshow(dimg / maxVal);
fprintf('Program paused. Press enter to continue.\n');
pause;

%% some other occurence, the image maybe in double type, 
% but some normalization operation will lead to negative pixel value
% In order to display the image, we need to add a value that make
% all negative value to positive value

% here i just minus a specific value, in real application,
% a face image maybe normalized by substract mean face.
normImg = dimg - 127; % then normImg will have some negative values

minVal = min(min(normImg));
imshow(uint8(normImg - minVal));
fprintf('Program paused. Press enter to continue.\n');
pause;


%% if you want to save image by imwrite()
% if the image is double type, you need to normalize the value to [0-1]
% if the image is uint8 type, it's ok to save image directly.


相關推薦

matlab ( octave ) imshow顯示影象

最近在用octave (類似於matlab的計算軟體, 函式和matlab一致) 寫程式的時候, 在顯示影象和儲存影象的時候遇到了一些小問題, 所以簡單的總結了一下。 本文用的影象為灰度影象: imread() 返回的影象型別是uint8型別, 這時用imshow顯示

matlab ( octave ) imwrite 儲存影象

剛剛寫了imshow, 想了想發現imwrite和imshow是完全一致的, 所以根據上篇文章簡單寫寫imwrite用法。 採用影象: imwrite() 中, 如果引數為uint8型別, 那麼期待的引數畫素值範圍為0-255, 如果引數矩陣為double型別, 那

MATLAB中用imshow()顯示影象影象的資料型別的關係

     文章出處:http://www.ilovematlab.cn/thread-100044-1-1.html      (此為本人從CSDN上轉載,因前半部分解決了偶的問題,故覺得有些價值,特此奉上。)        在matlab中,我們常使用imshow()

matlab中用imshow()顯示影象影象矩陣的資料型別的關係

       在matlab中,我們常使用imshow()函式來顯示影象,而此時的影象矩陣可能經過了某種運算。在matlab中,為了保證精度,經過了運算的影象矩陣I其資料型別會從unit8型變成double型。如果直接執行imshow(I),我們會發現顯示的是一個白色的影象。

matlab imshow顯示影象

轉載自 在matlab中,我們常使用imshow()函式來顯示影象,而此時的影象矩陣可能經過了某種運算。在matlab中,為了保證精度,經過了運算的影象矩陣A其資料型別會從unit8型變成double型。如果直接執行imshow(A),我們會發現顯示的是一個白

matlab中用imshow()顯示double型別影象中出現的問題

在matlab中,我們常使用imshow()函式來顯示影象,而此時的影象矩陣可能經過了某種運算。在matlab中,為了保證精度,經過了運算的影象矩陣I其資料型別會從unit8型變成double型。如果

matlab的pdist函數

var object 技術分享 馬氏距離 歐幾裏得 ref 一個 計算 rman Pairwise distance between pairs of object(Pdist函數用於各種距離的生成) 語法: D=pdist(x) D=pdist(x,distance) 解

Matlab中的stretchlim函式

imadjust函式是MATLAB的一個工具箱函式,一般的語法呼叫格式為: f1=imadjust(f,[low_in  high_in],[low_out  high_out],gamma) (注:本文所述影象資料均為Uint8,對於Matlab,矩陣中的一個元素即是一

【linux】linux命令:fdisk -l 顯示資訊

目錄 一、fdisk -l  二、磁碟計算公式 三、參考博文 一、fdisk -l  fdisk -l (1)Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors

一個簡單的BP神經網路matlab程式(附函式

說明:20180604更新2、本人對其中涉及到的函式進行了詳細說明。3、此程式中部分函式的使用方式是高版本Matlab中不推薦的文中給出了當前高版本Matlab中的使用方式,並給出了相關部落格地址,具體如下:4、使用過程中,可能出現的問題5、所需的IRIS資料集具體程式如下:

Matlab】優化工具箱使用

一直知道Matlab的優化工具箱,可是一直都沒有學習,Matlab提供的功能主要有線性規劃、非線性規劃、極值問題等,這些也是比較常見的優化問題。 優化工具箱概述 1.MATLAB求解優化問題的主要函式 2.優化函式的輸入變數 使用優化函式或優化工具箱中其它優

Matlab讀取和顯示影象

Matlab影象讀取: f=imread(‘imgName.extend’) imgName——影象名 extend———影象格式字尾名 如何檢視f對應引數: whos f; 影象顯示: imshow(f);——–預設灰度級數256 imshow

Matlab mex 命令列引數

 MATLAB Application Program Interface   Go to function:  The mex Script Compiles a MEX-function from C or Fortran source code MEX

MATLABimshow()顯示問題

MATLAB中imread(img),讀取儲存的資料是unit8型別的,如果需要運算,最好轉換成double型,直接im2double(img)就可以,然後這樣處理的資料全是[0,1]之間的。 當然i

matlab中的unique函式

C = unique(A):返回的是和A中一樣的值,但是沒有重複元素。產生的結果向量按升序排序。 示例: 1.篩除向量中的重複值,產生的結果按升序排列 Define a vector with a repeated value. A = [9 2 9

matlab影象操作函式的(筆記1)

matlab對影象操作函式的詳解 一. 讀寫影象檔案 1. imread imread函式用於讀入各種影象檔案,如:a=imread('e:\w01.tif') 注:計算機E盤上要有w01相應的.tif檔案。 2. imwrite imwrite函式用於寫入影象檔案,如:im

影象處理函式——padarray(matlab)

轉自殘雪飛月 功能:填充影象或填充陣列。 用法:B = padarray(A,padsize,padval,direction)        A為輸入影象,B為填充後的影象,padsize給出了給出了填充的行數和列數,通常用[r c]來表示。padval和directio

MATLABimshow()函式處理影象時出現全白顯示的原因

1、uint8(無符8位)與double     double函式只是將讀入影象的uint8資料轉換為double型別,一般不使用;常用的是im2double函式,將uint8影象轉為double型別,範圍為0-1,如果是255的影象,那麼255轉為1,0還是0,中間的做相

Matlab-影象直方圖函式imhist

利用matlab計算影象直方圖函式為imhist() 具體用法: imhist( i );直接顯示影象i的灰度直方圖; imhist(i,n)n為指定灰度級顯示直方圖; [count, x] =

數字影象處理MATLAB函式

函式詳解——padarray(matlab)padarray功能:填充影象或填充陣列。padarray用法:B = padarray(A,padsize,padval,direction)       A為輸入影象,B為填充後的影象,padsize給出了給出了填充的行數和列數