2014-11-15 4 views
1

그래서 이미지의 세로 가장자리를 측정하여 나중에 2D에서 3D로 변환 할 때의 심도있는 큐로 사용하고 싶습니다. A가가로 그라디언트 값을 계산하는 방법은 무엇입니까?

그램 (X ', Y')

̅ g(x,y) = 1/N ∑_((x',y')∈ Ω(x,y))〖g(x', y')〗 

:

그래서 각 블록은 다음과 같은 수직 에지를 측정하는 수평 기울기 값을 계산해야한다 수행 화소 위치 (X ', Y')의 수평 기울기,

오메가 (X, Y)은

화소 위치의 nighborhood (X ', Y')이며, N은 화소의 수이다 오메가 (x, y). 그래서 여기

내가 MATLAB에 무슨 짓을 :

I = im2double(imread('landscape.jpg')); 

% convert RGB to gray 
gI = rgb2gray(I); 
[nrow, ncol] = size(gI); 

% divide the image into 4-by-4 blocks 
gI = mat2tiles((gI),[4,4]); 

N = 4*4; % block size 

% For each block, compute the horizontal gradient 
gI = reshape([gI{:}],4*4, []); 
mask = fspecial('sobel'); 
g = imfilter(gI, mask); 
g_bar = g./N; 


g_bar = reshape(g_bar,nrow, ncol); 

내 코드가 올바른 방법으로 방정식을 표현하면 내가 확실하지 않다 matlab에 새로운 해요.

정확하다고 생각되면 알려 주시기 바랍니다. 결과를 테스트하는 방법을 모르겠습니다.

+0

제쳐두고, 나는''blockproc' (http://uk.mathworks.com/help/images/ref/blockproc.html)을 살펴 보길 권한다 - 아마도 그보다 더 좋고 (그리고 더 빠를 것이다) 모든 '모양새'- 저글링. – Notlikethat

+0

Sidenote : 내 연구를 한번보세요. 박사 학위 논문은 2D에서 3D로 변환되었습니다. - http://scholar.google.ca/citations?user=5piX29gAAAAJ – rayryeng

+0

@rayryeng, 감사합니다. – ABC2013

답변

1

이미지를 4 x 4 블록으로 분해 할 필요가 없습니다. 수평 그래디언트는 Sobel 필터 또는 Prewitt 필터와 함께 사용할 수 있습니다.이 필터는 3 x 3이며 직접 imfilter에 입력 할 수 있습니다. imfilter은 지정된 마스크/커널을 사용하여 2D 컨볼 루션/필터링을 수행하므로 타일링이 필요하지 않습니다. 마찬가지로 imfilterfspecial을 통해 정의 된 마스크와 함께 사용하고 N = 9을 정의 할 수 있습니다. 따라서 :

경험상 그라디언트 마스크의 크기를 늘리면 훨씬 좋은 결과를 얻을 수 있습니다. 가능한 한 많은 로컬 변경 사항을 캡처 할 수 있도록 가능한 한 마스크가 작아야합니다.

+1

많은 도움을 주셔서 감사합니다! – ABC2013

+0

이것이 로컬 그래디언트를 계산하는 방법입니다. 맞습니까? – ABC2013

+0

@ user2833205 - 예. 왜 글로벌 그라데이션을 원하십니까? 실용성이 없다. 로컬 그라디언트의 전체적인 점은 이미지의 로컬 변경을 결정하는 것입니다. 전 세계적으로 그렇게하면이 모든 것을 잃을 것입니다. – rayryeng

관련 문제