图像梯度
圖像梯度
1.圖像的表達
這里我們討論2D圖像,一般圖像的存儲格式是一個二維矩陣,每個位置對應圖像的像素值,用數學描述
[z = I(x,y)
]
(x,y) 代表圖像坐標(某個點的坐標),(z) 代表此點的像素值(強度值),所以圖像可以看作一個二元的函數(離散的),將圖像在三維坐標中畫出來,如下圖所示,強度值的高低代表了曲面的高低。
http://www.cse.psu.edu/~rtc12/CSE486/lecture02.pdf
2. 圖像的梯度
既然可以將圖像看作是一個二元函數,那么自然想到考慮二元函數的梯度(一元函數是導數),因為圖像是離散的,所以和一般的連續函數還有些不同。離散的話,就要考慮數值方法求梯度。
2.1 數值微分
根據泰勒級數展開式
[f(x+h) = f(x)+hf'(x)+frac{1}{2}h^2f''(x)+frac{1}{3!}h^3f'''(x)+O(h^4)
]
[f(x+h)-f(x)=hf'(x)+frac{1}{2}h^2f''(x)+O(h^3)
]
[frac{f(x+h)-f(x)}{h}=f'(x)+O(h)
]
這就是有限向前差分,在圖像中,例如在x方向,對應的值就是(f(x+1,y)-f(x,y))
根據泰勒級數展開式
[f(x-h) = f(x)-hf'(x)+frac{1}{2}h^2f''(x)-frac{1}{3!}h^3f'''(x)+O(h^4)
]
[f(x)-f(x-h)=hf'(x)-frac{1}{2}h^2f''(x)+O(h^3)
]
[frac{f(x)-f(x-h)}{h}=f'(x)+O(h)
]
這就是有限向后差分,在圖像中,例如在x方向,對應的值就是(f(x,y)-f(x-1,y))
根據泰勒級數展開式
[f(x+h)-f(x-h) = f(x)+hf'(x)+frac{1}{2}h^2f''(x)+frac{1}{3!}h^3f'''(x)+O(h^4) -\
{f(x)-hf'(x)+frac{1}{2}h^2f''(x)-frac{1}{3!}h^3f'''(x)+O(h^4)}\
=2hf'(x)+frac{2}{3!}h^3f'''(x)+O(h^4)
]
[frac{f(x+h)-f(x-h)}{2h} =f'(x)+O(h^2)
]
這就是有限中心差分,在圖像中,例如在x方向,對應的值就是(f(x+1,y)-f(x-1,y)),因為展開式后面跟的是h的2階無窮小,所以中心差分比向前、向后都要準確。
2.2 圖像中的梯度
向前,(frac{f(x+h)-f(x)}{h}),在圖像中(f(x+1,y)-f(x,y))
向后,(frac{f(x)-f(x-h)}{h}),在圖像中(f(x,y)-f(x-1,y))
中心,(frac{f(x+h)-f(x-h)}{2h}),在圖像中(f(x+1,y)-f(x-1,y))
如下圖所示,x方向的梯度圖,可以看到水平方向的線條不明顯了,只留下了垂直方向的線條,這是因為x方向梯度的數值的大小代表水平方向強度值變換的大小,因為水平的線條可能都是一種強度,所以數值都差不多,所以都消失了,而在垂直方向變化比較大。y方向同理,可以看見水平方向的線條不明顯,垂直方向的線條明顯。
2.3 Matlab代碼
img = imread('img.jpg');
gray = double(rgb2gray(img));
wsize = size(gray,2);
hsize = size(gray,1);
%Normalize,因為差分可能求出負值,所以做一個歸于1化,將數值映射到[0,255]
h = Normalize(gray(:,3:wsize)-gray(:,1:wsize-2));%中心差分
v = Normalize(gray(3:hsize,:)-gray(1:hsize-2,:));%中心差分
hv = Normalize(sqrt(h(3:end,:).^2+v(:,3:end).^2)); %x,y方向合成
subplot(2,2,1);
imshow(uint8(gray));
title('灰度');
subplot(2,2,2);
imshow(uint8(hv));
title('xy方向合成');
subplot(2,2,3);
imshow(uint8(h));
title('x方向梯度');
subplot(2,2,4);
imshow(uint8(v));
title('y方向梯度');
function o = Normalize(img)
f = img(:)'; % 展開矩陣為一列,然后轉置為一行。
m = mapminmax(f, 0, 255); % 歸一化。
o = reshape(m, size(img)); % 還原為原始矩陣形式。此處不需轉置回去,因為reshape恰好是按列重新排序
end
總結
- 上一篇: OSG与opengl的shader结合
- 下一篇: 转:时区缩写