Přejít na obsah

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

matplotlib.pyplot.hist

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

prah

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.

multiprah

Prahovaní můžeme použít k vizuálnímu hodnocení. Jedná se o poloprahování a může být definováno takto

poloprah


Prahování s jedním prahemobraz>210

histprah prah1

 

Prahování s více prahy (obraz>210 & obraz<248)

multiprahmultiprah2

 

Poloprahování double(obraz<248).*double(obraz)

poloprahpoloprahp

 


Ekvalizace histogramu histeq

histequal

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)


rotace

Změna velikosti imresize(I,[40 50])

im2 = cv2.resize(im, (s/2, v/2))

cv2.imshow('zmenseny obraz', im2)

Zmenseni

výsledný obraz závisí na typu interpolace jasu

typy

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