小白學習圖像處理1——圖像的構成和數據類型

一、數字圖像的構成

在matlab

1、首先看一張灰度圖

  下圖使用surf函數將一張隨機生成的灰度圖立體地展示了出來,可以看到越量的像素點對應的灰度值越大,灰度值在[0-255]之間波動

  實際的灰度圖就是用一個二維矩陣存儲的,每個元素代表了亮暗程度,數值越大表示越量,上圖的代碼爲:

img = round(rand(30, 30)*255);
img = kron(img, ones(20));

x = 1 : size(img, 1);
y = 1 : size(img, 2);
[X, Y] = meshgrid(x, y);
figure, surf(X, Y, img);
shading interp
colormap('gray');
set(gcf, 'color', [1 1 1])

2、再看一張彩色圖

  彩色圖片使用3個二維矩陣存儲的,每個矩陣分別代表了R、G和B三個分量的強度,對於uint8類型的圖片,RGB矩陣的每個元素取值分爲爲[0-255],不同的RGB組合可以構成2^24中顏色,使用如下代碼可以生成一張隨機的彩色圖:

img = zeros(500, 500, 3, 'uint8');
img(:, :, 1) = kron(round(255*rand(5, 5)), ones(100, 100));
img(:, :, 2) = kron(round(255*rand(5, 5)), ones(100, 100));
img(:, :, 3) = kron(round(255*rand(5, 5)), ones(100, 100));
figure, imshow(img)

第一行表示生成一個500x500x3的矩陣,用來存儲RGB三個分量,類型是uint8;2-4行表示講隨機數賦值給RGB三個分量,kron表示將每個像素點放大100倍,於是我們就可以得到隨機的彩色像素圖啦:
在這裏插入圖片描述
我們可以使用以下函數,用鼠標點擊圖像像素點後,按下Enter鍵顯示像素信息:

pixel = impixel(img)


二、圖像數據類型

1、灰度圖的構成

在數字圖像處理中,比較常用的是灰度圖,那麼灰度圖是如何生成的呢,這裏給出一個公式:
Gray=R0.299+G0.587+B0.114 Gray = R*0.299 + G*0.587 + B*0.114
可以看出綠色佔的權重很大,這主要是因爲人眼對綠色比較敏感

我們不妨使用上面的公式看看效果,注意在程序中,我們需要保證圖像是uint8類型,所以需要對公式進行四捨五入。得到的效果和使用rgb2gray函數的效果完全一樣:

img = imread('lena_color_512.tif');
R = double(img(:, :, 1));
G = double(img(:, :, 2));
B = double(img(:, :, 3));
Gray = round(R*299 + G*587 + B*114) / 1000;	% 提高計算速度
Gray = uint8(Gray);
figure, imshow(Gray)

在這裏插入圖片描述


2、uint8類型

  uint8類型的數據取值範圍爲[0-255]之間的整數,255表示白色,0表示灰色。如果要將一個double類型(取值範圍爲0-1)的圖像轉化爲uint8類型,則可以通過以下兩種方法實現:

img = uint8(img);
img = round(255 * img);

注意:由於uint8數據僅取整數值,所以需要加一個round函數四捨五入


3、double類型

  double類型的圖像像素取值範圍爲[0-1]的小數,0表示黑,1表示白,對圖像的處理通常先將圖像轉化爲double類型。

注意:matlab計算得到的圖像都是double類型的圖像,如果對一個uint8圖像處理後直接imshow(),則會發現全白的效果,此時可以先將圖像轉化爲double類型,在進行圖像處理

img = imread('xxx.tif');	%uint8
img = im2double(img);
...
imshow(img)

  此外,如果沒有先進行類型轉換,也可以使用 imshow(img, []) 來自動調整圖像範圍顯示圖像!
  注意,上面使用了 im2double() 函數,im2double函數的功能爲把unt8類型數據轉化爲double類型,相當於對圖像每個像素點的值除以255;
  如果對double類型數據進行im2double操作,則數據無任何變化!


3、logic類型

  logic類型的圖像是一種二值圖像,數據只能取0和1,0表示黑,1表示白,在matlab中可以使用以下函數將意圖圖像轉化爲二值圖像:

img = im2bw(img, threshold);

threshold表示閾值,取值範圍爲[0, 1]之間的浮點數,所以img應該是double類型圖像, 當像素點的值大於閾值則爲1,小於閾值則得到0,比如:

img = imread('lena_color_512.tif');
img = im2double(img);
img = im2bw(img, 0.6);
figure, imshow(img)

在這裏插入圖片描述


4、mat2gray()函數

mat2gray函數可以將任何一組數據歸一化到[0, 1],這裏的歸一化是值歸一化後數據最小爲0,組大爲1,注意,它和im2double不一樣,將圖像I歸一化後得到img,可以通過下面的公式實現:
img(x,y)=I(x,y)max(I)max(I)min(I) img(x, y) = \frac{I(x, y) - max(I)}{max(I)-min(I)}
當圖像整體偏黑或者整體偏亮的時候,除了均衡化,還可以試試這個函數!


完結 cheers 🍻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章