图像梯度
圖像梯度
1.圖像的表達(dá)
這里我們討論2D圖像,一般圖像的存儲(chǔ)格式是一個(gè)二維矩陣,每個(gè)位置對(duì)應(yīng)圖像的像素值,用數(shù)學(xué)描述
[z = I(x,y)
]
(x,y) 代表圖像坐標(biāo)(某個(gè)點(diǎn)的坐標(biāo)),(z) 代表此點(diǎn)的像素值(強(qiáng)度值),所以圖像可以看作一個(gè)二元的函數(shù)(離散的),將圖像在三維坐標(biāo)中畫(huà)出來(lái),如下圖所示,強(qiáng)度值的高低代表了曲面的高低。
http://www.cse.psu.edu/~rtc12/CSE486/lecture02.pdf
2. 圖像的梯度
既然可以將圖像看作是一個(gè)二元函數(shù),那么自然想到考慮二元函數(shù)的梯度(一元函數(shù)是導(dǎo)數(shù)),因?yàn)閳D像是離散的,所以和一般的連續(xù)函數(shù)還有些不同。離散的話(huà),就要考慮數(shù)值方法求梯度。
2.1 數(shù)值微分
根據(jù)泰勒級(jí)數(shù)展開(kāi)式
[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方向,對(duì)應(yīng)的值就是(f(x+1,y)-f(x,y))
根據(jù)泰勒級(jí)數(shù)展開(kāi)式
[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方向,對(duì)應(yīng)的值就是(f(x,y)-f(x-1,y))
根據(jù)泰勒級(jí)數(shù)展開(kāi)式
[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方向,對(duì)應(yīng)的值就是(f(x+1,y)-f(x-1,y)),因?yàn)檎归_(kāi)式后面跟的是h的2階無(wú)窮小,所以中心差分比向前、向后都要準(zhǔn)確。
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方向的梯度圖,可以看到水平方向的線(xiàn)條不明顯了,只留下了垂直方向的線(xiàn)條,這是因?yàn)閤方向梯度的數(shù)值的大小代表水平方向強(qiáng)度值變換的大小,因?yàn)樗降木€(xiàn)條可能都是一種強(qiáng)度,所以數(shù)值都差不多,所以都消失了,而在垂直方向變化比較大。y方向同理,可以看見(jiàn)水平方向的線(xiàn)條不明顯,垂直方向的線(xiàn)條明顯。
2.3 Matlab代碼
img = imread('img.jpg');
gray = double(rgb2gray(img));
wsize = size(gray,2);
hsize = size(gray,1);
%Normalize,因?yàn)椴罘挚赡芮蟪鲐?fù)值,所以做一個(gè)歸于1化,將數(shù)值映射到[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(:)'; % 展開(kāi)矩陣為一列,然后轉(zhuǎn)置為一行。
m = mapminmax(f, 0, 255); % 歸一化。
o = reshape(m, size(img)); % 還原為原始矩陣形式。此處不需轉(zhuǎn)置回去,因?yàn)閞eshape恰好是按列重新排序
end
總結(jié)
- 上一篇: OSG与opengl的shader结合
- 下一篇: 转:时区缩写