Bodové jasové transformace
cv2py
curling
Histogramy
Histogram bývá často jedinou globální informací o obraze. Mužeme ho použít při nastavování podmínek pro snímání a digitalizaci, při změnách jasové stupnice nebo pro segmentaci obrazu na objekty a okolí.
Histogram jasu H(p) je vektor s počtem složek rovným počtu jasových úrovní p. Hodnota každé složky odpovídá četnosti bodů příslušného jasu p v obraze, takže pomocí histogramu získáme představu o rozdělení jasových úrovní v digitálním obraze. Histogram jasu, lze chápat jako odhad hustoty pravděpodobnosti rozdělení jasu v obraze. Absolutní histogram, relativní histogram, kumulativní (integrální) histogram a relativní kumulativní histogram jsou uvedeny dále.
absolutní
Matlab: imhist
import cv2
import numpy as np
import matplotlib.pyplot as plot
im = np.array([])
im = cv2.imread('curling.png',0)
plot.subplot(1,2,1), plot.imshow(im, cmap = 'gray')
plot.title('obrazek')
plot.subplot(1,2,2), plot.hist(im.ravel(), 256)
plot.title('histogram')
plot.show()
relativní
nezávisí na velikosti obrazu
kumulativní
\
tvar histogramu nezávisí na poloze a natočení objektů:
Python
Jasové transformace
Při bodové jasové transformaci dochází ke změně jasové stupnice. Změna intenzity obrazového bodu nezávisí na poloze bodu v obrazu. Transformace T výchozího jasu p na novou stupnici q je dána vztahem
q=T(p)
Obvykle transformace jasové stupnice jsou zesvětlení, ztmavení, zvýšení kontrastu a snížení kontrastu.
původní obraz:
zesvětlení
matlab: imadjust(obraz,[0 0.7],[0.3 1])
ztmavení
matlab: imadjust(obraz,[0.3 1],[0 0.7])
zvýšení kontrastu
matlab: imadjust(obraz,[0.3 0.7],[0 1])
snížení kontrastu
matlab: imadjust(obraz,[0 1],[0.3 0.7])
Prahování
Segmentace pomocí prahování je jednou z nejstarších metod segmentace obrazu na objekty. Díky výpočetní náročnosti jde o jednu z nejrychlejších metod segmentace. Metodu používáme tehdy, když se hledané objekty výrazně odlišují od pozadí. Volba prahu je pak stanovena tak, aby došlo k oddělení požadovaných objektů od pozadí. Při prahování dochází k transformaci vstupního obrazu f na výstupní obraz g. Výstupní obraz nabývá hodnoty 1 pro objekty s intenzitou vetší než práh, v opacném případě 0.Protože g nabývá pouze hodnot 0 a 1, jedná se o binární obraz. Matematický zápis je
Správná volba prahu je pro úspěšný výsledek prahování zásadní. Hodnotu prahu lze určovat interaktivne (pokusne), nebo pomocí některé z metod automatického určování prahu (napr. hledání lokálního minima).
Prahování můžeme provádět i pomocí více prahů, potom se jedná o prahování s více prahy (multi tresholding). Výstupní obraz má tolik počet úrovní roven počtu prahů plus jedna.
Prahovaní můžeme použít k vizuálnímu hodnocení. Jedná se o poloprahování a může být definováno takto
Prahování s jedním prahemobraz>210
Prahování s více prahy (obraz>210 & obraz<248)
Poloprahování double(obraz<248).*double(obraz)
Ekvalizace histogramu histeq
zobrazení více zastoupených objektů na úkor méně zastoupených objektů
ekv = cv2.equalizeHist(im)
plot.subplot(1,2,1), plot.imshow(ekv, cmap = 'gray')
plot.title('ekv. obrazek')
plot.subplot(122), plot.hist(ekv.ravel(), 256)
plot.title('ekv. histogram')
Geometrické transformace
Geometrické transformace popisují transformaci obrazové funkce f(i,j). Transformace může být rotace, zvětšení, posunutí zkosení, jejich kombinace. Geometrickou transformaci si mohu rozdělit na transformaci souřadnic a Interpolaci. Transformace souřadnic získává novou polohu každého bodu (ve spojitých souřadnicích). Interpolace získává z neceločíselných pozic souřadnic hodnotu jasu v celočíselných souřadnicích. Metody: aproximace - nejblizsi soused, linearni interpolace, bikubická interpolace.
Rotace imrotate(I,40)
import scipy.ndimage as nd
v,s = im.shape
#rotace 1
M = cv2.getRotationMatrix2D((s/2, v/2), 45, 1)
im3 = cv2.warpAffine(im, M, (s,v))
cv2.imshow('rotace 1', im3)
#rotace 2
im4 = nd.rotate(im, 45, reshape=True)
cv2.imshow('rotace 2', im4)
#rotace 3
body1 = np.float32([[0,0],[200,0],[50,200]])
body2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(body1,body2)
im5 = cv2.warpAffine(im, M, (s,v), flags=cv2.INTER_CUBIC)
cv2.imshow('rotace 3', im5)
Změna velikosti imresize(I,[40 50])
im2 = cv2.resize(im, (s/2, v/2))
cv2.imshow('zmenseny obraz', im2)
výsledný obraz závisí na typu interpolace jasu
Posun
body1 = np.float32([[0,0],[200,0],[50,200]])
body2 = np.float32([[50,100],[250,100],[100,300]])
M = cv2.getAffineTransform(body1,body2)
im6 = cv2.warpAffine(im, M, (s*2,v*2))
cv2.imshow('posun', im6)
Funkce v matlabu:
rotace imrotate
změna velikosti imresize
priklady v matlabu , priklad v C
úkoly:
1) načtěte si barevný obraz jpg.jpg, převeďte ho na šedotónový, vypočítejte z něj histogram, ten zobrazte pomocí funkce plot, v získaném obrázku určete práh tak, aby jste oddělili objekt od pozadí, šedotónový obraz naprahujte s tímto prahem
2) využijte mfile sousednost, který provádí výpočet matice sousednosti, v obraze barvy.bmp najděte nejmenší objet (je reprezentován nejmenším číslem na diagonále v matici sousednosti), najděte objekt s kterým sousedí nejmenší objekt nejvíce krát (největší číslo v daném řádku matice sousednosti) a prebarvěte nejmenší objekt na jas objektu s nímž sousedí nejvíce krát