Dr. Baranyai László, fénykép

Dr. Baranyai László

 

Képfeldolgozó alkalmazás Scilab segítségével

júl 8, 14:20, |

 

A számítógépes képfeldolgozás – vagy más néven gépi látás – jellemzően sok programozást és kódolást igényel, ami riasztó a kezdőknek. Egy szimpla és könnyen bővíthető grafikus felhasználói felületet szeretnék bemutatni, ami kedvünkre módosítható és valóban a képfeldolgozásra koncentrálhatunk. A Scilab programcsomag nem csupán képfeldolgozó rutinkönyvtárral rendelkezik, de egyszerű grafikus felület is létrehozható benne.

A program ablaka

A Scilab elsősorban a mérnöki számítások hatékony elvégzéséhez nyújt segítséget, de szerencsére interaktív elemeket is elhelyezhetünk az ábrákon. Az alábbi kódban a jobb érthetőség kedvéért külön sorba írtam a paraméterek beállításait. Az elvárt szintaktika szerint a paraméter nevét követi annak értéke. Első lépésként létrehoztam egy új ábrát, amelyben elhelyezhetek egy 800×600 pixel képet és mellette marad hely a funkció gomboknak. Mivel ez egy alkalmazás ablaka lesz, a dokkolását kikapcsoltam és nem kell az eszköztár, menü sem. Az alapértelmezett tengelyek kellenek, hiszen ábrát szeretnék megjelentetni benne, valamint automatikusan átméretezhető legyen és benne minden kövesse is a méretváltozást.

f = figure("figure_size", [1000 600], ...
    "figure_name", "Image Processing", ...
    "dockable","off", ...
    "infobar_visible","off", ...
    "toolbar_visible","off", ...
    "menubar_visible","off", ...
    "default_axes","on", ...
    "auto_resize","on");

Az ábra paraméterei beszédes nevűek, de a súgóban bőséges felsorolás és további magyarázat is található az egyéb extrákhoz (igény szerint). Ha már van ablak, akkor abban elhelyezhető a kép és az első gomb a képek betöltéséhez.

handles.pbOpen = uicontrol(f, ...
    "tag", "pbOpen", ...
    "style", "pushbutton", ...
    "string", "Open file", ...
    "units", "normalized", ...
    "position", [0.82 0.9 0.16 0.06], ...
    "callback", "pbOpen(handles)");

A gombot az uicontrol függvény segítségével hoztam létre. Az egyértelmű paraméterek mellett kiemelném a „units” jelentőségét. Ezt érdemes relatív méretezésre állítani, mint a kódban (normalized), mert ekkor a pozíciót 0 és 1 közötti számmal adjuk meg. Értelemszerűen ez az ablak 0 és 100% méretének felel meg. A pozíció tehát az ablakméret százalékában értendő. Az x és y pozíciót követi a szélesség és magasság. Az y pozíció az ablak alsó élétől értendő, mint egy grafikonon. A „callback” paraméter pedig hozzárendeli a gombhoz a függvényünket.

A kép területét a grafikon által elfoglalható területként adtam meg. Itt is relatív méreteket használtam a keret (bounds) megadásához. Ennek előnye, hogy a felhasználó által átméretezett ablakban megmaradnak az arányok, nem csúsznak össze az elemek.

handles.myPicture = newaxes();
handles.myPicture.margins = [0 0 0 0];
handles.myPicture.axes_bounds = [0 0 0.80 1];
handles.myPicture.auto_clear = "on";

A felület összeállítása és a kód magyarázata megtekinthető az alábbi Youtube videóban is.

Scilab bemutató videó
Scilab bemutató videó

A kép megnyitása és betöltése a rendszer dialógus ablakának meghívásával történik, majd a kép rajzterületen történő megjelenítésével. A feladatot teljesítő pár sor kiegészült még egy ellenőrzéssel, mert ha a felhasználó nem választ fájlt csak kilép „Mégse” gombbal, akkor nyilván nincsen mit betölteni.

function pbOpen(handles)
 [FileName,PathName,FilterIndex] = uigetfile(["*.jpg|*.jpeg|*.JPG|*.JPEG", "JPEG pictures"]);
 if FilterIndex == 0 then
     messagebox("No file was selected.","Error","error","modal");
     return;
 end
 tmp = imread(fullfile(PathName, FileName));
 imshow(tmp);
 // save image for session
 handles.PIC = tmp;
 handles = resume(handles);
endfunction

A képet a handles.PIC változóba mentettem, hogy ne globálisan mindenki számára látható adat legyen, de a többi függvény elérje. Az alap keretrendszer elkészült és a folytatás csak rajtunk múlik. A fent hivatkozott videóban a színek lineáris normálását mutatom be.

További bemutató videókat tervezek a képfeldolgozás témakörében is. Ha követni szeretné a friss videók megjelenését, iratkozzon fel a Youtube csatornára.