Strojni vid pri tehnoloških meritvah formati slike in branje slike pomen in nekaj primerov EM spekter aplikacije v posameznih delih spektra o matriki slike
formati slike in branje slike slika je običajno v enem od uveljavljenih zapisov, ki uporabljajo različne vrste stiskanja podatkov ali pa tudi ne z izgubo: jpg, Kompresija slike brez izgube: gif, tif, png barvna slika velikosti: 512 * 512 * 3byte = 786432 byte sivinska slika velikosti 512 * 512 * 1byte = 262144 byte slike smo dobili na http://links.uwaterloo.ca/repository.html v spisku spodaj vidimo velikost datoteke lenag.tif => 256kB, kar pomeni = 256kB * 1024 = 262144B en.wikipedia.org/wiki/lena_söderberg
branje slike in prikaz slike v Matlabu beremo sliko z ukazom imread, pokažemo pa jo lahko z različnimi ukazi: clear all imef = 'lenag.tif'; sl = imread(imef); figure(1); imshow(sl) figure(2); image(sl) figure(3); imagesc(sl)
prikaz slike in razmerje stranic figure(4); image(sl); colormap gray figure(5); imagesc(sl); colormap gray figure(6); imagesc(sl); colormap gray; axis equal; axis tight whos sl Name Size Bytes Class Attributes sl 512x512 262144 uint8
image handle in lastnosti get(ih) AlphaData = [1] AlphaDataMapping = none Annotation = [ (1 by 1) hg.annotation array] CData = [ (512 by 512) uint8 array] CDataMapping = scaled DisplayName = XData = [1 512] YData = [1 512] BeingDeleted = off ButtonDownFcn = Children = [] Clipping = on CreateFcn = DeleteFcn = BusyAction = queue HandleVisibility = on HitTest = on Interruptible = on Parent = [351.006] Selected = off SelectionHighlight = on Tag = Type = image UIContextMenu = [] UserData = [] Visible = on set(ih) AlphaData AlphaDataMapping: [ {none} direct scaled ] CData CDataMapping: [ {direct} scaled ] DisplayName XData YData ButtonDownFcn: string -or- function handle -or- cell array Children Clipping: [ {on} off ] CreateFcn: string -or- function handle -or- cell array DeleteFcn: string -or- function handle -or- cell array BusyAction: [ {queue} cancel ] HandleVisibility: [ {on} callback off ] HitTest: [ {on} off ] Interruptible: [ {on} off ] Parent Selected: [ on off ] SelectionHighlight: [ {on} off ] Tag UIContextMenu UserData Visible: [ {on} off ]
%% sprememba velikosti slike I = imread('crosses.tif'); figure(1); imshow(i); IR = imrotate(i,7); figure(2); imshow(ir) [V,S] = size(i); n = 4; ni = imresize(i,[n*v,n*s]); nir = imrotate(ni,7); IRcorr = imresize(nir,[v,s]); figure(3); imshow(ircorr) sprememba velikosti matrike slike; primer uporabe pri rotaciji slike, zato da preprečimo prekrivanje in lomljenje črt (aliasing)
funkcija imresize pozna različne metode 'nearest 'bilinear' 'bicubic' 'box' 'triangle' 'cubic' 'lanczos2' 'lanczos3' Nearest-neighbor interpolation; the output pixel is assigned the value of the pixel that the point falls within. No other pixels are considered. Bilinear interpolation; the output pixel value is a weighted average of pixels in the nearest 2-by-2 neighborhood Bicubic interpolation (the default); the output pixel value is a weighted average of pixels in the nearest 4-by-4 neighborhood Box-shaped kernel Triangular kernel (equivalent to 'bilinear') Cubic kernel (equivalent to 'bicubic') Lanczos-2 kernel Lanczos-3 kernel
%% imresize - natančneje n = 9; A = magic(n); m = 4; B = imresize(a,[m*n,m*n],'nearest'); C = imresize(a,[m*n,m*n],'bilinear'); D = imresize(a,[m*n,m*n],'bicubic'); E = imresize(a,[m*n,m*n],'lanczos3'); figure(1); clf subplot(1,5,1); imagesc(a); title('original') subplot(1,5,2); imagesc(b); title('nearest'); subplot(1,5,3); imagesc(c); title('bilinear'); subplot(1,5,4); imagesc(d); title('bicubic'); subplot(1,5,5); imagesc(e); title('lanczos3');
pretvorba v dvobitno (binarno) sliko; pogosto moramo pred analizo pretvoriti sliko sl v črno-belo sliko v Matlabu to naredimo s funkcijo im2bw(sl, meja) prav določanje pravilne meje je ključnega pomena enojna meja T: pixel 1, če je sl(i,j) > T pixel 0, če je sl(i,j) <= T dvojna meja T1 in T2: pixel 1, če je T1 <= sl(i,j) > T2 pixel 0, sicer
%% pretvorba v binarno sliko sl = imread('lenag.tif'); meja = graythresh(sl); sl2a = im2bw(sl,meja); sito = find(sl>255*0.6 & sl<255*1); sl2b = zeros(size(sl)); sl2b(sito) = ones(size(sito)); figure(1); clf subplot(1,3,1); imshow(sl); title('original') subplot(1,3,2); imshow(sl2a); title('ena meja') subplot(1,3,3); imshow(sl2b); title('dve meji')
filtri: nizko pasovni in visoko pasovni; nad slikami lahko uporabimo podobne metode kot na časovnih signalih, posplošiti pa jih je treba na dve dimenziji. Tako poznamo nizko-pasovne filtre s katerimi zmanjšujemo šum, gladimo robove ali jih uporabljamo za izenačevanje osvetljenosti; visoko-pasovni filtri, s katerimi odkrijemo robove
%% filtri sl = imread('mestece.jpg'); sl = rgb2gray(sl); sl_lp = medfilt2(sl,[5,5]); sh = [-1 0 1; -2 0 2; -1 0 1]; sobelh = sh/norm(sh,'fro'); sl_hp = imfilter(sl, sobelh); sl_std = stdfilt(sl,ones(7)); figure(1); subplot(1,3,1); imagesc(sl); axis equal; axis tight subplot(1,3,2); imagesc(sl_lp); axis equal; axis tight subplot(1,3,3); imagesc(sl_hp); axis equal; axis tight
50 100 150 200 250 300 350 400 450 500 550 50 100 150 200 250 300 350 400 450 500 550 100 200 300 400 500 600 700 prva = 41; zadnja= 280; 100 200 300 400 500 600 700 550 500 8979 / 9216 100 200 200 300 400 500 600 700 250 300 350 400 450 50 100 150 prva=8501; zadnja=8740; 8740 / 9216 prva = 8021; zadnja= 8260; 8260 / 9216
Podatki: expr93 (Natalija) prva = 31; zadnja= 282; prva = 8674; zadnja= 8913; prva =11318; zadnja=11561; prva =11318; zadnja=11561; Smer trajektorije je od modre proti rdeči
prva =11318; zadnja=11561; Na desni je ponovljeno sledenje s prg: brlc6.ml