Search code examples
imagematlabimage-processinggaussianlowpass-filter

Matlab low pass filter for RGB image


I have this code that will perform Gaussian filter (Low Pass filter) on an image. However, this filter only works on Grey scale image. How can I improve it so it can work on a coloured image? I know there are many built-in functions but I am new to image processing and I'm trying to learn the basics.

%Read an Image
Img = imread('peppers.png');
Im = rgb2gray(Img);
I = double(Im);

%Design the Gaussian Kernel
%Standard Deviation
sigma = 1.76;

%Window size
sz = 4;
[x,y]=meshgrid(-sz:sz,-sz:sz);

M = size(x,1)-1;
N = size(y,1)-1;
Exp_comp = -(x.^2+y.^2)/(2*sigma*sigma);
Kernel= exp(Exp_comp)/(2*pi*sigma*sigma);

%Initialize
Output=zeros(size(I));
%Pad the vector with zeros
I = padarray(I,[sz sz]);

%Convolution
for i = 1:size(I,1)-M
    for j =1:size(I,2)-N
        Temp = I(i:i+M,j:j+M).*Kernel;
        Output(i,j)=sum(Temp(:));
    end
end
%Image without Noise after Gaussian blur
Output = uint8(Output);
figure,imshow(Output);

Solution

  • A RGB image is made up of Red, Green, Blue color channels. To perform image processing on RGB image

    1. You have to separate out the three components of the image
    2. process each component (R,G,B) once
    3. reconstuct the image from modified R,G,B

      img = imread('peppers.png');
      R = img(:,:,1); %get the Red part
      G = img(:,:,2); %get the Blue part
      B = img(:,:,3); %get the Green part
      R_gaussian = gaussianFilter(R); %write your own function name
      G_gaussian = gaussianFilter(G); %or repeat the code by REPLACING I as 
      B_gaussian = gaussianFilter(B); %Red Green Blue components
      RGB_gaussian = cat(3,R_gaussian, G_gaussian, B_gaussian); %merging the components
      %since you are learning you can do this for better unedrstanding
      RGB_gaussian = zeros(size(img)); %make a matrix of size  of original image
      RGB_gaussian(:,:,1)=R_gaussian; % Replace the values  
      RGB_gaussian(:,:,2)=G_gaussian;
      RGB_gaussian(:,:,3)=B_gaussian;
      

    for more info this can be helpful: http://www.bogotobogo.com/Matlab/Matlab_Tutorial_Digital_Image_Processing_6_Filter_Smoothing_Low_Pass_fspecial_filter2.php