thank you. It seems now solved!
Laura
2008/6/12 Agustin Lobo <Agustin.Lobo at ija.csic.es>:
Laura Poggio escribi?:
.../...
2008/6/12 Agustin Lobo <Agustin.Lobo at ija.csic.es <mailto:
Agustin.Lobo at ija.csic.es>>:
May I just ask you if you have easily available an example of code to
transform the image in a multivariate table pixels x bands? This would be
helpful to avoid many trial and errors (especially the second one). Sorry
for that but at my institution I am the only one dealing with R...
Thank you again
Laura
You already did it in:
kl <- kmeans(as(img, "data.frame"), 5)
Perhaps you want to do it in 2 steps:
imgtabla <- as(img, "data.frame")
kl <- kmeans(imgtabla, 5)
You can look at the first rows of imgtabla with
imgtabla[1:5,]
or
head(imgtabla)
and then
dim(imgtabla)
summary(imgtabla)
If img were your complete Landsat image, the same steps
would yield an imgtabla with 262144 x 6 (as I assume you are not
using the thermal band). In that case, you probably want
to run PCA and use only the first 3 PCs for classification, as they
typically
account for >95% of the total variance and you cam always apply
the inverse transform to the centroids to recover the original
metric.
As a matter of fact, I think it's more practical
here to convert imgtabla from data.frame to matrix, as all values are
numerical here.
Agus
Agus
I will investigate some of the points raised and in case I will
come back with more clear ideas and questions.
Thank you very much to everybody for the support.
Laura
2008/6/12 Agustin Lobo <Agustin.Lobo at ija.csic.es
<mailto:Agustin.Lobo at ija.csic.es>
<mailto:Agustin.Lobo at ija.csic.es
<mailto:Agustin.Lobo at ija.csic.es>>>:
If your images are large (and images typically are large because
pixel size
has to be small compared to the extent of the image for the
image to
be of acceptable quality for our vision system), I do not
advice you
to get them into R for processing as R has severe memory limits
and many classification techniques are not precisely
memory-efficient
(but see clara() in package cluster, actually read
http://cran.r-project.org/web/views/Cluster.html).
I think that you should sample your image in a RS/GIS
environment
making sure you cover all
the radiometric space and import only a table pixels x bands
into R,
the actual nb. of pixels depending on your HW/SW
configuration (but
10000 would be a good start). Then use the numerous R
classification
tools to define the centroids and once you have them use
again your
RS/GIS program to actually assign each pixel in the image to a
centroid according to a given rule (i.e. maximum likelihood).
There
might be
ways of writing an efficient assignation step within R itself
also,
I think that mclust package does it.
Another way of reducing the number of individuals to classify is
performing a segmentation of the image first and then
classify segments
instead of pixels (i.e.
# Lobo, A. 1997. Image segmentation and discriminant
analysis for
the identification of land cover units in Ecology. IEEE
Transactions
on Geoscience and Remote Sensing, 35(5): 1- 11.
http://wija.ija.csic.es/gt/obster/ABSTRACTS/alobo_ieee97.pdf
perhaps other articles in
http://wija.ija.csic.es/gt/obster/alobo_publis.html
might be of help)
In any case, note that img in your code should be converted into
a multivariate table pixels x bands for most classification
functions in R to work. Note that this fact makes obvious
that classification approaches to image processing do not make
use of the spatial information of the image, which is actually
a fundamental part of the information of any image.
Agus
Laura Poggio escribi?:
Dear list,
I am trying to do some clustering on images. And I have
two main
problems:
1) Clustering multiband images.
I managed to be successful with a single band image, but
when
trying to
apply to a 3 band I get the following warning message:
In as.matrix.SpatialGridDataFrame(x) :
as.matrix.SpatialPixelsDataFrame uses first column;
pass subset or [] for other columns
2) saving clustering results as grid or image.
I get a vector of clusters, but without both coordinates.
How it
is possible
to transform it in a grid?
Here the code I use to read the image itself and to do the
clustering:
library(rgdal)
fld <- system.file("E:/data/IMG/fr/", package="rgdal")
img <- readGDAL("123_rawR.tif")
kl <- kmeans(img, 5)
I am quite new to image processing, especially within R,
and any
help is
greatly appreciated.
Thank you in advance
LP
[[alternative HTML version deleted]]