Można sprawdzić działanie kilku trybów wyświetlania %matplotlib
i sprawdzić co wygodniejsze (i co działa...)
# lista (teoretycznie) dostępnych backendów:
%matplotlib --list
Zmiana może (gdy komunikat o nie udanej zmianie back-endu) wymagać restartu (menu: Kernel/Restart)
# Sprawdź co wygodniejsze:
%matplotlib inline
# czy:
# %matplotlib tk
import matplotlib.pyplot as plt
import skimage.data
print(skimage.data.astronaut().shape)
plt.imshow(skimage.data.astronaut(), interpolation='nearest')
plt.figimage(skimage.data.astronaut()) # powinno być bez skalowania (może nie działać przy %matplotlib inline)
Wczytaj obrazek "components/objects/fig.png"
(obrazki były spakowane razem z pierwszmi ćwiczeniami), poetykietuj go (skimage.measure.label
) i wyświetl (np. po zamianie na kolorowy obrazek przy użyciu skimage.color.label2rgb
).
Dla każdego obiektu oblicz jego pole powierzchnii (liczbę pikseli) używając operacji na tablicach NumPy i funkcji np. np.min
).
Potem użyj funkcji skimage.measure.regionprops
i wypisz pole powierzchni każdego obiektu.
Znajdz kontury obiektów (skimage.measure.find_contours
) i je narysuj.
contours = skimage.measure.find_contours(...)
# Display the image and plot all contours found
fig, ax = plt.subplots()
ax.imshow(img, interpolation='nearest', cmap=plt.cm.gray)
for n, contour in enumerate(contours):
ax.plot(contour[:, 1], contour[:, 0], linewidth=2)
ax.axis('image')
ax.set_xticks([])
ax.set_yticks([])
Rozpoznaj na obrazkach "fig.png"
oraz "fig2.png"
kształt każdego obiektu (koło, kwadrat, trójkąt). Użyj funkcji skimage.measure.approximate_polygon
.
Czy opracowana metoda jest odporna na dodatnie jeszcze jakiś zniekształceń (np. szumu)?
Uogólnij poniższą funkcję tak aby generowała obrazek z prostokątem o zadanych wymiarach (zamiast kwadratu) podzielonym w poziomie wzdłuż losowej linii (zamiast ustaloną łamaną).
import numpy as np
import skimage.draw
def gen():
img = np.zeros((110,110), np.uint8)
img[5:-5,5:-5] = 255
poly = np.array([[55,5],[40,30],[60,40],[45,80],[55,105]])
def drawpolyline(img, poly):
for p1,p2 in zip(poly[:-1],poly[1:]):
yy,xx = skimage.draw.line(p1[0],p1[1],p2[0],p2[1])
img[yy,xx] = 0
drawpolyline(img, poly)
return img
plt.imshow(gen())