Variograms on Images

12 次查看(过去 30 天)
Chethan S
Chethan S 2011-4-2
评论: Mohd Galib 2020-12-6
I am working on applying geostatistics on Landsat imagery. My focus is on applications of variograms. I will be using n x n windows for generation of variogram plots and texture layers. From various online forums I learnt that the process would be faster if functions like blkproc, nlfilter, colfilt etc. are used instead of normal for loop based moving windows.
I see from the MATLAB help that I can integrate other custom functions to above said functions. But as I have to calculate directional variograms - in EW, NS, NE-SW and NW-SE directions I will have to consider only few pixels(cells of matrix) in front of the central pixel and not all surrounding pixels as in the case of filters. Can anyone suggest how I can go about/are there functions(or toolboxes) available to do such operations?

采纳的回答

David Young
David Young 2011-4-2
If I've understood correctly what you need, I'd use a function something like the following (which doesn't use blkproc or any of that family, but which does use MATLAB's vectorisation capability effectively).
function v = directionalVariogram(img, xoffset, yoffset)
%directionalVariogram computes empirical direction variogram
% v = directionalVariogram(img, xoffset, yoffset) takes a 2D image array
% and offsets in the x and y directions. It returns the mean of the
% squared differences between pairs of pixels in the image such that the
% spatial offsets between the pixels are as specified.
if xoffset < 0 % difference is symmetric so can force xoffset positive
xoffset = -xoffset;
yoffset = -yoffset;
end
% make offset and trimmed copies of image
if yoffset > 0
imga = img(1+yoffset:end, 1+xoffset:end);
imgb = img(1:end-yoffset, 1:end-xoffset);
else
imga = img(1:end+yoffset, 1+xoffset:end);
imgb = img(1-yoffset:end, 1:end-xoffset);
end
d = imga - imgb;
v = mean(d(:).^2);
end
To get the estimate for a distance of sqrt(2) pixels in the NE-SW direction, you call it like this, for example
v = directionalVariogram(img, 1, -1)
It will work with offsets in any direction and larger offsets (up to the size of the image) but the offsets have to be integers.
If you can't see how the function works, and you want to understand it, try putting in some calls to imshow to display imga and imgb, and call it with large offsets. You should also check it on some synthetic test data, for which you know what the answer should be, to make sure it does exactly what you expect.
  2 个评论
Mohd Galib
Mohd Galib 2020-11-26
while running this programme in matlab with an image it is showing an error...perhaps because we have not defined 'xoffset'& 'yoffset' before loops....could you please help me, as I am new to Matlab...
Mohd Galib
Mohd Galib 2020-12-6
i tried it as....
img = imread('assignment 3.jpg');
img1 = rgb2gray(img) ;
[row,column]=size(img1);
%variogram of image column wise
for lag = 1:500
for x=1:2000 %since the system was very long to process
% ,thats why not took upto end
img2=img1(1:end,x)-img1(1:end, x+lag);
v1 = mean(img2(:).^2);
end
figure(1)
plot(lag,v1,'*')
hold on
legend("variogram")
title("variogram of image column wise")
xlabel ("pixel distance")
ylabel("variogram value")
end
%variogram of image row wise
for lag = 1:500
for x=1:2000 %since the system was very long to process
%,thats why not took upto end
img3=img1(x,1:end)-img1(x+lag,1:end);
v2 = mean(img3(:).^2);
end
figure(2)
plot(lag,v2,'*')
hold on
legend("variogram")
title("variogram of image row wise")
xlabel ("pixel distance")
ylabel("variogram value")
end

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Get Started with MATLAB 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by