Perbaikan Kualitas Citra dalam Pengolahan Video


Perbaikan kualitas citra (Image Enhancement) merupakan salah satu tahapan dalam computer vision yang bersifat opsional.

Perbaikan kualitas citra bertujuan agar citra lebih mudah untuk diinterpretasi atau diolah dalam tahapan selanjutnya seperti segmentasi citra maupun ekstraksi ciri citra.

Metode perbaikan kualitas citra sangat beragam seperti operasi titik maupun operasi spasial yang dilakukan pada domain spasial maupun operasi transformasi yang dilakukan pada domain frekuensi.

Perbaikan kualitas citra bersifat heuristik dan eksperimentatif karena sesungguhnya tidak ada algoritma yang pasti dalam memperbaiki kualitas suatu citra.

Oleh sebab itu, bidang perbaikan kualitas citra sangat terbuka pada penemuan metode baru maupun pengembangan metode yang sudah ada.

Perbaikan kualitas citra dapat pula diaplikasikan dalam bidang pengolahan video (video processing). Hal ini karena sejatinya video adalah sekumpulan citra yang dijalankan secara sekuensial.

Secara garis besar, tahapan perbaikan kualitas citra dalam pengolahan video adalah sebagai berikut:
1. Membaca file video
2. Mengekstrak seluruh frame citra yang menyusun video
3. Melakukan operasi perbaikan kualitas citra pada setiap frame
4. Menyatukan kembali frame citra yang telah diperbaiki kualitasnya dan menjalankannya secara sekuensial dalam bentuk video.

Berikut ini merupakan contoh aplikasi pemrograman GUI Matlab untuk pengolahan video mengenai perbaikan kualitas citra pada domain spasial.

Operasi perbaikan kualitas citra yang dilakukan di antaranya adalah histogram equalization, intensity adjustment, dan gamma correction.

Selain itu, diberikan juga perintah mengenai pertukaran kanal warna pada ruang warna RGB (true color) dan visualisasi color map citra pada citra pseudo color.

1. Menampilkan GUI awal

2. Membaca file video

3. Melakukan perbaikan kualitas citra dengan teknik histogram equalization

4. Melakukan perbaikan kualitas citra dengan teknik intensity adjustment

5. Melakukan perbaikan kualitas citra dengan teknik gamma correction

6. Menampilkan video dengan susunan kanal warna R-G-B (Video Asli)

7. Menampilkan video dengan susunan kanal warna R-B-G

8. Menampilkan video dengan susunan kanal warna G-R-B

9. Menampilkan video dengan susunan kanal warna G-B-R

10. Menampilkan video dengan susunan kanal warna B-R-G

11. Menampilkan video dengan susunan kanal warna B-G-R

12. Menampilkan video dengan warna semu ‘parula’

13. Menampilkan video dengan warna semu ‘winter’

Materi lebih lanjut mengenai pemrograman Matlab untuk perbaikan kualitas citra dapat dilihat pada halaman berikut:

  1. Konsep perbaikan kualitas citra digital
  2. Pemrograman GUI Matlab untuk perbaikan kualitas citra
  3. Perbaikan kualitas citra dalam computer vision

File source code lengkap beserta video mengenai perbaikan kualitas citra untuk pengolahan video dapat diperoleh melalui halaman berikut ini: Source Code

Sedangkan tampilan kodingnya adalah sebagai berikut:

function VideoProcessing2()

global vid

f = figure('Name','Video Processing','MenuBar','none',...
    'ToolBar','none','NumberTitle','off','Position',[180 100 1000 600]);
panel1 = uipanel('FontWeight','bold',...
    'FontSize',10,'Position',[.06 .59 .2 .12]);
panel2 = uipanel('FontWeight','bold',...
    'FontSize',10,'Position',[.06 .48 .2 .12]);
panel3 = uipanel('FontWeight','bold',...
    'FontSize',10,'Position',[.06 .37 .2 .12]);
panel4 = uipanel('Title','Video','FontWeight','bold',...
    'FontSize',10,'Position',[.35 .3 .55 .55]);

btn1 = uicontrol('Parent',f,'Style', 'pushbutton', 'String', 'Browse Video',...
    'Position', [60 480 100 25],'Callback', @pushbutton1);
btn2 = uicontrol('Parent',f,'Style', 'pushbutton', 'String', 'Play',...
    'Position', [60 180 100 25],'Callback', @pushbutton2,'Enable','off');

htext  = uicontrol('Style','text','String','Video Name:',...
    'Position',[60 440 70 20]);

radio1 = uicontrol('Parent',panel1,'Style','radiobutton','String','Image Enhancement',...
    'Position',[15 42 120 20],'Callback', @radiobutton1,'Value',1);
radio2 = uicontrol('Parent',panel2,'Style','radiobutton','String','True Color',...
    'Position',[15 42 90 20],'Callback', @radiobutton2,'Value',0);
radio3 = uicontrol('Parent',panel3,'Style','radiobutton','String','Pseudo Color',...
    'Position',[15 42 90 20],'Callback', @radiobutton3,'Value',0);

edit1  = uicontrol('Style','edit','String','',...
    'Position',[130 442 130 20],'Enable','inactive');

popup1 = uicontrol('Parent',panel1,'Style','popupmenu',...
    'String',{'Histogram Equalization','Intensity Adjustment','Gamma Correction'},...
    'Position',[15 16 150 20],'Enable','on');
popup2 = uicontrol('Parent',panel2,'Style','popupmenu',...
    'String',{'rgb','rbg','grb','gbr','brg','bgr'},...
    'Position',[15 16 150 20],'Enable','off');
popup3 = uicontrol('Parent',panel3,'Style','popupmenu',...
    'String',{'parula','jet','hsv','hot','cool','spring','summer',...
    'autumn','winter','gray','bone','copper','pink'},...
    'Position',[15 16 150 20],'Enable','off');

ax1 = axes('Parent',panel4,'Position',[.002 .015 1 1],'XTick',[],...
    'YTick',[],'Visible','off');

    function pushbutton1(~,~)
        [filename,pathname] = uigetfile('*.*');
        if ~isequal(filename,0);
            vid = fullfile(pathname,filename);
            set(edit1,'String',filename)
            set(btn2,'Enable','on')
        else
            return;
        end
    end

    function pushbutton2(~,~)
        obj.reader = vision.VideoFileReader(vid);
        
        while ~isDone(obj.reader)
            [frame,frameSize] = readFrame();
            frame = im2uint8(frame);
            showFrameOnAxis(ax1,frame)
        end
        
        release(obj.reader);
        
        function [frame,frameSize] = readFrame()
            frame = obj.reader.step();
            R = frame(:,:,1);
            G = frame(:,:,2);
            B = frame(:,:,3);
            
            if get(radio1,'Value') == 1
                val = get(popup1,'Value');
                switch val
                    case 1
                        R = histeq(R);
                        G = histeq(G);
                        B = histeq(B);
                        frame = cat(3,R,G,B);
                    case 2
                        R = imadjust(R);
                        G = imadjust(G);
                        B = imadjust(B);
                        frame = cat(3,R,G,B);
                    case 3
                        hgamma = vision.GammaCorrector(2.2,...
                            'Correction','De-gamma');
                        frame = step(hgamma, frame);
                end
            elseif get(radio2,'Value') == 1
                val = get(popup2,'Value');
                switch val
                    case 1
                        frame = cat(3,R,G,B);
                    case 2
                        frame = cat(3,R,B,G);
                    case 3
                        frame = cat(3,G,R,B);
                    case 4
                        frame = cat(3,G,B,R);
                    case 5
                        frame = cat(3,B,R,G);
                    case 6
                        frame = cat(3,B,G,R);
                end
            elseif get(radio3,'Value') == 1
                val = get(popup3,'Value');
                frame = (R+G+B)/3;
                switch val
                    case 1
                        colormap parula
                    case 2
                        colormap jet
                    case 3
                        colormap hsv
                    case 4
                        colormap hot
                    case 5
                        colormap cool
                    case 6
                        colormap spring
                    case 7
                        colormap summer
                    case 8
                        colormap autumn
                    case 9
                        colormap winter
                    case 10
                        colormap gray
                    case 11
                        colormap bone
                    case 12
                        colormap copper
                    case 13
                        colormap pink
                end
            end
            frameSize = size(frame);
        end
        
        function showFrameOnAxis(hAxis,~)
            try
                hChild = get(hAxis, 'Children');
            catch %#ok<CTCH>
                return; % hAxis does not exist; nothing to draw
            end
            
            isFirstTime = isempty(hChild);
            if isFirstTime
                hIm = displayImage(hAxis, frame);
                addScrollPanel(hAxis, hIm);
            else
                hIm = hChild;
                try
                    set(hIm,'cdata',frame); drawnow;
                catch  %#ok<CTCH>
                    % figure closed
                    return;
                end
            end
        end
        
        function addScrollPanel(hAxis, hIm)
            hPanel = get(hAxis,'parent');
            pos = get(hAxis,'position');
            
            hSP = imscrollpanel(hPanel,hIm);
            set(hSP,'Units','normalized', 'Position',pos);
        end
        %--------------------------------------------------------------------------
        function hIm = displayImage(hAxis, ~)
            xdata = [1 frameSize(2)];
            ydata = [1 frameSize(1)];
            cdata = frame;
            cdatamapping = 'direct';
            
            %             hIm = image(xdata,ydata,cdata, ...
            %                 'BusyAction', 'cancel', ...
            %                 'Parent', hAxis, ...
            %                 'CDataMapping', cdatamapping, ...
            %                 'Interruptible', 'off');
            
            hIm = image(cdata, ...
                'BusyAction', 'cancel', ...
                'Parent', hAxis, ...
                'CDataMapping', cdatamapping, ...
                'Interruptible', 'off');
            
            set(hAxis, ...
                'YDir','reverse',...
                'TickDir', 'out', ...
                'XGrid', 'off', ...
                'YGrid', 'off', ...
                'PlotBoxAspectRatioMode', 'auto', ...
                'Visible', 'off');
        end
    end

    function radiobutton1(~,~)
        set(radio1,'Value',1)
        set(popup1,'Enable','on')
        set(radio2,'Value',0)
        set(popup2,'Enable','off')
        set(radio3,'Value',0)
        set(popup3,'Enable','off')
    end

    function radiobutton2(~,~)
        set(radio1,'Value',0)
        set(popup1,'Enable','off')
        set(radio2,'Value',1)
        set(popup2,'Enable','on')
        set(radio3,'Value',0)
        set(popup3,'Enable','off')
    end

    function radiobutton3(~,~)
        set(radio1,'Value',0)
        set(popup1,'Enable','off')
        set(radio2,'Value',0)
        set(popup2,'Enable','off')
        set(radio3,'Value',1)
        set(popup3,'Enable','on')
    end
end

Save

Save

Save

Save

Save

Posted on June 20, 2016, in Pengolahan Video and tagged , , , , , , , , , , , , , , , , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: