Lets Learn together... Happy Reading

" Two roads diverged in a wood, and I,
I took the one less traveled by,
And that has made all the difference "-Robert Frost

Lossless Predictive coding - MATLAB CODE

A new pixel value is obtained by finding the difference between the current pixel and the predicted pixel value.

Encoding:


STEPS TO BE PERFORMED:








clear all
clc
%Read the input image
% A=imread('rice.png');
% figure,imshow(A);
% A=double(A);

A=[10 2 3 4;5 6 7 8];
display(A);
e=A;

%Perform prediction error
for i = 1:size(A,1)
    for j = 2:size(A,2)
        e(i,j)=e(i,j)-A(i,j-1);
    end
end
display(e);

%Huffman coding
C=reshape(e,[],1);
[D1,x]=hist(C,min(min(e)):max(max(e)));
sym=x(D1>0);
prob=D1(D1>0)/numel(e);
[dict,avglen] = huffmandict(sym,prob);
comp = huffmanenco(C,dict);


%Huffman Decoding
dsig = huffmandeco(comp,dict);
e=reshape(dsig,size(A,1),size(A,2));
d=e;


for i = 1:size(A,1)
    for j = 2:size(A,2)
        d(i,j)=d(i,j-1)+e(i,j);
    end
end

display(d);

%Decompressed Image
%figure,imshow(uint8(d));





2-D Prediction:
Consider an array [ a  b
                    c  d]
To perform prediction error using 2-D linear operator, e(2,2)=d-(c+b) i.e subtract the pixels left and top to the current pixel
To decompress, perform inverse operation f(2,2)=d+(c+b)

clear all
clc

%Input sequence
A=[10 11 12 13; 2 14 26 39];
display(A);

e=A;
A1=padarray(A,[1,0],0);

%Prediction error
for i = 2:size(A1,1)-1
    for j = 2:size(A1,2)
        fx=round(A1(i,j-1)+A1(i-1,j));
         e(i-1,j)=e(i-1,j)-fx;
    end
end
display(e);

%Huffman encoding
C=reshape(e,[],1);
[D1,x]=hist(C,min(min(e)):max(max(e)));
sym=x(D1>0);
prob=D1(D1>0)/numel(e);
[dict,avglen] = huffmandict(sym,prob);
comp = huffmanenco(C,dict);

%Huffman decoding
dsig = huffmandeco(comp,dict);
e=reshape(dsig,size(A,1),size(A,2));

%Inverse operation
d=e;
e1=padarray(e,[1,0],0);
for i = 2:size(e1,1)-1
    for j = 2:size(e1,2)
        fx=round(e1(i,j-1)+e1(i-1,j));
        d(i-1,j)=d(i-1,j)+fx;
        e1=padarray(d,[1,0],0);
    end
end

display(d);
  
A is the input value, e is the encoded value, d is the decoded value


like button Like "IMAGE PROCESSING" page

Basic Intensity Transformation Functions – Part 1

Basic Intensity Transformation Functions – Part 1

Three basic types of functions used for image Enhancement are:
1.       Linear transformation
2.       Logarithmic transformation
3.       Power Law transformation
Consider an Image r with intensity levels in the range [0 L-1]
1.       Image Negatives

Equation : s = L – 1 – r
Consider  L  = 256 and r be the intensity of the image(Range 0 to 255)


MATLAB CODE:

A=imread('rice.png');
figure,imshow(A);title('Original Image');


%Image Negative
L=256;
s= (L-1)-A;
figure,imshow(s);title('Image negative -> S = L - 1 - r')

EXPLANATION:
Consider array r = [ 1 10 255 100]
  S = 256 – 1 – r gives [ 254 245 0 155]




2.       Log Transformation

Equation:  s = c log(1 + r) where c is a constant

Consider  c = 1 and r be the intensity of the image(Range 0 to 255)

%Log Transformation

%Input Image in type double
r=double(A);
C=1;
S=C*log(1+r);
Temp=255/(C*log(256));
%Display image range [0 255]
B=uint8(Temp*S);
figure,imshow(B);title('Log Transformation -> S = clog(1+r)');



EXPLANATION:
a.       Convert the image to type double
b.      Apply the log transformation
c.       Map the obtained values to the range [0 255]

3.       Power –Law (Gamma) corrections

Equation :


Where c and gamma are positive constants

Consider c = 1, gamma =0.04 and r be the intensity of the image (Range 0 to 255)


G=0.40;%Gamma =0.40
S=C*(r.^G);
Temp=255/(C*(255.^G));
%display image range [0 255]
S1=uint8(Temp*S);
figure,imshow(S1);title('Gamma corrected Image -> S = cr^\gamma  \gamma = 0.40 c = 1');





Plots of the Equation:

%Power Law(Gamma) Transformation
GRng=[0.04; 0.10; 0.20; 0.40; 0.67; 1; 1.5; 2.5; 5.0; 10.0; 25.0];
R=0:255;
figure,
for i = 1 : 11
X=C*(R.^GRng(i));
Temp=256/X(256);
s=Temp*X;
plot(R,s);
title('Plot Equation S = Cr^\gamma');
xlabel('Input Intensity Level,r');
ylabel('Output Intensity Level,s');
text(R(175),s(175),['\gamma = ',num2str(GRng(i))],'HorizontalAlignment','left');
hold all
axis([0 255 0 255]);
end


EXPLANATION:
The transformation is plotted for different values of gamma for the intensity levels [ 0 255].
The output image intensity values are mapped to the range [0 255]










like button Like "IMAGE PROCESSING" page

Tile Swapping GAME

             The little one at my home likes to play the hidden object games. There are also mini games as a part of the hidden object game. One such game I came across was tile swapper, which is of course a good old one. I thought of trying this game with MATLAB and to my surprise ,it came out better than I expected.

Method I used:

I divided the image into equal parts and randomized the position of the images.
I created push buttons and placed these random parts on it.
When a button is clicked followed by another button click, the image on the previous button click is swapped with the last button clicked image. This process continues until all the image parts are at the correct position.

How to play:

1.       Select an image from the popup menu



2.       Select the number of tiles from the popup menu

3.       Click an image part

4.       Click another image part

The selected  image parts are swapped



5.       Continue the process until all the image parts are in correct position.


6.       If the image parts are in correct position then msgbox pops up with a message.


MATLAB CODE:


function tile_swap_game
clear all;
clc
%FIGURE WINDOW
figure('Position',[250 150 700 450],'Name','TILE SWAP GAME','NumberTitle','off','MenuBar','None','Resize','off');
%DECLARE THE GLOBAL VARIABLES
global indexvalue currvalue prevalue correctPos Pname x1 y1 flag A Rnum presentPos files I TImg;

%GET THE JPEG IMAGES IN THE CURRENT FOLDER
directory=dir('*.jpg');
files={directory.name}';
%TITLE SIZE
msize={'2X2';'3X3';'4X4';'5X5';'6X6';'7X7';'8X8'};
%DEFINE THE GUI POPMENUS
uicontrol('Style','text','position',[495 400 75 25],'String','SELECT IMAGE');
fctrl=uicontrol('Style','popupmenu','position',[495 350 160 40],'Value',1,'String',files,'Callback',@displayfile);
uicontrol('Style','text','position',[495 320 75 25],'String','# TILES');
sctrl=uicontrol('Style','popupmenu', 'position',[495 290 160 20],'Value',1,'String',msize,'Callback',@tile);

%DISPLAY THE SELECTED IMAGE FROM THE POPMENU OPTION
    function displayfile(~,~)

        ptr=get(fctrl,'Value');
        filename=char(files(ptr));
        I=imread(filename);
        %RESIZE IMAGE TO STANDARD SIZE
        I=imresize(I,[448 447]);
        TImg=im2double(I);
       uicontrol('Style','Pushbutton','Position',[1 1 448 447],'CData' ,TImg);
       
    end

%GET THE TITLE SIZE AND DIVIDE THE IMAGE BASED ON THE SIZE
    function tile(~,~)
         
        if(isempty(I))
         
            displayfile;
        end
        ptr1=get(sctrl,'Value');
        num=ptr1+1;
        mvalue=mod(size(I),num);
        A=imresize(I,[size(I,1)-mvalue(1,1) size(I,2)-mvalue(1,2)]);

      
        m=size(A,1)/num;
        n=size(A,2)/num;
        x=1;
        y=1;
        x1=m;
        y1=n;
        indexvalue=1;

        correctPos=zeros([num^2 5]);
        presentPos=zeros([num^2 5]);
        inc=1;
        %DIVIDE THE IMAGE SIZE INTO EQUAL PARTS
        %EXAMPLE: IF #TITLE IS 4X4 THEN IMAGE WILL BE DIVIDED INTO 16 EQUAL
        %PARTS
        for i = 1:num
            m=x1*i;
            for j=1:num
   
                n=y1*j;
                correctPos(inc,1:4)=[x y m n];
               inc=inc+1;
               y=n;
            end
            x=m;
            y=1;
        end
        %RANDOMIZE THE IMAGE PARTS
        Rnum=randperm(num^2);

        %RE-POSITION THE [X,Y] CO-ORDINATES FOR THE UICONTROL FIELD
        %'POSITION'
        presentPos=sortrows(correctPos,-2);
        correctPos(:,5)=[1:(inc-1)]';
        presentPos(:,5)=[1:(inc-1)]';

        for j = 1 : inc-1
            %GET THE RANDOM NUMBER
            i=Rnum(j);
            %READ THE IMAGE PART BASED ON THE RANDOM NUMBER
            Ind=im2double(A(correctPos(i,1):correctPos(i,3),correctPos(i,2):correctPos(i,4),:));
            %DISPLAY THE IMAGE PART ON THE UICONTROL OBJECT 'PUSHBUTTON'
            Pname(j)=uicontrol('Style','Pushbutton','Position',[presentPos(j,1) presentPos(j,2) x1 y1],'CData' ,Ind,'UserData',j,'callback',@swap);
   
        end
    end
   
    %FUNCTION TO SWAP TWO TITLES
    function swap(obj,~)
        currvalue=get(obj,'UserData');

        if indexvalue == 2
   
           Temp=presentPos(currvalue,:);
           presentPos(currvalue,:)=presentPos(prevalue,:);
           set(Pname(currvalue),'Position',[presentPos(currvalue,1) presentPos(currvalue,2) x1 y1]);
           presentPos(prevalue,:)=Temp;
           set(Pname(prevalue),'Position',[presentPos(prevalue,1) presentPos(prevalue,2) x1 y1]);
   
           Evaluate_Position;
   
           if(flag==1)
             winner;
           end
   
           indexvalue=1;
        else
           prevalue=currvalue;
           indexvalue=indexvalue+1;
        end
   
    end

    %CHECK IF ALL THE IMAGE PARTS ARE PLACED IN THE CORRECT POSITION
    function Evaluate_Position
       
        flag=1;      
      
        tot=find(presentPos(:,5)==Rnum');
        if(numel(tot)==size(Rnum,2))
           flag=1;
        else
           flag=0;
        end
    end

    %DISPLAY THE IMAGE AND 
    function winner
        uicontrol('Style','Pushbutton','Position',[1 1 448 447],'CData' ,TImg);
        msgbox('YOU WIN!!!','CONGRATS');
    end
end




NOTE:  

a. Check whether the current directory contains JPEG images before executing the code
b. If you find the code is broken or unable to execute, mail me.I will mail you the code. Happy Weekend:-)

like button Like "IMAGE PROCESSING" page
Previous Post Next Post Home
Google ping Hypersmash.com