Professional Documents
Culture Documents
March 1, 2021
import scipy
from scipy import ndimage
from scipy import *
from pylab import *
0.1.2 Zadatak 1
U zadatku 1 potrebno je izvršiti segementaciju slike tako da izlazna slika ima izdvojene kolovozne
trake u beloj boji a ostatak slike treba da bude crne boje. Za segmentaciju slike korišćen je HSV
model boja. Kreirana je maska istih dimenzija kao i ulazna slika u kojoj vrednost 1 imaju oni
pikseli čiji intenziteti odgovaraju potrebnoj nijansi žute i beloj boji. Nakon što primenimo masku
možemo primetiti regione slike koji sadrže neki šum nalik ”so i biber” šumu koji smo probali da
uklonimo tako što smo izvršili medijan filtriranje. Za veličinu medijan filtra uzeta je vrednost 4.
Isprobavanjem je utvrđeno da ukoliko uzemomo veći medijan, neke slike će biti lepše segmentovane
ali ćemo na nekim drugim slikama izgubiti region od značaja.
1
[6]: #zadatak 1
def segment_lanes(img_in):
from scipy import ndimage, misc
import matplotlib.pyplot as plt
fig = plt.figure(figsize=[20,20])
#ucitavamo sliku, prebacimo je u opseg od 0 do 1
ax1 = fig.add_subplot(131) # prikazemo ulaznu sliku
ax1.imshow(img_in)
ax1.set_title('Ulazna slika')
ax1.axis('off')
img_in= img_in/max(img_in.flatten())
#napravimo matricu istog oblika kao img_in u koju smestamo hsv sliku
img_hsv = zeros(shape(img_in));
img_hsv = matplotlib.colors.rgb_to_hsv(img_in)
M,N,k = shape(img_hsv)
#medijan filtriranje
from scipy import ndimage, misc
import matplotlib.pyplot as plt
2
[7]: #primenimo funkciju segment_lanes() na svih 6 frejmova
frame1= imageio.imread('../sekvence/test1.jpg')
result1=segment_lanes(frame1)
frame2= imageio.imread('../sekvence/test2.jpg')
result2=segment_lanes(frame2)
frame3= imageio.imread('../sekvence/test3.jpg')
result3=segment_lanes(frame3)
frame4= imageio.imread('../sekvence/test4.jpg')
result4=segment_lanes(frame4)
frame5= imageio.imread('../sekvence/test5.jpg')
result5=segment_lanes(frame5)
frame6= imageio.imread('../sekvence/test6.jpg')
result6=segment_lanes(frame6)
3
0.1.3 Zadatak 2
4
matrice slabih ivica koji u svom susedstvu jaku ivicu, ostali se odbacuju.
[23]: # zadatak 2
# kanijev algoritam
def canny_edge_detection(img_in,sigma,treshold_low,treshold_high):
img_in = skimage.img_as_float(img_in)
################################################################
truncate = sigma*6-1
img_gauss = skimage.filters.gaussian(img_in, sigma=sigma, truncate=truncate/
,→sigma)
################################################################
###############################################################
Hx = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]])
# transponovanje matrice
Hy = Hx.transpose()
# izracunavanje vertikalnog i horizontalnog gradijenta slike
Gx = scipy.ndimage.correlate(img_gauss, Hx, mode='nearest')
Gy = scipy.ndimage.correlate(img_gauss, Hy, mode='nearest')
###############################################################
################################################################
# magnituda gradijenta
mag = np.sqrt(np.square(Gx) + np.square(Gy))
# ugao gradijenta
# ako koristimo np.arctan funkciju trebalo bi da obezbedimo
# da imenilac nije jednak 0 jer je za te tacke potrebno dodefinisati␣
,→funkciju
5
angle[(Gx==0)&(Gy<0)] = -np.pi/2
angle[(Gx==0) & (Gy==0)] = 0
angle = np.rad2deg(angle)
# funkcija np.arctan daje vrednosti ugla u opsegu -pi do pi
# i omogucava odredjivanje i smera gradijenta
angle2 = np.rad2deg(np.arctan2(Gy, Gx))
######################################################################
######################################################################
angle[(angle>=-22.5) & (angle<22.5)]= 0
angle[(angle>=22.5) & (angle<67.5)] = 45
angle[(angle>=67.5) & (angle< - 67.5)] = 90
angle[(angle>=-67.5) & (angle<-22.5)] = -45
######################################################################
###########################################################
M, N = shape(img_in)
maximum = np.zeros(shape = [M,N])
for i in range(1,M-1):
for j in range(1,N-1):
q = 1
r = 1
#angle -45
if (angle[i,j] == -45):
q = mag[i-1, j+1]
r = mag[i+1, j-1]
#angle 0
elif (angle[i,j] == 0):
q = mag[i+1, j]
r = mag[i-1, j]
#angle 90
elif (angle[i,j] == 90):
q = mag[i, j+1]
r = mag[i, j-1]
#angle 45
elif ( angle[i,j] == 45):
q = mag[i-1, j-1]
r = mag[i+1, j+1]
6
if (mag[i,j] >= q) and (mag[i,j] >= r):
maximum[i,j] = mag[i,j]
else:
maximum[i,j] = 0;
#######################################################
if(slaba[i,j] == 1):
# 0 stepeni
if(angle[i,j]==0):
q = jaka[i+1, j]
r = jaka[i-1, j]
#45 stepeni
if(angle[i,j]==45):
q = jaka[i-1, j-1]
r = jaka[i+1, j+1]
#90 stepeni
if(angle[i,j]==90):
q = jaka[i, j+1]
r = jaka[i, j-1]
#-45 stepeni
if(angle[i,j]==-45):
q = jaka[i-1, j+1]
r = jaka[i+1, j-1]
if (q == 1) or (r == r):
jaka[i,j] = 1
else:
jaka[i,j] = 0
return img_gauss,mag,angle,maximum,jaka
7
0.1.4 Zadatak 2
fig=plt.figure(figsize=(20,20), dpi=80)
plt.subplots_adjust(bottom=0.5, hspace = 0.6)
ax1=fig.add_subplot(121)
ax1.imshow(img_gauss, cmap='gray')
ax1.set_title('Ulaz nakon Gausovog filtriranja',fontsize=16)
ax1.axis('off')
fig=plt.figure(figsize=(20,20), dpi=80)
ax1=fig.add_subplot(111)
magnituda=ax1.imshow(mag, cmap='gray')
figure.colorbar(magnituda, ax=ax1, fraction=0.03, pad=0.04)
ax1.set_title('Magnituda gradijenta',fontsize=24)
ax1.axis('off')
fig=plt.figure(figsize=(20,20), dpi=80)
ax1=fig.add_subplot(111)
ugao=ax1.imshow(angle, cmap='jet')
figure.colorbar(ugao, ax=ax1, fraction=0.03, pad=0.04)
ax1.set_title('Ugao gradijenta',fontsize=24)
ax1.axis('off')
fig=plt.figure(figsize=(20,20), dpi=80)
ax1=fig.add_subplot(111)
ax1.imshow(maximum, cmap='gray')
ax1.set_title('Magnituda gradijent nakon potiskivanja lokalnih␣
,→nemaksimuma',fontsize=24)
ax1.axis('off')
matplotlib.pyplot.tight_layout()
fig=plt.figure(figsize=(20,20), dpi=80)
ax1=fig.add_subplot(121)
ax1.imshow(jaka, cmap='gray')
ax1.set_title('Detektovane ivice ',fontsize=24)
8
ax1.axis('off')
plt.show()
(720, 1280)
9
10
[228]: img_gauss,mag,angle,maximum,jaka = canny_edge_detection(result1,12,0.03,0.7)
fig=plt.figure(figsize=(20,20), dpi=80)
plt.subplots_adjust(bottom=0.5, hspace = 0.6)
ax1=fig.add_subplot(121)
ax1.imshow(jaka, cmap='gray')
ax1.set_title('Izdvojene ivice frame1',fontsize=16)
ax1.axis('off')
img_gauss,mag,angle,maximum,jaka = canny_edge_detection(result2,12,0.03,0.7)
fig=plt.figure(figsize=(20,20), dpi=80)
plt.subplots_adjust(bottom=0.5, hspace = 0.6)
ax1=fig.add_subplot(121)
ax1.imshow(jaka, cmap='gray')
ax1.set_title('Izdvojene ivice frame2',fontsize=16)
ax1.axis('off')
img_gauss,mag,angle,maximum,jaka = canny_edge_detection(result3,12,0.03,0.7)
fig=plt.figure(figsize=(20,20), dpi=80)
plt.subplots_adjust(bottom=0.5, hspace = 0.6)
ax1=fig.add_subplot(121)
ax1.imshow(jaka, cmap='gray')
ax1.set_title('Izdvojene ivice frame3',fontsize=16)
11
ax1.axis('off')
img_gauss,mag,angle,maximum,jaka = canny_edge_detection(result4,12,0.03,0.7)
fig=plt.figure(figsize=(20,20), dpi=80)
plt.subplots_adjust(bottom=0.5, hspace = 0.6)
ax1=fig.add_subplot(121)
ax1.imshow(jaka, cmap='gray')
ax1.set_title('Izdvojene ivice frame4',fontsize=16)
ax1.axis('off')
img_gauss,mag,angle,maximum,jaka = canny_edge_detection(result5,12,0.03,0.7)
fig=plt.figure(figsize=(20,20), dpi=80)
plt.subplots_adjust(bottom=0.5, hspace = 0.6)
ax1=fig.add_subplot(121)
ax1.imshow(jaka, cmap='gray')
ax1.set_title('Izdvojene ivice frame5',fontsize=16)
ax1.axis('off')
img_gauss,mag,angle,maximum,jaka = canny_edge_detection(result6,12,0.03,0.7)
fig=plt.figure(figsize=(20,20), dpi=80)
plt.subplots_adjust(bottom=0.5, hspace = 0.6)
ax1=fig.add_subplot(121)
ax1.imshow(jaka, cmap='gray')
ax1.set_title('Izdvojene ivice frame6',fontsize=16)
ax1.axis('off')
12
13
14
15
0.1.5 Zadatak 3
Potrebno je napisati funkciju koja će na osnovu prosleđenih ivica iscrtati odgovarajuće duži. Na
osnovu ulaznih parametara rho i theta korišćenjem funkcije polar_to_XY dobijamo jednačinu u xy
domenu. Funkcija vraća koordinantni početak i dve tačke na toj pravoj. Potrebno je da iteriramo
kroz sve vrednosti x i da ispitujemo da li se u lokalnom susedstvu elementa matrice nalazi neki ivični
piksel. Prvi ivični piksel je prva tačka duži itd. Poslednja tačka duži je ona koja ima rastojanje od
susedne tačke veće od maksimalne dužine prekida i čija prethodna sekvenca zadovoljava minimalnu
potrebnu dužinu duži.
[25]: def polar_to_XY(img_edges,line):
origin = np.array((0, img_edges.shape[1]))
y0, y1 = (line[0] - origin * np.cos(line[1])) / np.sin(line[1])
x0, x1 = (line[0] - origin * np.sin(line[1])) / np.cos(line[1])
return origin,y0,y1,x0,x1
k = 0
for i in range(x-tolerancy, x+tolerancy+1):
for j in range(y-tolerancy,y+tolerancy+1):
k=k+1
if(edges[i,j] == 1):
return True
return False
koeficijent = (y1_pom-y0_pom)/(origin[1]-origin[0])
line_segments = []
prvaTacka = (-1,-1)
poslednjaTacka = (0,0)
if(koeficijent<0): # posmatram levu liniju
#ispitujemo da li su koordinate van dimenzija slike
if(y0_pom>M):
y2 = int(M)
x2 = int(abs((y0_pom-M)/koeficijent));
else:
y2 = int(y0_pom)
x2 = 0;
16
if(x0_pom>N):
x1 = int(N)
else:
x1 = int(x0_pom)
if(y1_pom<0):
y1 = 0;
else:
y1 = int(y1_pom)
duzina_duzi = 0
prekid = 0
duzina_duzi = duzina_duzi+1
prekid = 0
continue
elif(prvaTacka !=(-1,-1)):#nema ivice u susedstvu
prekid = prekid+1#uvecava trenutnu duzinu prekida
if((prekid > max_gap)):#da li je prekid veci od max dozvoljenog
if(duzina_duzi>min_size):#da li imamo min duzinu duzi
poslednjaTacka = (i,Y)
segment = (prvaTacka,poslednjaTacka)
line_segments.append(segment)
duzina_duzi = 0
prekid = 0
prvaTacka=(-1,-1)
poslednjaTacka=(0,0)
else:
duzina_duzi = 0
prekid = 0
prvaTacka=(-1,-1)
poslednjaTacka=(0,0)
17
prvaTacka = (0,0)
poslednjaTacka = (0,0)
if(koeficijent>0): #desna linija
if(y1_pom>M):
x2 =int( N - abs((y1_pom-M)/koeficijent));
y2 = int(M)
else:
y2 = int(y1_pom);
x2 = int(N)
if(x0_pom<0):
if(y0_pom>0):
x1 = 0;
y1 = int(y0_pom)
else:
x1 = int(abs((y0_pom/koeficijent)));
y1 = 0
duzina_duzi = 0
prekid = 0
18
duzina_duzi = 0;
prekid = 0;
prvaTacka = (0,0)
poslednjaTacka =(0,0)
i = i+1
if(i == x2):#ukoliko petlja dosla do kraja
if( duzina_duzi> min_size ): #detektovana je neka duz duza od␣
,→min dozvoljene
poslednjaTacka = (i,Y)
segment = (prvaTacka,poslednjaTacka)
line_segments.append(segment)
duzina_duzi = 0;
prekid = 0;
prvaTacka = (0,0)
poslednjaTacka =(0,0)
else:
duzina_duzi = 0;
prekid = 0;
prvaTacka = (0,0)
poslednjaTacka =(0,0)
return line_segments
leva = [];
leva.append(left1)
leva.append(left2)
leva.append(left3)
leva.append(left4)
leva.append(left5)
19
leva.append(left6)
desna = [];
desna.append(right1)
desna.append(right2)
desna.append(right3)
desna.append(right4)
desna.append(right5)
desna.append(right6)
result = [];
result.append(result1)
result.append(result2)
result.append(result3)
result.append(result4)
result.append(result5)
result.append(result6)
fig, axes = plt.subplots(nrows=3, ncols=2, figsize = (20,20), dpi = 80)
ax = axes.ravel()
for i in range(0,6):
img_gauss,mag,angle,maximum,edges = canny_edge_detection(result[i],12, 0.
,→03, 0.7)
,→'green')
20
0.1.7 Zadatak 4
Funkcija lane_detection koja kao jedini ulazni argument prihvata sliku (jedan video frejm) i vraća
dva niza od po 4 elementa [xl1, yl1, xl2, yl2], [xr1, yr1, xr2, yr2] koji predstavljaju koordinate tačaka
koje jednoznačno određuju levu i desnu liniju trake u kojoj se automobil kreće. KOrišćenjem Hafove
transformacije za svaku tačku pronalaze se sve prave koje prolaze kroz tu tačku.
[239]: # cetvrti zadatak
def lane_detection(img_in):
img_in = skimage.img_as_float(img_in)
#korak 1: segmentacija
21
img_segment = segment_lanes(img_in)
img_gauss,mag,angle,maximum,img_edges =␣
,→canny_edge_detection(img_segment,12,0.03,0.7)
M,N = shape(img_edges)
#korak 3: Hafova transformacija
ang = np.array(double(list(range(-75, -45))))
ang = ang*np.pi/180
[out, angles, distances] = skimage.transform.hough_line(img_edges,theta=ang)
[intensity, peak_angles, peak_distances] = skimage.transform.
,→hough_line_peaks(out, angles, distances, threshold=None, num_peaks=1)
if(len(peak_angles)>0):
dist = peak_distances[len(peak_distances)-1]
ang = peak_angles[len(peak_angles)-1]
line = (dist, ang)
M,N = shape(img_edges)
origin,y0_pom,y1_pom,x0_pom,x1_pom = polar_to_XY (img_edges,line)
koeficijent = (y1_pom-y0_pom)/(origin[1]-origin[0])
x2 = int(N - abs((y1_pom-M)/koeficijent));
y2 = int(M)
y1 = 500;
x1 = int((y1 -y2 + koeficijent*x2)/koeficijent)
right = [];
tacka1 = (x2,y2)
tacka2 = (x1,y1)
right.append(tacka1)
right.append(tacka2)
else:
right = [(0,0),(0,M)]
ang = np.array(double(list(range(45, 75))))
ang = ang*np.pi/180
[out, angles, distances] = skimage.transform.hough_line(img_edges,theta=ang)
[intensity, peak_angles, peak_distances] = skimage.transform.
,→hough_line_peaks(out, angles, distances, threshold=None, num_peaks=1)
if(len(peak_angles)>0):
dist = peak_distances[len(peak_distances)-1]
ang = peak_angles[len(peak_angles)-1]
line = (dist, ang)
M,N = shape(img_edges)
origin,y0_pom,y1_pom,x0_pom,x1_pom = polar_to_XY (img_edges,line)
koeficijent = (y1_pom-y0_pom)/(origin[1]-origin[0])
x2 = int(N - abs((y1_pom-M)/koeficijent));
y2 = int(M)
22
y1 = 500;
x1 = int((y1 -y2 + koeficijent*x2)/koeficijent)
left = []
tacka1 = (x2,y2)
tacka2 = (x1,y1)
left.append(tacka1)
left.append(tacka2)
else:
left = [(0,0),(0,M)]
return left,right
fig=plt.figure( figsize=[20,20])
ax1=fig.add_subplot(111)
ax1.imshow(img, cmap='gray')
ax1.set_title('Konacna detekcija kolovoznih traka'), ax1.axis('off')
ax1.plot((left[0][0],left[1][0]), (left[0][1],left[1][1]),'red')
ax1.plot((right[0][0],right[1][0]), (right[0][1],right[1][1]),'red')
plt.show()
23
[247]: img3 = imread('../sekvence/test2.jpg')
left3, right3 = lane_detection(img3)
fig=plt.figure( figsize=[20,20])
ax1=fig.add_subplot(111)
ax1.imshow(img, cmap='gray')
ax1.set_title('Konacna detekcija kolovoznih traka'), ax1.axis('off')
ax1.plot((left3[0][0],left3[1][0]), (left3[0][1],left3[1][1]),'red')
ax1.plot((right3[0][0],right3[1][0]), (right3[0][1],right3[1][1]),'red')
24
[243]: img3 = imread('../sekvence/test3.jpg')
left3, right3 = lane_detection(img3)
fig=plt.figure( figsize=[20,20])
ax1=fig.add_subplot(111)
ax1.imshow(img, cmap='gray')
ax1.set_title('Konacna detekcija kolovoznih traka'), ax1.axis('off')
ax1.plot((left3[0][0],left3[1][0]), (left3[0][1],left3[1][1]),'red')
ax1.plot((right3[0][0],right3[1][0]), (right3[0][1],right3[1][1]),'red')
25
[244]: img3 = imread('../sekvence/test4.jpg')
left3, right3 = lane_detection(img3)
fig=plt.figure( figsize=[20,20])
ax1=fig.add_subplot(111)
ax1.imshow(img, cmap='gray')
ax1.set_title('Konacna detekcija kolovoznih traka'), ax1.axis('off')
ax1.plot((left3[0][0],left3[1][0]), (left3[0][1],left3[1][1]),'red')
ax1.plot((right3[0][0],right3[1][0]), (right3[0][1],right3[1][1]),'red')
26
[245]: img3 = imread('../sekvence/test5.jpg')
left3, right3 = lane_detection(img3)
fig=plt.figure( figsize=[20,20])
ax1=fig.add_subplot(111)
ax1.imshow(img, cmap='gray')
ax1.set_title('Konacna detekcija kolovoznih traka'), ax1.axis('off')
ax1.plot((left3[0][0],left3[1][0]), (left3[0][1],left3[1][1]),'red')
ax1.plot((right3[0][0],right3[1][0]), (right3[0][1],right3[1][1]),'red')
27
[246]: img3 = imread('../sekvence/test6.jpg')
left3, right3 = lane_detection(img3)
fig=plt.figure( figsize=[20,20])
ax1=fig.add_subplot(111)
ax1.imshow(img, cmap='gray')
ax1.set_title('Konacna detekcija kolovoznih traka'), ax1.axis('off')
ax1.plot((left3[0][0],left3[1][0]), (left3[0][1],left3[1][1]),'red')
ax1.plot((right3[0][0],right3[1][0]), (right3[0][1],right3[1][1]),'red')
28
[ ]:
29