MATLAB Answers

how PCA can be applied to an image to reduce its dimensionality with example?

550 views (last 30 days)
G Prasanth Reddy
G Prasanth Reddy on 24 Dec 2014
Commented: Ben Grassi on 13 Feb 2020 at 7:37
This question was flagged by Walter Roberson
Dimensionality reduction

  1 Comment

Ameerah Omar
Ameerah Omar on 9 Nov 2015
i run your code but it is not work with me this error in the picture in the file plz see it and tell me what is the wrong

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 24 Dec 2014
Here's code I got from Spandan, one of the developers of the Image Processing Toolbox at the Mathworks:
Here some quick code for getting principal components of a color image. This code uses the pca() function from the Statistics Toolbox which makes the code simpler.
I = double(imread('peppers.png'));
X = reshape(I,size(I,1)*size(I,2),3);
coeff = pca(X);
Itransformed = X*coeff;
Ipc1 = reshape(Itransformed(:,1),size(I,1),size(I,2));
Ipc2 = reshape(Itransformed(:,2),size(I,1),size(I,2));
Ipc3 = reshape(Itransformed(:,3),size(I,1),size(I,2));
figure, imshow(Ipc1,[]);
figure, imshow(Ipc2,[]);
figure, imshow(Ipc3,[]);
In case you don’t want to use pca(), the same computation can be done without the use of pca() with a few more steps using base MATLAB functions.
Hope this helps.
-Spandan

  11 Comments

Show 8 older comments
Ben Grassi
Ben Grassi on 13 Feb 2020 at 2:23
I use a longhand form of this code to generate a range of PCA images, but when I use imwrite() to save the images, they are different to the images displayed by imshow(). Is there a way to ensure the images saved are the same as those displayed?
Image Analyst
Image Analyst on 13 Feb 2020 at 3:31
You can save them with save() instead of imwrite() to save the image variable exactly. Or you can use getframe() to get a bitmap/screenshot of the axes to save a 24 bit version of the image, which may be different than the actual variable. For example a double image in the range of 0-1 and displayed with imshow() will save exactly as a double with save() but if you get its displayed version with getframe() it will be a uint8 in the range of 0-255 since that's what the display adapter uses.
Ben Grassi
Ben Grassi on 13 Feb 2020 at 7:37
Thanks so much for the help, getframe() gave me exactly what I needed.

Sign in to comment.

More Answers (8)

Devan Marçal
Devan Marçal on 13 Aug 2015
Hi,
in your example you used PCA in just one image. I have an image bank a total of ~ 800 images. If I make a loop (if, while, etc ..) using the PCA function for each image individually, will be using this command wrong or inefficiently?
Thanks a lot.
Devan

  8 Comments

Show 5 older comments
Etworld
Etworld on 3 Apr 2019
Hello, it is weird but, in line 114 it gives inner dimension error.
transformedImagePixelList = listOfRGBValues * coeff;
For 'coloredChips' image example, size(listOfRGBValues)=202538x3
size(coeff)=202538x2
Why do you think is happening ?
Darshan Jain
Darshan Jain on 25 Jul 2019
Hey @ImageAnalyst,
I checked out your script, I had a small question, How could I plot the colored image back in three plots (showing approximation by pca1, then pca1 and pca2 and then followed by pca1, pca2 and pca3).
I tried doing using the imfuse comand "imfuse(pca1,pca2)", the clarity improved well, but i'm not able to reproduce the same colors. (see the attached image)
I think this is because I need to normalize the data, and then un-normalize it back before plotting. (I'm not sure though)
Image Analyst
Image Analyst on 25 Jul 2019
Etworld, I just ran the colored chips image and it ran fine. Did you change my code at all?
00_Screenshot.png
Darshan: where did your colors come from? I don't understand what your "approximations" are supposed to be. But anyway, you can stitch images side by side if they are all RGB images to begin with:
wideImage = [rgbImage1, rgbImage2, rgbImage3];

Sign in to comment.



Shaveta Arora
Shaveta Arora on 30 Jan 2016
Can I have the pca code used in this color image example

  6 Comments

Show 3 older comments
Image Analyst
Image Analyst on 31 Jan 2016
I can't. It would not be legal. You either have to buy the toolbox from the Mathworks, or implement it yourself from low level code.

Sign in to comment.


Anitha Anbazhagan
Anitha Anbazhagan on 17 Sep 2016
I have 200 ROIs from each of the 50 images. For each ROI, I have 96 feature vectors for four different frequency bands. It seems very high dimensional. How to apply PCA for this? PCA should be applied to data matrix. Do I have to apply for each image or each ROI?

  1 Comment

Image Analyst
Image Analyst on 17 Sep 2016
It depends on if you want PCA components on each image individually, or the PCA components of the group as a whole.

Sign in to comment.


Mina Kh
Mina Kh on 11 Dec 2016
Hi. I have multispectral( multi channel) data and I want to apply PCA to reduce the number of channel. Can u give me some hint?Which code i have to use?

  0 Comments

Sign in to comment.


Arathy Das
Arathy Das on 20 Dec 2016
How can i extract three texture features among the 22 using PCA?

  1 Comment

Image Analyst
Image Analyst on 20 Dec 2016
I think you should start your own discussion with your own data or images. If you have 22 PCA columns, then just extract the 3 you want as usual.
pca3 = pca22(:, 1:3); % or whatever.

Sign in to comment.


joynjo
joynjo on 24 Mar 2018
How to visualize the result of PCA image in pseudocolor?

  1 Comment

Sign in to comment.


F M Anim Hossain
F M Anim Hossain on 6 Apr 2018
I'm new to the concept of PCA. I'm trying to develop something that can recognize color features from different images. Is it possible to do it with the help of PCA?

  0 Comments

Sign in to comment.

Sign in to answer this question.


Translated by