Képfeldolgozás • Képi információk kinyerése •
Fényképek minőségének javítása
1
B. Alapok 1. A Bitképek a programokban 1.1 A .Net 1.2 OpenCV Computer Vision library 2. Képfeldolgozás képsíkon 2.1. Konvolúció 2.2. Identitás 2.3. Zajcsökkentés 2.4. Élkiemelés (edge detection) 2.5. Élesítés (Shapening) 2.6. Sorrendi szűrések 2.7 Képek összeadása 2.8. Kép pixelek kezelése 3. Szegmentálás 3.1 Szín-, fényesség-hisztogram számítás 3.2 Szegmentálás küszöbértékekkel 3.3 Szegmentálás tartományokkal 3.4 Csoportosítások 4. Képek információinak feldolgozása (3D) 4.1 Pozíció-meghatározás 4.2 Kalibráció 4.3 Kontúrok keresése 4.4 A térlátás 5. Alakfelismerés 5.1 Alakfelismerés sablonillesztéssel 5.2 Alakfelismerés Hough transzformációval
2
6. Képfeldolgozás frekvencia tartományban 6.1 Fourier sorfejtés – 1-változós függvény 6.2 Fourier együtthatók 6.3 Fourier sorfejtés – 2-változós függvény 6.4 Kétváltozós Fourier együtthatók 6.5 Kétváltozós Fourier sor 6.6 A diszkrét Fourier-transzformáció 6.7 2D-s diszkrét Fourier-transzformáció 6.8 Képkezelés frekvencia-tartományban 6.9 Alakfelismerés frekvencia térben
3
B. Alapok Vektoros
CDR
Raszteres BMP DIB JPG
Meta True Type WYSWYG WMF, EMF
4
B.1 Színek B.1.1 A biológia
110-130 millió pálcika a világosság 5-7 millió csap a színes látás (érzékenyebb)
A csapoknak érzékenységük szerint három csoportja van: L-, M- és S-típusú csapok (long, medium, short),.
5
B.2 Színrendszerek L - a fény intenzitása r L( ) x( )d L(λ)
g L( ) y ( )d b L( ) z ( )d
λ -Hullámhossz RedGreenBlue
CyanMagentaYellow
LightnessHueSaturance
Kép = sík felület pontjaiban szín definíció 6
B.2.1 HLS-színmodell H a színárnyalatra (hue), L a fényességre (lightness), S pedig a telítettségre (saturation) utal. RGB – HSL 1.) 𝑟 =
𝑅
, 𝑔=
𝑅𝑚𝑎𝑥
𝐺 𝐺𝑚𝑎𝑥
, 𝑏=
𝐵 𝐵𝑚𝑎𝑥
2.) 𝑚𝑖𝑛 = min 𝑟, 𝑔, 𝑏 , 𝑚𝑎𝑥 = max(𝑟, 𝑔, 𝑏) 𝑚𝑖𝑛+𝑚𝑎𝑥 3.) 𝐿 = 2
4.) 𝑆 =
0,
ℎ𝑎 𝑚𝑖𝑛 = 𝑚𝑎𝑥, 𝑠𝑧ü𝑟𝑘𝑒 𝑘é𝑝
𝑚𝑎𝑥−𝑚𝑖𝑛 1+ 2𝐿−1
,
𝑒𝑔𝑦é𝑏𝑘é𝑛𝑡
0, 5.) H =
ℎ𝑎 𝑚𝑖𝑛 = 𝑚𝑎𝑥
𝑔−𝑏 , 𝑚𝑎𝑥−𝑚𝑖𝑛 𝑏−𝑟 2+ , 𝑚𝑎𝑥−𝑚𝑖𝑛 𝑟−𝑔
4+
𝑚𝑎𝑥−𝑚𝑖𝑛
,
ℎ𝑎 𝑚𝑎𝑥 = 𝑟 ℎ𝑎 𝑚𝑎𝑥 = 𝑔
ℎ𝑎 𝑚𝑎𝑥 = 𝑏
7
HSL – RGB
if (L <= 0.5) M2 = L *(1 + S); else M2 = L + S - L * S; M1 = 2 * L - M2; if (S == 0) R = G = B = L ; else h = H + 120; if (h > 360) h = h – 360; if (h < 60) R = ( M1 + ( M2 - M1 else if (h < 180) R = M2; else if (h < 240) R = M1 + ( M2 - M1 ) else R = M1; h = H; if (h < 60) G = ( M1 + ( M2 - M1 else if (h < 180) G = M2; else if (h < 240) G = M1 + ( M2 - M1 ) else G = M1; h = H – 120; if (h < 0) h += 360 if (h < 60) B = ( M1 + ( M2 - M1 else if (h < 180) B = M2; else if (h < 240) B = M1 + ( M2 - M1 ) else B = M1;
// R,G,B
) * h / 60);
// R // R
* ( 240 - h ) / 60; // R // R
) * h / 60;
// G // G
* ( 240 - h ) / 60; // G // G
) * h / 60;
// B // B
* ( 240 - h ) / 60; // B // B
8
Szín definíció fekete fehér (0,1)
szürke árnyalat (0..255)
színes paletta – index RGB RGBA HLS
9
Színfényesség-hisztogramm számítás
Windows → Dockable Dialogs → Histogram / Ablakok → Dokkolható párbeszédablakok → Hisztogramm Colors → Information → Histogram / Színek → Információ → Hisztogramm
db%
L
db%
db%
db%
db%
L
L
L
L
10
1 Képábrázolás 1.1 A .Net Bitképek a Bitmap bitkép mérettel, formátummal Format16bppGrayScale
- 16 bit per pixel 65536 árnyalat
Format24bppRgb
- 32 bit per pixel nem_ használt_R_G_B - 32 bit per pixel alpha_R_G_B - 64 bit per pixel alpha_R_G_B - Színindex (paletta)
Format32bppARgb
Format64bppARgb Indexed
11
1.1.1 Image Class Image absztrakt képtároló - ős System::Drawing::Bitmap raszteres System::Drawing::Imaging::MetaFile vektoros Függvények static int GetPixelFormatSize(PixelFormat pixfmt); Gdi
– GDI színkód (rgb)
Alpha
– áttetszőség
Format8bppIndexed
– index, 8 bit/ (256) szín.
static bool IsAlphaPixelFormat(PixelFormat pixfmt); áttetsző? static bool IsCanonicalPixelFormat( PixelFormat pixfmt); 32 bites? static bool IsExtendedPixelFormat( 12 PixelFormat pixfmt); 64 bites?
1.1.2 .Net Bitképek a Bitmap Class
using namespace System::Drawing::Bitmap; Az Image leszármazottja 1.1.2.1 Konstruktorok Bitmap(String) bitkép a file-ból (BMP, GIF, EXIF, JPG, PNG, TIFF.) Bitmap(Int32, Int32) bitkép mérettel Bitmap(Int32, Int32, PixelFormat) bitkép mérettel, formátummal Gdi – a pixelekben GDI színek Alpha AlphaRGB Format1bppIndexed 1 bit per pixel és színindex Format32bppRgbSpecifies 32 bit per pixel nem_ használt_R_G_B
1.1.2.2 Tulajdonságok Height - magasság HorizontalResolution - felbontás pixel/inch Palette - paletta lekérdezés, beállítás PixelFormat - pixel formátum VerticalResolution - felbontás pixel/inch Width - szélesség 14
1.1.2.3 Metódusok Color GetPixel(int x, int y) - pixel olvas void SetPixel(int x,int y,Color Color) - pixel ír void Save(String ^, ImageFormat ☼) - ☼ - Bmp, Emf, Exif, Gif, Guid, Icon, Jpeg, MemoryBmp, Png, Tiff, Wmf IntPtr GetHBitmap(String ^ fnev) - GDI bitkép
15
private: System::Void beolvasásToolStripMenuItem_Click( System::Object^ sender, System::EventArgs^ e) { try {// Retrieve the image. image1 = gcnew Bitmap( "C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg", true); // Set the PictureBox to display the image. pictureBox1->Image = image1; // Display the pixel format in Label1. this->Text = String::Format("Pixel format: {0}", image1->PixelFormat); pirosToolStripMenuItem->Enabled = true; } catch (ArgumentException^) { MessageBox::Show("Hiba.", "Ellenőrizd a file-t!"); } }
16
A GetPixel() és SetPixel() lassú private: System::Void pirosToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { try { // Retrieve the image. image1 = gcnew Bitmap( "C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg", true); int x, y; // Loop through the images pixels to reset color. for (x = 0; x < image1->Width; x++) { for (y = 0; y < image1->Height; y++) { Color pixelColor = image1->GetPixel(x, y); Color newColor = Color::FromArgb(pixelColor.R, 0, 0); image1->SetPixel(x, y, newColor); } } // Set the PictureBox to display the image. pictureBox1->Image = image1; // Display the pixel format in Label1. this->Text = String::Format("Pixel format: {0}", image1->PixelFormat); } catch (ArgumentException^) { MessageBox::Show("Hiba.", "Ellenőrizd a file-t!"); } }
17
1.1.2.4 Bitképek gyors módosítása A bitkép bitjeinek áttöltése a memóriába Módosítás, Visszatöltés
Szükséges a memóriaterület rögzítése (Image metódus) BitmapData^ LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format[, BitmapData^ bitmapData]); void UnlockBits(BitmapData^ bitmapdata); rect - a bitkép rögzíteni kívánt része ImageLockMode felsorolás ReadOnly, WriteOnly, ReadWrite, UserInputBuffer PixelFormat volt bitmapdata BitmapData osztály Height, Width, Stride a scanline szélessége, a scan0 az első pixel címe. Vissza BitmapData ref. osztály a bitkép adatait.
18
private: System::Void gyorsToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { Graphics ^ g = this->CreateGraphics(); g->DrawImage(image1, Point(0, 0)); Rectangle rect = Rectangle(0, 0, image1->Width, image1->Height); // Rögzítés System::Drawing::Imaging::BitmapData^ bmpData = image1->LockBits( rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, image1->PixelFormat); // Memóriatömb a Bitmapnek IntPtr ptr = bmpData->Scan0; int bytes = Math::Abs(bmpData->Stride) * image1->Height; array
^Values = gcnew array(bytes); // Átmásolás a memóriatömbbe System::Runtime::InteropServices::Marshal::Copy(ptr, Values, 0, bytes); // Módosítás for (int counter = 0; counterLength; counter++) { if (counter % 3!=1) Values[counter] = 0; } // Visszamásolás a memóriatömbből System::Runtime::InteropServices::Marshal::Copy(Values, 0, ptr, bytes); // Felszabadítás image1->UnlockBits(bmpData); g->DrawImage(image1, image1->Width, 0); pictureBox1->Image = image1; }
19
1.2 OpenCV Computer Vision Library Képkezelő, -feldolgozó függvények C interface eredetileg OpenCV 2.0 C++ interface
(http://opencv.org/)
1.2.1 MAT típus (osztály) Nem kell memóriát foglalni, felszabadítani Két rész header (információk: méret,tárolási típus, cím) – fix méretű pointer a pixelek adatai. Referencia-számláló rendszer (többen osztozhatnak ugyanazon a memóriaterületen) n dimenziós többcsatornás (elemenként pl. pixelenként tárolt adatok száma) 𝑴 𝒊𝟎 , 𝒊𝟏 , … 𝒊𝒏−𝟏 𝟎 ≤ 𝒊𝒌 < 𝒔𝒊𝒛𝒆[𝒌]
20
M egy lineáris n dimenziós tömb step – azon bájtok száma, amelyet egy elem ugrás takar size – a dimenziók határai 𝒂𝒅𝒅𝒓 𝑴 𝒊𝟎 , 𝒊𝟏 , … 𝒊𝒏−𝟏 = 𝒂𝒅𝒅𝒓 𝑴 + +𝑴. 𝒔𝒕𝒆𝒑 𝟎 ∙ 𝒊𝟎 +𝑴. 𝒔𝒕𝒆𝒑 𝟏 ∙ 𝒊𝟏 + ⋯ + +𝑴. 𝒔𝒕𝒆𝒑 𝒏 − 𝟏 ∙ 𝒊𝒏−𝟏 Pl: A3x3x3 byte tömb akkor step[0] = 9, step[1]=3, step[2]=1
Konstruktorok Mat::Mat() - üres Mat::Mat(Size size, int type) - size méretű type tömb Mat::Mat(int sor, int oszl, int type) - sor*oszl- méretű 2D-s type tömb Típus : CV_{U|S|F}C() pl: uchar ~ CV_8UC1 3-elemű float pontkoord ~ CV_32FC3
Megjelenítés ablakban void imshow( const string& winname, InputArray mat)
21
1.2.2 Képek beolvasása imread(const string& filename, int flags=1 ) flags • CV_LOAD_IMAGE_ANYDEPTH – Ha az inputnak adott a mélysége, egyébként 8-bit (<0). • CV_LOAD_IMAGE_COLOR – Színes (>0) • CV_LOAD_IMAGE_GRAYSCALE – Szürke árnyalat (=0) #include "stdafx.h" #include <stdio.h> #include using namespace cv; using namespace std; int main(int argc, char** argv) { Mat kepbe = imread( "C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg"); imshow("Kep", kepbe); for (;;) { int c = waitKey(30); if (c == 'q' || c == 'Q') break; } return 0; }
22
1.2.3 A VideoCapture osztály bool open( int device) bool open( const string &filename) VideoCapture & operator >> (Mat & image) #include #include #include #include
"stdafx.h" <stdio.h>
using namespace cv; using namespace std; int main(int argc, char** argv) { VideoCapture cap; if (argc > 1) cap.open(argv[1]); else cap.open(0); if (!cap.isOpened()) { std::cerr << "Cannot read video" << std::endl; return -1; } Mat frame; for (;;) { cap >> frame; if (frame.empty()) continue; imshow("Color", frame); int c = waitKey(30); if (c == 'q' || c == 'Q') break; } return 0; }
23
1.2.4 Képtípus konvertálása void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 ) src dst code
dstCn
– input: 8-bit unsigned/ 16-bit unsigned ( CV_16UC... )/ single floating-point. – output ugyanolyan méretű mint src. – konverzió CV_BGR2GRAY, CV_RGB2GRAY, CV_GRAY2BGR, CV_GRAY2RGB, CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB, CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB… – a csatornák száma független is lehet
cvtColor(frame,gray,COLOR_BGR2GRAY); imshow("Gray", gray);
1.2.5 Kép vágása (bináris kép) 1.2.5.1 A trackbar int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallbackonChange= on_trackbar, void* userdata=0) void on_trackbar(int, void*) {} double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
24
void on_trackbar(int, void*) { alpha = (double)alpha_slider / alpha_slider_max; } threshold(gray, tgray, alpha_slider, 255, 0); imshow("Treshold", tgray); createTrackbar("Küszöb", "Treshold", &alpha_slider, alpha_slider_max, on_trackbar);
1.3 GIMP
25
2. Képfeldolgozás képsíkon 2.1. Konvolúció - a képpont és környezete világosságának súlyozott összege
q( k , l )
R
S
t ( r , s ) g( k r , l s )
r R s S
g - a képpont eredeti világossága q - a képpont új világossága t - a súlyok (az operator), rendszerint páratlan számú sort és oszlopot tartalmaz
t g(k , l)
R
S
t(r , s) g(k r , l s)
r Rs S
26
2.1.1 Tulajdonságok Szimmetrikus R
S
t (r , s) g (k r , l s)
r Rs S
R
S
t (r ,s) g (k r , l s)
r Rs S
t ( g h) t g t h t ( v g ) (t v ) g
27
2.2.2 Konvolúciós mátrix
.
Szűrők → Általános → Konvolúciós Matrix / Filters → Generic → Convolution Matrix.
Matrix 5x5 mag.
Osztó / Divisor A mátrixszorzás osztója.
Eltolás / Offset Eltolást lehet hozzáadni (negatív értékek).
Szegély / Border Mi legyen a határokon?
Kiterjesztés / Extend A mag értékek nem játszanak szerepet.
Körbe / Wrap Mintha körkörös lenne a kép.
Crop A határon megmaradnak az értékek.
Csatornák / Chanels RGB Normalizálás A mátrixelemek összegével. Szingularitás kizárva Alpha súlyozás / Alpha-weighting Az áttetszőség kezelése.
2.2. Identitás
0 0 0 id 0 1 0 0 0 0
28
2.3. Képjavítások A kép egy pixelére a környező pixelek adatait alkalmazó matematikai algoritmus által szolgáltatott érték kerül
2.3.1 Elmosás / Blur
Filters → Blur → Blur / Szűrők → Elmosás → Elmosás
Minden (vagy a kiválasztott) pixel(ek) helyére adott méretű környezet súlyozott átlaga kerül – lágyít Többször használható - Ctrl/F 1 1 ⋯ 1 1 𝐾= ∙ 1 1 ⋯ 1 𝑘𝑠𝑖𝑧𝑒. 𝑤𝑖𝑑𝑡ℎ ∙ 𝑘𝑠𝑖𝑧𝑒. ℎ𝑒𝑖𝑔ℎ𝑡 ⋯ ⋯ ⋯ ⋯ 1 1 ⋯ 1
• A foltok szétterülnek • Lágyabb lesz a kép
29
0,10 0,15 0,17 0,22 0,20 0,18
0,12 0,65 0,41 0,32 0,26 0,22
0,13 0,39 0,40 0,36 0,31 0,25
0,12 0,26 0,33 0,34 0,30 0,28
0,1 0,18 0,25 0,36 0,33 0,30
0,09 0,13 0,30 0,33 0,33 0,32
=(A1+B1+C1+A2+B2+C2+A3+B3+C3)/9 0,10 0,15 0,17 0,22 0,20 0,18
0,12 0,28 0,34 0,29 0,26 0,22
0,13 0,31 0,38 0,34 0,29 0,25
0,12 0,24 0,32 0,33 0,31 0,28
0,10 0,20 0,28 0,32 0,32 0,30
0,09 0,13 0,30 0,33 0,33 0,32
30
2.3.1 A Blur konvolúciós mátrix
1 1 ⋯ 1 1 1 ⋯ 𝐾= ∙ ⋯ ⋯ ⋯ 𝑘𝑠𝑖𝑧𝑒. 𝑤𝑖𝑑𝑡ℎ ∙ 𝑘𝑠𝑖𝑧𝑒. ℎ𝑒𝑖𝑔ℎ𝑡 1 1 ⋯
1 1 ⋯ 1
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) •src – input (bárhány csatorna), a mélység CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. •dst – output ugyanakkora , mint az src. •ksize – méret. •anchor – a kernel kezdőpontja. •borderType – a képen kívül az extrapoláció.
blur( tgray, tbgray, Size(9,9), Point(-5,-5) ); imshow("Blur", tbgray);
31
2.3.2 Gauss-elmosás / Gaussian Blur
Filters → Blur → Gaussian Blur / Szűrők → Elmosás → Gauss-elmosás
Minden (vagy a kiválasztott) pixel(ek) helyére beállítható méretű környezet súlyozott átlaga kerül – lágyít Többször használható - Ctrl – F
IIR - “infinite impulse response” – nem számítógépes ábrák, nagy környezet. RLE - “run-length encoding”. Számítógépes ábra nagy egyszínű részekkel.
32
A GaussBlur konvolúciós mátrix A normális eloszlás haranggörbéje
1 𝜎 2𝜋
𝑒
−
𝑥−𝑚 2 2𝜎2
σ a szórás, m a várható érték Két dimenzióban a magfüggvény 𝐺 𝑥, 𝑦 =
𝑥 𝑦 − 2− 2 𝐾𝑒 2𝜎 2𝜎
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT ) •src – input (bárhány csatorna), a mélység CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. •dst – output ugyanakkora , mint az src. •ksize – méret. •sigmaX – x irányú szórás. •sigmaY – y irányú szórás. •borderType – a képen kívül az extrapoláció. GaussianBlur(gray, gbgray, Size(9,9), 5 , 5); imshow("GBlur", gbgray);
33
Szelektív Gauss-elmosás / Selective GaussianBlur Filters → Blur → Selective Gaussian Blur / Szűrők → Elmosás → Szelektív Gauss-elmosás
Csak akkor, ha a szomszédos értékek közti különbség kisebb, mint egy küszöb – megtartja a kontrasztokat
34
Csempézhető elmosás / Tileable Blur Filters → Blur → Tileable Blur / Szűrők → Elmosás → Csempézhető elmosás
Egyirányú keverés és simítás, célja a csempeszerű háttér átmeneteinek simítása.
𝐾=
1 1 1 … 1 1 𝑠𝑖𝑧𝑒
35
2.3.3 Sorrendi szűrések Rank-, medián szűrés
Egypontos hibákra jó, nem lineáris.
36
2.3.1.1 Despeckle / Folttalanítás
Filters → Enhance → Despecle / Szűrők → Kiemelés → Folttalanítás
Eltávolítja a szkennelés hibáit. A hiba körül kijelölt terület átlagával helyettesít. Median Adaptív / Adaptive A hiba körüli terület a kiválasztás tartalmának és a környezet hisztogrammának elemzése alapján kisebb, mint a megadott sugár. Rekurzív / Recursive Ismétel. Sugár / Radius 1 - (3x3 pixels) 20 - (41x41). Fekete-szint / Black level A hisztogram alsó határa (-1…255).
Fehér-szint / White level A felső határ (0…256).
37
2.4. Élkeresés / Edge detect Amount Mérték Wrap, Smear, Black Körbe, Elkenés, Fekete
– A differencia bázisa – Hogyan kezeljük a kép szélein kívüli pixeleket? (A vizsgált szakasz ellenkező oldalának pixelei a meghatározók, elkenten a határhoz közeli pontok alapján, feketének)
2.4.1 Élkeresés differencia kereséssel (Differencial) Filters → Edge Detection → Edge → Differential / Szűrők → Élkeresés → Szélek → Differenciál
Vízszintes és függőleges irányú változásokat a szürkeségi differencia képzésével emelhetjük ki.
0 0 0 r1 0 1 1 0 0 0 0 0 0 r2 0 1 0 0 1 0
Gr r12 r22
Kis Mérték (Amount) vékony éles vonalak, Nagy mérték vastag elmosódott vonalak.
, arctg
r2 r1
38
0,10 0,15 0,17 0,22 0,20 0,18
0,12 0,65 0,41 0,32 0,26 0,22
0,13 0,39 0,40 0,36 0,31 0,25
0,12 0,26 0,33 0,34 0,30 0,28
0,1 0,18 0,25 0,36 0,33 0,30
0,09 0,13 0,30 0,33 0,33 0,32
=ABS(A1-B1) 0,02 0,50 0,24 0,10 0,06 0,04
0,02 0,50 0,24 0,10 0,06 0,04
0,01 0,26 0,01 0,04 0,05 0,03
0,01 0,14 0,07 0,02 0,01 0,03
0,02 0,08 0,08 0,02 0,03 0,03
0,01 0,04 0,05 0,03 0,00 0,01
0,10 0,15 0,17 0,22 0,20 0,18
0,12 0,14 0,60 0,70 0,65 0,72
0,13 0,70 0,59 0,78 0,72 0,80
0,12 0,26 0,66 0,70 0,75 0,80
0,1 0,18 0,22 0,21 0,18 0,20
0,09 0,13 0,20 0,23 0,25 0,20
=ABS(A1-B1) 0,02 0,01 0,43 0,48 0,45 0,54
0,02 0,01 0,43 0,48 0,45 0,54
0,01 0,56 0,01 0,08 0,07 0,08
0,01 0,445 0,07 0,08 0,03 0
0,02 0,0775 0,44 0,49 0,57 0,6
Differeciál
0 0 0 r1 0 1 1 0 0 0 0 0 0 r2 0 1 0 0 1 0
Gr r12 r22 arctg
r2 r1
0,01 0,04375 0,02 0,02 0,07 0
39
,
2.4.2 A változás sebességének vizsgálata (Gradient) Vízszintes és függőleges irányú változásokat parciális differencia képzésével emelhetjük ki.
0 g 1 d (k , l ) g (k , l 1) g (k , l 1) 1 x 2 0 0 g 1 d (k , l ) g (k 1, l ) g (k 1, l ) 0 x 2 0
0 0 0 1 0 0
1 0 0 0 1 0
Gr r12 r22
, arctg
r2 r1
40
0,1 0,15 0,17 0,22 0,2 0,18
0,12 0,65 0,41 0,32 0,26 0,22
0,13 0,39 0,4 0,36 0,31 0,25
0,12 0,26 0,33 0,34 0,3 0,28
0,1 0,18 0,25 0,36 0,33 0,3
0,09 0,13 0,3 0,33 0,33 0,32
=GYÖK( (B3-B1)*(B3-B1))+((C2-A2)*(C2-A2))/2 0,053852 0,530094 0,260192 0,141421 0,080623 0,5004 0,33205 0,30645 0,23205 0,16125 0,245153 0,38445 0,03045 0,0832 0,1962 0,10198 0,16125 0,09405 0,03045 0,0832 0,063246 0,105 0,11605 0,0618 0,0618 0,044721 0,05 0,067082 0,028284 0,036056 0,1 0,15 0,17 0,22 0,2 0,18
0,12 0,14 0,6 0,7 0,65 0,72
0,13 0,7 0,59 0,78 0,72 0,8
0,12 0,26 0,66 0,7 0,75 0,8
0,1 0,18 0,22 0,21 0,18 0,2
0,098489 0,23205 0,301496 0,33 0,330151 0,320156 0,09 0,13 0,2 0,23 0,25 0,2
Gradiens
0 0 0 1 1 0 1 2 0 0 0
0 1 0 1 0 0 0 2 0 1 0
Gr r12 r22 arctg
,
r2 r1
=GYÖK( (B3-B1)*(B3-B1))+((C2-A2)*(C2-A2))/2 0,6652 0,6652 0,5768 0,56125 0,5202 0,5202
0,6652 0,6652 0,5768 0,56125 0,5202 0,5202
0,2258 0,2258 0,0632 0,00845 0,1002 0,1002
0,6658 0,6658 0,4668 0,57405 0,545 0,545
0,1372 0,1372 0,46045 0,4708 0,50005 0,50005
0,1372 0,1372 0,46045 0,4708 0,50005 0,50005
41
2.4.2.1 Roberts módszere
Filters → Edge Detection → Edge → Roberts / Szűrők → Élkeresés → Szélek → Roberts
A változás sebessége a jobbra lefelé és a balra lefelé szomszéd vizsgálatával. Az átlós, vékonyabb vonalakat keresi.
1 0 0 1 r1 , r2 1 0 0 1 Gr r12 r22
,
4
arctg
r1 r2
Inverz Kis Mérték (Amount) vékony éles vonalak, Nagy mérték vastag elmosódott vonalak.
42
1 0 0 1 r1 , r 2 1 0 0 1
Roberts
Gr r12 r22
0,10 0,15 0,17 0,22 0,20 0,18
0,12 0,14 0,60 0,70 0,65 0,72
0,13 0,70 0,59 0,78 0,72 0,80
0,12 0,26 0,66 0,70 0,75 0,80
0,1 0,18 0,22 0,21 0,18 0,20
,
4
arctg
r1 r2
0,09 0,13 0,20 0,23 0,25 0,20
=GYÖK((B2-A1)^2+(B1-A2)^2) 0 0 0 0 0 0
0,028284 0,014142 0,59397 0,070711 0,042426 0,127279
0,022361 0,54 0,13 0,586003 0,552268 0,598164
0,014142 0,701231 0,655229 0,070711 0,05099 0,086023
0,022361 0,430327 0,009014 0,553173 0,672086 0,806102
0,022361 0,071556 0,4004 0,630317 0,692026 0,778332
43
2.4.2.2 Prewit módszere
Filters → Edge Detection → Edge → Prewit compass/ Szűrők → Élkeresés → Szélek → Prewit iránytű
A változás sebessége a vízszintes és a függőleges irányban A vízszintes és a függőleges vonalakat keresi.
1 1 1 1 p1 0 0 0 , 6 1 1 1
1 0 1 1 p2 1 0 1 6 1 0 1
Gr P12 P22
, arctg
P1 P2
Inverz
Szög a vízszinthez képest, vastagabb vonalak. Két ponthármas átlaga
Kis Mérték (Amount) vékony éles vonalak, Nagy mérték vastag elmosódott vonalak.
44
Prewit
1 1 1 1 p1 0 0 0 , 6 1 1 1 0,10 0,15 0,17 0,22 0,20 0,18
0,12 0,14 0,60 0,70 0,65 0,72
0,13 0,70 0,59 0,78 0,72 0,80
0,12 0,26 0,66 0,70 0,75 0,80
1 0 1 1 p2 1 0 1 6 1 0 1 0,1 0,18 0,22 0,21 0,18 0,20
Gr P12 P22
, arctg
P1 P2
0,09 0,13 0,20 0,23 0,25 0,20
=GYÖK(HATVÁNY(((I10-I8)+(J10-J8)+(K10-K8))/6;2)+HATVÁNY(((K8-I8)+(K9-I9)+(K10-I10))/6;2)) 0,236884 0,236884 0,281119 0,252438 0,283333 0,283333
0,236884 0,236884 0,281119 0,252438 0,283333 0,283333
0,248484 0,248484 0,182483 0,052308 0,038006 0,038006
0,241569 0,241569 0,260027 0,248484 0,285589 0,285589
0,164764 0,164764 0,200589 0,238915 0,261858 0,261858
0,164764 0,164764 0,200589 0,238915 0,261858 0,261858
45
2.4.2.3 Sobel módszere A változás sebessége a vízszintes és a függőleges irányban. A vizsgált pont sora és oszlopa duplán számít. A vízszintes és a függőleges vonalakat keresi.
1 2 1 1 0 1 1 1 s1 0 0 0 , s2 2 0 2 8 8 1 1 0 1 2 1 Gr s12 s22
, arctg
Filters → Edge Detection → Edge → Sobel/ Szűrők → Élkeresés → Szélek → Sobel
s1 s2 Filters → Edge Detection → Sobel/ Szűrők → Élkeresés → Sobel
Kis Mérték (Amount) vékony éles vonalak, Nagy mérték vastag elmosódott vonalak.
46
Sobel
1 2 1 1 0 1 1 1 s1 0 0 0 , s2 2 0 2 8 8 1 1 0 1 2 1 Gr s12 s22
0,10 0,15 0,17 0,22 0,20 0,18
0,12 0,14 0,60 0,70 0,65 0,72
0,13 0,70 0,59 0,78 0,72 0,80
, arctg 0,12 0,26 0,66 0,70 0,75 0,80
0,1 0,18 0,22 0,21 0,18 0,20
s1 s2 0,09 0,13 0,20 0,23 0,25 0,20
Inverz =GYÖK((A3-A1+2*(B3-B1)+C3-C1)^2+(C1-A1+2*(C2-A2)+C3-A3)^2)/8 0,312352 0,312352 0,342951 0,291325 0,283395 0,283395
0,312352 0,312352 0,342951 0,291325 0,283395 0,283395
0,307297 0,307297 0,30896 0,131529 0,091924 0,091924
0,321386 0,321386 0,331552 0,285112 0,287321 0,287321
0,187604 0,187604 0,223397 0,24944 0,259052 0,259052
0,187604 0,187604 0,223397 0,24944 0,259052 0,259052
47
2.4.2.4 Robinson módszere A változás sebessége a nyolc irányban vizsgálva, átlagolva. A vizsgált pont sora és oszlopa átlói duplán számítanak. A maximális határozza meg az irányt.
1 0 1 0 1 2 1 2 1 2 1 0 2 0 2 , 1 0 1 , 0 , 1 0 1 0 0 1 0 1 2 1 0 1 2 1 0 1 2 1 2 1 2 1 2 1 0 1 0 1 0 2 0 2 , 1 0 1 , 0 0 0 , 1 0 1 1 0 1 2 1 0 1 2 1 0 1 2
Inverz
48
2.4.2.5 Élkeresés a változás gyorsulása alapján (Laplace) Filters → Edge Detection → Edge → Laplace/ Szűrők → Élkeresés → Szélek → Laplace
d d (k , l 1) d (k , l ) x g (k , l ) g (k , l 1) g (k , l 1) g (k , l )
dd (k , l )
Vízszintes Függőleges
g (k , l 1) 2 g (k , l ) g (k , l 1) Vízszintes + függőleges
Vízszintes+függőleges+átlós
1
2 1
1 , 2 , 1
0 1 0 1 4 1 , 0 1 0
Kis Mérték (Amount) vékony éles vonalak, Nagy mérték vastag elmosódott vonalak.
1 1 1 1 8 1 1 1 1
49
1 1 1 1 8 1 1 1 1
Laplace
0,1 0,15 0,17 0,22 0,2 0,18
0,12 0,14 0,6 0,7 0,65 0,72
0,13 0,7 0,59 0,78 0,72 0,8
0,12 0,26 0,66 0,7 0,75 0,8
0,1 0,18 0,22 0,21 0,18 0,2
0,09 0,13 0,2 0,23 0,25 0,2
=ABS(8*B2-A1-B1-C1-A2-C2-A3-B3-C3)/3 A normálás miatt 0,48 0,48 0,993333 0,206667 0,48 0,48 0,993333 0,206667 0,45 0,45 0,06 0,546667 0,556667 0,556667 0,29 0,496667 0,293333 0,293333 0,046667 0,536667 0,293333 0,293333 0,046667 0,536667
0,113333 0,113333 0,27 0,503333 0,633333 0,633333
0,113333 0,113333 0,27 0,503333 0,633333 0,633333
50
2.4.2.6 Canny féle élmeghatározás háttere 1.
Gauss zajszűrés
2.
Vízszintes és függőleges gradiens komponensek Az irány kerekítve 0,45,90,135 fokra
3.
A nem maximum pixelek eltávolítása
4.
Gradiens küszöb 𝐺 > 𝑘ü𝑠𝑧ö𝑏𝑓𝑒𝑙𝑠ő ⇒ é𝑙 𝑗𝑒𝑙ö𝑙𝑡 𝐺 < 𝑘ü𝑠𝑧ö𝑏𝑎𝑙𝑠ó ⇒ 𝑛𝑒𝑚 é𝑙𝑗𝑒𝑙ö𝑙𝑡 Ha 𝐺 > 𝑘ü𝑠𝑧ö𝑏𝑎𝑙𝑠ó és 𝐺 < 𝑘ü𝑠𝑧ö𝑏𝑓𝑒𝑙𝑠ő éljelölt ha a szomszédos 𝐺 > 𝑘ü𝑠𝑧ö𝑏𝑓𝑒𝑙𝑠ő 2:1 vagy 3:1 a javasolt 𝑘ü𝑠𝑧ö𝑏𝑓𝑒𝑙𝑠ő :𝑘ü𝑠𝑧ö𝑏𝑎𝑙𝑠ó arány
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )
•image •edges •threshold1 •threshold2 •apertureSize •L2gradient
– egy csatornás 8-bit input. – output él térkép azonos méretben. – alsó határ. – felső határ. – a Sobel() operátor mérete. – pontosabb, vagy kevésbé pontos gradiens norma.
Canny(gray, edge, alpha_slider / 2, alpha_slider); imshow("Canny", edge); createTrackbar("Küszöb", "Canny", &alpha_slider, alpha_slider_max, on_trackbar);
51
2.4.2.7 Gaussok különbsége / Different of Gaussian DoG Filters → Edge Detection → Different of Gaussian / Szűrők → Élkeresés → Gaussok különbsége
Két különböző Gauss elmosás különbsége
Normalizálás növeli az eredmény kontrasztot, Inverz is lehet
52
2.5 Sharpen / Élesítés
Filters → Enhance → Sharpen / Szűrők → Kiemelés → Élesítés
Kiemeli az éleket (tehet bele fals éleket is)
Élesség / Sharpness
2.5.1 Egy módszer (Sharpe)
k 0 S Id k L4 k 1 4 k 0 k
0 k 0
Élesítő tényező (1/4, 1/8, 1/16)
=+
53
2.5.2 Zajos képeknél
(salt and pepper) az élesítés ront Növelt területű Prewitt operátor – zajcsökkentő élkiemelés 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 , 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
55
2.5.3 Képek összeadása addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
•src1 – első input tömb. •alpha – első súly. •src2 – második input tömb azonos méret. •beta – második súly. •dst – kimenet azonos méret. •gamma – skalar minden összeghez hozzáadva. •dtype – opcionális a kimenő mélység azonosnál -1. imshow("Color", frame); GaussianBlur(frame, image, cv::Size(0, 0), 3); addWeighted(frame, 1.5, image, -1.25, 0, image); imshow("Weight", image);
56
2.6 NL szűrő / NL filter
Filters → Enhance → NL-filter / Szűrők → Kiemelés → NL szűrő
NL - Non Linear (Unix pnmnlfilt program) Elmosás (smoothing), folttalanítás (despeckle) és élkeresés (edge) funkciók egymás után. Az egész rétegen dolgozik 3x3 környezet helyett hét darab hatszöget használ (méhsejtek), melyek által érintett pixelek átlagát számolja. A Sugár (Radius) a méhsejtek méretét határozza meg. (0.33, csak az aktuális pixel, 1 - 3x3 mag) Alpha a szűrőben résztvevő elemek száma Három működési mód
6.6.1 Alpha vágott középérték / Alpha trimmed A középső pont színét(fényességét) a saját maga és a környezető hat pont átlagával helyettesíti, úgy hogy az alpha által megadott szélső hányad nem kerül be az átlagszámításba, Alpha=0 - konvolúció, Alpha=1 – medián – kiveszi az egypixeles zavarokat.
6.6.2 Optimális becslés / Optimal estimation - Simítás Adaptív, minden pixel körül a simítás a szórással fordítottan arányos (a kis szórás valószínű hiba). A szórás Sugár / Radius 0.8 és 1 között értelmes. Minél nagyobb az Alpha, annál jobban simít.
6.6.3 Élkiemelés / Edge enhancement A símítás (elmosás) inverze. (javasolt Alpha=0.1-0.9, Radius=0.5-0.9)
57
2.6. Kép pixelek
𝒂𝒅𝒅𝒓 𝑴 𝒊𝟎 , 𝒊𝟏 , … 𝒊𝒏−𝟏 = 𝒂𝒅𝒅𝒓 𝑴 + +𝑴. 𝒔𝒕𝒆𝒑 𝟎 ∙ 𝒊𝟎 +𝑴. 𝒔𝒕𝒆𝒑 𝟏 ∙ 𝒊𝟏 + ⋯ + 𝑴. 𝒔𝒕𝒆𝒑 𝒏 − 𝟏 ∙ 𝒊𝒏−𝟏
threshold(gray, tgray, alpha_slider, 255, 1); imshow("Treshold", tgray); createTrackbar("Küszöb", "Treshold", &alpha_slider, alpha_slider_max, on_trackbar); int ux = 0; int uy = 0; int udb = 0; uchar * pixelPtr = (uchar*)tgray.data; //pixel tömb pointer for (int ii = 0; iialpha_slider) { ux += jj; uy += ii; udb++; } } ux = (float)ux / udb; uy = (float)uy / udb;// Az átlagok for (int ii = 0; ii
58
6.6 NL szűrő / NL filter
Filters → Enhance → NL-filter / Szűrők → Kiemelés → NL szűrő
NL - Non Linear (Unix pnmnlfilt program) Elmosás (smoothing), folttalanítás (despeckle) és élkeresés (edge) funkciók egymás után. Az egész rétegen dolgozik 3x3 környezet helyett hét darab hatszöget használ (méhsejtek), melyek által érintett pixelek átlagát számolja. A Sugár (Radius) a méhsejtek méretét határozza meg. (0.33, csak az aktuális pixel, 1 - 3x3 mag) Alpha a szűrőben résztvevő elemek száma Három működési mód
6.6.1 Alpha vágott középérték / Alpha trimmed A középső pont színét(fényességét) a saját maga és a környezető hat pont átlagával helyettesíti, úgy hogy az alpha által megadott szélső hányad nem kerül be az átlagszámításba, Alpha=0 - konvolúció, Alpha=1 – medián – kiveszi az egypixeles zavarokat.
6.6.2 Optimális becslés / Optimal estimation - Simítás Adaptív, minden pixel körül a simítás a szórással fordítottan arányos (a kis szórás valószínű hiba). A szórás Sugár / Radius 0.8 és 1 között értelmes. Minél nagyobb az Alpha, annál jobban simít.
6.6.3 Élkiemelés / Edge enhancement A símítás (elmosás) inverze. (javasolt Alpha=0.1-0.9, Radius=0.5-0.9)
59
3. Szegmentálás Szegmentálás, csoportosítás , rendezés érzékelés alapján (Segmentation, grouping, perceptual organization): • az összetartozó jellemzők összegyűjtése, csoportosítása
Szegmentálás felülről lefelé (Top-down ↓): • közös ismert objektum hasonló pixeleinek keresése
Szegmentálás lentről fölfelé (Bottom-up ↑): • azonos jellegű pixelek összegyűjtése pixelből indítva
60
Színfényesség-hisztogramm számítás
Windows → Dockable Dialogs → Histogram / Ablakok → Dokkolható párbeszédablakok → Hisztogramm Colors → Information → Histogram / Színek → Információ → Hisztogramm
db%
L
db%
db%
db%
db%
L
L
L
L
61
3.1.1 Szegmentálás küszöbértékekkel (↓) Ha a hasonló intenzitású keresett elem és a háttér között nagy a kontraszt. k(x,y)<=T (objektum) k(x,y)>T (háttér)
db%
T
vagy k(x,y)>=T (objektum) k(x,y)
L intenzitás
Colors → Treshold / Színek → Küszöbszint
62
3.1.2 Szegmentálás küszöbértékekkel Ha a hasonló intenzitású keresett elem és a háttér között db% T nagy a kontraszt. k(x,y)<=T (objektum) k(x,y)>T (háttér) threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)¶
L intenzitás
• src – input tömby (1 csatorna, 8-bit vagy 32-bit floating point). • dst – output tömb azonos méret. • thresh – a threshold érték. • maxval – a használt max érték (THRESH_BINARY és THRESH_BINARY_INV esetén. • type – típus. •THRESH_BINARY •THRESH_BINARY_INV •……..
threshold(gray, tgray, alpha_slider, 255, 0); imshow("Treshold", tgray);
63
7.1.1 Küszöbök színenként (↓)
Colors → Levels / Színek → Színszintek
(Fotó javítás pl)
Beállítások mentése Csatorna: Érték, vörös, zöld, kék, alfa Bemeneti szintek Fekete pont – alatta minden fekete az input Fehér pont – felette minden fehér az input Szürke – Az adott intenzitásnál lesz a kimenet intenzitása közepes (fordított fényerő) Kimeneti szintek Fekete pont – Az outputon a feketéből ez lesz (levágja a kis intenzitásokat) Fehér pont – Az outputon a fehérből ez lesz (levágja a nagy intenzitásokat)
7.1.1.1 Intenzitásváltás intenzitásértéknél Görbék
Színek → Görbék
Fényerő az adott intenzitásnál
Output intenzitás Input intenzitás
64
3.2.1 Küszöbérték globális hisztogram alapján 3.2.1.1 Isodata algoritmus I. A hisztogram két részre (T0) II. A két jellemző terület intenzitás közepe
𝒎𝟏 (𝑻𝟎 ) =
𝑳𝒊 <𝑻𝟎
𝒑𝒊 𝑳𝒊
𝑳𝒊 <𝑻𝟎 𝒑𝒊
𝑳𝒊 ≥𝑻𝟎
𝑴𝟏 (𝑻𝟎 ) =
𝑳𝒊 ≥𝑻𝟎
III. Az új közép T1=(M1+m1)/2 …… 𝒎𝒋+𝟏 (𝑻𝒋 ) =
𝑳𝒊 <𝑻𝒋
𝒑𝒊 𝑳𝒊
𝑳𝒊 <𝑻𝒋 𝒑𝒊
…… IV. Ameddig |Tj+1- Tj|<ε
𝑴𝒋+𝟏 (𝑻𝒋 ) = p - db%
…m2 m1
𝒑𝒊 𝑳𝒊 𝒑𝒊
𝑳𝒊 ≥𝑻𝒋
𝒑𝒊 𝑳𝒊
𝑳𝒊 ≥𝑻𝒋
𝒑𝒊
T T1 T0 …M2 M1
65
3.2.1.2 Otsu módszere Keresi azt a T küszöbértéket, melyre minimális a két rész szórásnégyzeteinek súlyozott átlaga (𝝈𝟐 ) 𝝈𝟐 (𝑻) = 𝝎𝟏 𝑻 ∗ 𝝈𝟐 𝟏 +𝝎𝟐 𝑻 ∗ 𝝈𝟐 𝟐 Darabszámok a hisztogram két felén 𝝎𝟏 (𝑻) = 𝑳𝒊 <𝑻 𝒑𝒊 𝝎𝟐 (𝑻) = 𝑳𝒊≥𝑻 𝒑𝒊 A pi hisztogram elemekkel kifejezve a várható érték 𝝁𝟏 (𝑻) =
𝑳𝒊 <𝑻 𝒑𝒊 𝑳𝒊
𝝁𝟐 (𝑻) =
𝝎𝟏 (𝑻)
𝑳𝒊 ≥𝑻 𝒑𝒊 𝑳𝒊
𝝎𝟐 (𝑻)
A szórásnégyzet a két félen 𝝈𝟏 𝑻 =
𝑳𝒊 <𝑻
𝒑𝒊 −𝝁𝟏 (𝑻) 𝟐
𝝎𝟏 (𝑻)
Bizonyítható, hogy 𝝈𝟐 (𝑻) = 𝝎𝟏
Γ 𝟐 (𝑻) = 𝝎𝟏 𝑻 ∗ 𝝎𝟐 𝑻 ∗ maximális
𝝈𝟐 𝑻 =
𝑳𝒊 ≥𝑻
𝒑𝒊 −𝝁𝟏 (𝑻) 𝟐 𝝎𝟐 (𝑻)
𝑻 ∗ 𝝈𝟐 𝟏 +𝝎𝟐 𝑻 ∗ 𝝈𝟐 𝟐 minimális T 𝝁𝟏 𝑻 − 𝝁𝟐 𝑻 p (db) µ2 µ1
ha
3.2.2 Küszöbérték lokális hisztogram alapján 3.2.2.1 Niblack algoritmus Vágás a lokális várható érték (m) és a standard szórásnégyzet 𝑘 = −0.2 (s) alapján. 𝑻𝑵𝒃 = 𝑚 + 𝑘 ∗ 𝑠 𝑻𝑵𝒃
1 =𝑚+𝑘∗ ∗ 𝑁𝑝
𝑁𝑃
𝑝𝑖 − 𝑚
2
𝑝𝑖 𝑎 𝑝𝑜𝑛𝑡𝑜𝑘 "𝑠𝑧í𝑛𝑒„
𝑖=1
𝑁𝑝 𝑎 𝑝𝑜𝑛𝑡𝑜𝑘 𝑠𝑧á𝑚𝑎
3.2.2.2 Sauvola algoritmus 𝑻𝑺 = 𝑚 ∗ 1 + 𝑘 ∗ 1 −
2∗𝑠 max(𝑝𝑖 )
𝑘 = 0.5
3.2.2.3 Wolf módszer 𝑻𝑾
𝑠 = 1 − 𝑘 ∗ 𝑚 + 𝑘 ∗ min 𝑝𝑖 + 𝑘 ∗ ∗ 𝑚 − min 𝑝𝑖 max 𝑝𝑖 𝑘 = 0.5
3.2.2.4 Feng algoritmus
𝑻𝑭 = 1 − 𝑘 ∗ 𝑚 + 𝑘 ∗ min 𝑝𝑖 + 𝑘 ∗
𝑠 ∗ 𝑚 − min 𝑝𝑖 max 𝑝𝑖 𝑘 = 0.5
67
3.3 Szegmentálás tartományokkal A kép tartományai legyenek Ti-k! • A tartományok lefedik a teljes (T) képet • A tartományoknak nincs közös pontjuk
∪ 𝑇𝑖 = 𝑇 𝑇𝑖 ∩ 𝑇𝑗 = ∅ ℎ𝑎 𝑖 ≠ 𝑗
• Minden tartományra megfogalmazható homogenitási kritérium (H) 𝐻(𝑇𝑖 ) = 𝑖𝑔𝑎𝑧 • Szomszédos tartományok uniója nem homogén 𝐻(𝑅𝑖 ∪ 𝑅𝑗 ) = ℎ𝑎𝑚𝑖𝑠 ℎ𝑎 𝑅𝑖 é𝑠 𝑅𝑗 𝑠𝑧𝑜𝑚𝑠𝑧.
68
3.3.1 Elárasztás 3.3.1.1 Tartománymagok kijelölése (pl. egy nem sorolt pont) 3.3.1.2 Tartományok növelése a homogenitási feltétellel • szín, inhomogenitás statisztika a tartományon…
3.3.1.3 Példa növelés statisztika alapján Legyen T tartományban N pont! 𝒑𝒊 a pontok intenzitása P a vizsgált szomszédos pont int. 𝟏 𝝁= várható érték 𝑻 𝒑𝒊 𝑵
𝝈𝟐
=
𝝉=
𝟏 𝑵−𝟏 𝑵 𝑵+𝟏
𝑻
∗
𝝁 − 𝒑𝒊
n- szabadságfok
𝟐 korrigált tapasztalati szórásnégyzet
𝑷−𝝁 𝟐 𝝈𝟐
statisztika (N-1) szabadság fokú student eloszlású-e? 69 τ≤ 𝑲 𝒌ü𝒔𝒛ö𝒃𝒔𝒛á𝒎 akkor szomszédos pont a régióhoz tartozik.
3.3.2 Vágás és egyesítés Legyen a homogenitási feltétel P(T) = igaz ha a T tartomány pontjai kevéssé eltérő színűek! 1. Vágjuk az inhomogén képet (P(T)=false) négy részre! 2. Ha a szomszédos területek homogének P(Ti+ Ti+1)=igaz, akkor azokat vonjuk össze. 3. Az inhomogén területeket vágjuk újabb 4 részre! 1
|:
2
3 :|
70
3.4 Csoportosítások 3.4.1 Klaszterezés Legyen adott k darab diszjunkt tartomány (klaszter)! C1, C2 ,… Ck! A pontok intenzitása 𝑝𝑖 Jelölje μ1, μ2 ,… μk az intenzitás-középértékeket, akkor a Least Square Error!
𝑘
𝐿𝑆𝐸 =
𝑝𝑖 − 𝜇𝑗
2
𝑗=1 𝑝𝑖 ∈𝐶𝑗
Az összes lehetséges klaszterezés közül válasszuk az 𝐿𝑆𝐸 = 𝑚𝑖𝑛 esetet!
71
3.4.2 K-means algoritmus 1.
Legyen Y és Z két olyan képpont melyek intenzitás-különbsége (xyIntenzitás, xyRGB térben mért távolsága) maximális a képen! Soroljuk a képpontokat (xyIntenzitás, xyRGB térben) a közelebbihez! Ezek alkotják a kezdeti klasztereket.
2.
Minden képpontot soroljunk klaszterhez aszerint, hogy melyik intenzitáshoz (xyIntenzitás, xyRGB-hez) van közelebb! (Az első lépésben ez már megvan.) Számítsuk ki a klaszterben lévő pontok átlagos intenzitását (xyIntenzitás, xyRGB átlag)!
3.
Legyen X az a pont amelyik intenzitását (xyIntenzitás, xyRGB távolságát) tekintve leginkább eltér (D) saját klaszterének intenzitás átlagától!
4.
Legyen q a klaszterek átlagintenzitásai (átlag xyIntenzitás, xyRGB távolságai) közti átlagos különbség!
5.
Ha D>q/2, akkor új klaszter keletkezett az aktuális X középponttal és vissza a 2.-pontra.
72
3.4.3 Részhalmazokra bontás fuzzy logikával 1. A hibás pontok kiszűrése 2. A pontok fényessége közti különbségek minimális, átlagos és maximális értéke minimum, átlag és maximum. 3. A pontok fényessége közti különbség kicsi, közepes és nagy lehet. Annak valószínűségee, hogy két pont távolságuk alapján egy- vagy különböző csoportba tartoznak, az ábra, szakaszonként lineárisan változó görbéi szerint alakul (fuzzy-függvények) 4. Válasszuk ki a legfényesebb pontot! 3. Vizsgáljuk az összes többi pontot! Ha az éppen vizsgált pont és a legfényesebb pont fényességének különbsége legnagyobb valószínűséggel nagy, akkor a pont a nemfényes csoportba kerül 4. Egyébként a fényesek közé.
valószínűség 1
kicsi
minimum
közepes
átlag
nagy
maximum
pontpárok távolsága
73
3.4.4 Mean shift szegmentálás (Intenzitás) vagy (RGB) az (xyIntenzitás) vagy (xyRGB) tér pontjaira
Azokat a pontokat, amelyek átlaga csúcsba vezet csoportba foglaljuk.
74
3.5 GEGL műveletek
Tools → GEGL Operation / Eszközök → GEGL műveletek
GEGL (“Generic Graphical Library”) a GIMP képfeldolgozó könyvtára. GEGL folyamatos fejlesztés alatt. Például • Box-blur • Edge-Laplace • Noise-reduction • Bilateral filter
75
4. Alakfelismerés 4.1 Alakfelismerés sablonillesztéssel n
r
( sz
1i
i 1
n
( sz i 1
1i
sz1 ) ( sz2i sz2 ) n
sz1 ) ( sz2i sz2 ) 2 2
i 1
Két tetszőleges elemhalmaz közötti lineáris kapcsolat nagyságát és irányát A minta (sz1) korrelációja a kép részleteivel (sz2) A legjobb illeszkedést az a képrészlet adja, amelyre a korrelációs együttható a legnagyobb. 4.1.1 2D korreláció (konvolúcióval)
Y m , n X S
M 1 N 1
S ( i , j ) X ( m i , n j ) i 0 j 0
S a a keresendő minta, X a kép Y az a hely mennyire hasonlít a mintára célszerű elvégezni valamilyen élkiemelő szűrést
76
4.2 Alakfelismerés Hough transzformációval 4.2.1 Egyenesek Azon (x,y) síkbeli pontok, melyekre a normálegyenlet teljesül (Hesse-féle normálegyenlet) n(cosΘ,sin Θ) 𝑟 = (𝑥, 𝑦) ∙ (cosΘ,sinΘ) r (x,y) Θ Egyetlen térbeli pont egy egyenes-sereggel modellezhet, mely elemeinek adatai az origóból húzott merőleges hossza (r) és ennek szöge Θ Hough tér r r r
Θ A pontot jellemző egyenesek a képtérben
π
2π
Θ
Az egyenesek paraméterei a paramétertérben
A paramétertér sin(Θ) jellegű görbéjének minden egyes pontjához a képtér egy pontot definiáló egyenese tartozik
77
y
x Ha a képtér minden egyes pontját transzformáljuk egymást metsző görbéket kapunk. r
Θ
2π π A görbék metszéspontja a képpontok egyeneséhez tartozik. Ennek origótól mért távolsága r és Θ szöge mérhető Keressük tehát a metszéspontokat (a Hough tér pixeleinek lokális maximuma) amelyek a képtér 78 egyeneseit jelentik.
void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 ) •image – 8-bit, egycstornás bináris kép. •lines – A vonalak vektora (r,Θ) adatokkal jellemezve. •rho – Távolság érzékenység. •theta – szög bontás (radián). •threshold – Hough köszöb.
79
Mat vonalbe=imread("d:\\vonalak.bmp"); Mat vonalak; cvtColor(vonalbe,vonalak,COLOR_BGR2GRAY); vector lines; HoughLines(vonalak,lines,1,CV_PI/60,100); Mat vonalak2 = Mat::zeros( vonalak.rows, vonalak.cols, CV_8UC1 ); for( size_t i = 0; i < lines.size(); i++ ) { float rho = lines[i][0], theta = lines[i][1]; Point pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b)); pt1.y = cvRound(y0 + 1000*(a)); pt2.x = cvRound(x0 - 1000*(-b)); pt2.y = cvRound(y0 - 1000*(a)); line( vonalak2, pt1, pt2, 255, 3, CV_AA); } char ki[100]; sprintf(ki,"%i",lines.size()); string s=ki; imshow("alap", vonalbe); imshow("hough"+s, vonalak2);
80
5. Képfeldolgozás frekvencia tartományban 𝒏 Vektorok az 𝑹 -ben 𝟑 𝒂, 𝒃 =
𝒂𝒊 𝒃𝒊 − 𝒔𝒌𝒂𝒍á𝒓𝒊𝒔 𝒔𝒛𝒐𝒓𝒛𝒂𝒕 𝒊=𝟏
𝓡𝒏
f (𝑥𝑓 , 𝑦𝑓 , 𝑧𝑓 )
𝑧𝑓
𝒂, 𝒃 = 𝟎 ⇔ 𝒂⏊𝒃
𝒂 =
z
𝒂, 𝒂 − 𝒏𝒐𝒓𝒎𝒂
𝒇 = 𝒙𝒇 𝒊 + 𝒚𝒇 𝒋 + 𝒛𝒇 𝒌 𝒙𝒇 = 𝒇, 𝒊 ;
𝒚𝒇 = 𝒇, 𝒋 ;
𝒌
𝒋
𝒛𝒇 = 𝒇, 𝒌 ;
y 𝑦𝑓
𝒊
L-periodikus függvények 𝑰∞ 𝑳 𝒂, 𝒃 =
𝟏 𝑳
𝑳
𝟐𝝅 ∞𝑳𝒊 𝒆
𝒂, 𝒂 − 𝒏𝒐𝒓𝒎𝒂 𝒋
𝑪𝒋 𝒆
𝑪𝒋 = 𝒇, 𝒆
f (𝐶−∞ , …, 𝐶𝑗 , …, 𝐶∞ )
𝟐𝝅 𝒋𝑳𝒊 𝒆
𝟐𝝅 𝒙𝒊 𝑳
𝒋=−∞ 𝒋
z
𝟎
∞
𝒇=
𝑰∞ 𝑳
x
𝒂𝒃𝒅𝒙 − 𝒔𝒌𝒂𝒍á𝒓𝒊𝒔 𝒔𝒛𝒐𝒓𝒛𝒂𝒕
𝒂, 𝒃 = 𝟎 ⇔ 𝒂⏊𝒃 𝒂 =
𝑥𝑓
𝟐𝝅 𝒙𝒊 𝑳
;
𝒊 = −𝟏
𝟐𝝅 −∞ 𝑳 𝒊 𝒆
81
5.1 Fourier sorfejtés – 1-változós függvény
f(x)
C
n
e
n
2 x i L
n
L hosszúságú periódus f(x)=f(x+L) i
1
2 x 2 x f ( x ) Cn cos( n ) i * sin( n ) L L n
5.2 A Fourier sor együtthatói L
n
2 x i L
1 Cn f ( x ) e dx L0 ~ ha f(x) valós C n Cn 0
L
82
5.3 Fourier sorfejtés – 2-változós függvény f ( x, y ) 0 x Lx , 0 y L y x irányban y-tól függő Fourier-együtthatók Lx 2 x m i 1 Lx Cm ( y ) f ( x, y ) e dx Lx 0 Cm(y) Fourier sora: Cmn
Cmn
1 Ly
1 Ly
Ly
Ly
C
m
( y ) e
n
2 y i Ly
dy
0
1 0 Lx
Lx
f ( x, y ) e
m
2 x i Lx
dx e
n
2 y i Ly
dy
0
83
5.4 Kétváltozós Fourier együtthatók
Cmn
1 Lx Ly
Ly Lx
f ( x, y ) e
y x 2 m n i Ly Lx
dx dy
0 0
5.5 Kétváltozós Fourier sor
f ( x, y )
C
mn
e
y x 2 m n i Ly Lx
m n
C m n
~ Cmn ha f(x,y) valós
0 Ly
Lx 84
5.6 A diszkrét Fourier-transzformáció
2 x n i 1 Cn f ( x ) e L dx L0 L
f j 2x i n 1 N 1 L Dn f j e x L j 0
1 Dn N
N 1
f j 0
j
e
i n
j 2 N
0
Δx=L/N
L
fk Dn – az fk minták diszkrét Fourier-transzformáltja
1 Dn N
N 1
f j 0
j
e
i n
j 2 N
N 1
f k Dn e
i
n 2 k N
n 0
Dn N Dn D0 valós DN / 2 valós
FFT - Egyenletes osztás esetén a komplex egységvektor 85 miatt kevesebb számítás
5.7 2D-s diszkrét Fourier-transzformáció 0 k M ,0 l N
f k ,l
Dn ,m
1 N M
f k ,l
M 1 N 1
f
k ,l
e
mk
2 2 i nl i N M
e
k 0 l 0
M 1 N 1
D
n ,m
e
ikm
2 2 i ln N M
e
m 0 n 0
A Fourier transzformált abszolút értéke logaritmikus léptékben képként. Az (0,0) indexű tag tartalmazza az átlagos világosságot. Dn,m értékek periodikusak N-re, M-re Dn+N,m=Dn,m , Dn,m+M=Dn.m D0,0 és DN/2,M/2 valósak N/2*M/2 adat egyértelműen meghatározza A (k,l), a (k,N-l), az (M-k,l) és az (M-k,N-l) tagok azonosak 86
0,0
0,1
0,2
0,M/2-1
0,M/2
0,1
1,0
1,1
2,0
N/2-1,0
N/2-1,M/2-1
N/2-1,M/2
N/2-1,1
N/2,0
N/2,M/2-1
N/2,M/2
N/2,1
1,M/2-1
1,M/2
1,1
N/2-1,0
1,0
N/2,M/2
N/2,1
N/2,0
N/2,M/2-1
N/2-1,0
1,M/2
1,1
1,0
0,M/2
0,1
0,0
1,1
1,0
1,M/2-1 0,1
0,2
0,M/2-1
2,0
N/2-1,M/2
N/2-1,1
N/2-1,0
N/2-1,M/2-1
87
𝑛
5.8 FFT
𝑛
𝑐𝑗 𝑒 𝑖𝑗𝑥𝑘 =
𝑓 (𝑥𝑘 ) =
Legyen n=2m-1! Számítsuk ki a
𝑛
𝑛
𝑓(𝑥𝑘 𝑘=0
)𝑒 −𝑖𝑙𝑥𝑘
𝑗=0
𝑛
=
𝑐𝑗
𝑐𝑗 (𝑤 𝑘 )𝑗 𝑗=0 𝑛
𝑒 𝑖𝑗𝑥𝑘 𝑒 −𝑖𝑙𝑥𝑘
𝑘=0 𝑗=0
=
𝑛
𝑒 𝑖𝑥𝑘 (𝑗−𝑙) = (𝑛 + 1)𝑐𝑙
𝑐𝑗 𝑗=0
𝑘 = 0,1,2, … 𝑛
𝑘=0
𝒏
𝒂𝒌 𝒘𝒌𝒋
𝜱 𝒋 =
𝒋 = 𝟎, 𝟏, … 𝒏
𝒌=𝟎
összeget!
𝒇(𝒙 )
Ha ismertek az f(xk)-k, a cj-ket határozzuk meg (analízis), akkor 𝒂𝒌 = 𝒌 𝒏+𝟏 Ha ismertek a cj-k, az f(xk)-kat határozzuk meg (szintézis), akkor 𝒂𝒌 = 𝒄𝒌 Ο(n2) művelet - n együttható n művelettel. Bontsuk k-t páros (2l) és páratlan (2l+1) tagokra! jelölje n1=2m-1-1! 𝒏𝟏
𝒏𝟏
𝒂𝟐𝒍 𝒘𝟐𝒍𝒋 +
𝜱 𝒋 = 𝒍=𝟎
𝜱 𝒋 = Ψ 𝒋 + 𝒘𝒋 Χ 𝒋
𝒏𝟏
𝒂𝟐𝒍+𝟏 𝒘
𝟐𝒍+𝟏 𝒋
𝒂𝟐𝒍 (𝒘𝟐 )𝒍𝒋 +𝒘𝒋
=
𝒍=𝟎
𝒏𝟏
𝒍=𝟎
𝒂𝟐𝒍+𝟏 (𝒘𝟐 )𝒍𝒋 𝒍=𝟎
𝒋 = 𝟎, 𝟏, … 𝒏
Ψ-t és Χ-t csak fele annyi indexre kell kiszámítani j=0,1,…n1 És így tovább Qm = 2*Qm-1+2m, Q0=0, teljes indukcióval ha Qm-1=(m-1) 2m-1, akkor Qm=2(m-1) 2m-1 + 2m =m 2m 2m=n+1; m*log2(2)=log2(n+1)
O(n*log2(n)) matematikai művelet. Ha nem 2 hatvány, akkor
n+1=3*2m,
88
5*2m,…
void dft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0) •src •dst •flags
– input tömb valós vagy komplex. – output tömb - a flagtől függő méret. – • DFT_INVERSE inverz 1D, 2D transzformáció a deafult transzformáció helyett. • DFT_SCALE az eredmény skálázva (a tömbelemek számával osztva) DFT_INVERSE. • DFT_ROWS transzformáció soronként (több transzformáció egyszerre) • DFT_COMPLEX_OUTPUT 1D vagy 2D valós mátrix transzformáció komplex eredménnyel. • DFT_REAL_OUTPUT 1D vagy 2D complex mátrix inverz transzformáció valós eredménnyel. •nonzeroRows – ha nem nulla, akkor csak ez első nonzeroRows eltérően kezelve.
89
cap >> frame; if (frame.empty()) continue; cvtColor(frame, gray, COLOR_BGR2GRAY); imshow("Gray", gray); Mat I = gray; if (I.empty()) return -1; Mat padded; //expand input image to optimal size int m = getOptimalDFTSize(I.rows); int n = getOptimalDFTSize(I.cols); // on the border add zero values copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0)); Mat planes[] = { Mat_(padded), Mat::zeros(padded.size(), CV_32F) }; Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zeros dft(complexI, complexI); // this way the result may fit in the source matrix // compute the magnitude and switch to logarithmic scale // => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)) split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)) magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude Mat magI = planes[0]; magI += Scalar::all(1); // switch to logarithmic scale log(magI, magI); // crop the spectrum, if it has an odd number of rows or columns magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2)); // rearrange the quadrants of Fourier image so that the origin is at the image center int cx = magI.cols / 2; int cy = magI.rows / 2; Mat q0(magI, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant Mat q1(magI, Rect(cx, 0, cx, cy)); // Top-Right Mat q2(magI, Rect(0, cy, cx, cy)); // Bottom-Left Mat q3(magI, Rect(cx, cy, cx, cy)); // Bottom-Right Mat tmp; // swap quadrants (Top-Left with Bottom-Right) q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left) q2.copyTo(q1); tmp.copyTo(q2); normalize(magI, magI, 0, 1, CV_MINMAX); // Transform the matrix with float values into a // viewable image form (float between values 0 and 1). imshow("spectrum magnitude", magI);
90
5.9 Képkezelés frekvencia-tartományban 1. Meghatározzuk a kép Fourier transzformáltját. 2. A Fourier transzformált szűrésével egyes komponenseket erősítünk, illetve csillapítunk. 3. Inverz Fourier transzformációval előállítjuk a módosított képet. 5.9.1 Aluláteresztő szűrés
zajcsökkentés, lágyítás 91
5.9.2 Felüláteresztő szűrés
A kis síkfrekvenciák kiszűrésével élkeresés
Nagy síkfrekvenciák erősítésével élesítés
Inverz
92
5.10 Alakfelismerés frekvencia térben 5.10.1 Az általános Fourier transzformált
F ( )
f (t ) e
i t
dt
f (t )
5.10.2 A konvolúció ∞
−∞ ∞
∞
−∞ ∞ −∞
z
f
−∞
𝒇 𝒚 ∗ 𝒈 𝒙 − 𝒚 𝒅𝒚 𝒆−𝒊𝝎𝒙 𝒅𝒙 =
−∞
𝒇 𝒚
𝑰∞ 𝑳
𝒇 ⊗ 𝒈 𝒙 𝒆−𝒊𝝎𝒙 𝒅𝒙 =
𝓕 𝒇⊗𝒈 𝝎 = ∞
i t F ( ) e d
𝒆−𝒊𝝎𝒚
∞
∗
𝒇 𝒚 𝒆−𝒊𝝎𝒚 ∗
𝓕 𝒇 𝝎 𝓕 𝒈 𝝎
𝒆𝝎𝒕𝒊
𝒈 𝒙 − 𝒚 𝒆−𝒊𝝎(𝒙−𝒚) 𝒅𝒙𝒅𝒚 =
−∞ ∞
𝒈 𝒖 𝒆−𝒊𝝎(𝒖) 𝒅𝒖𝒅𝒚 =
−∞
Frekvenciatérben bármilyen szűrés E K S helyett DFT ( E ) DFT ( K ) DFT ( S ) E DFT 1 ( DFT ( K ) DFT ( S ))
93
5.10.3 Alakfelismerés
Kép M int a Pozíció Háttér DFT ( Kép ) DFT ( M int a ) DFT ( Pozíció ) DFT ( Háttér ) DFT ( Kép ) DFT ( Háttér ) DFT ( Pozíció ) DFT ( M int a ) DFT ( M int a ) DFT ( Kép ) DFT ( Pozíció ) DFT ( M int a ) Pozíció DFT 1 (
DFT ( Kép ) ) DFT ( M int a )
háttérzaj
94
95
6. Képek információinak feldolgozása (3D) 6.1 Epipoláris geometria
96
6.2 Példa : Az emberi test adatainak mérése – 3D letapogatóval A mérési elv
97
98
6.2.1 Pozíció-meghatározás 6.2.2 A sík-sík perspektíva bijekció a. Homogén koordináták t
3 x
, t 3y
t
2 x
, t y2
v , v 3 x
v
0 x
, v 0y
3 y
v
2 x
, v y2
t , t t , t homogén koordinátákkal lineáris 0 x
1 x
0 y
1 y
i vhx p0 i vhy p3 hi vhz p6
p1 p4 p7
p2 t xi p5 t iy 1 1
b. Iteráció
O1 y
i p0 t xi p1 t iy p2 vhx v i vhz p6 t xi p7 t iy 1
O
i x
v
i vhy i vhz
a leképezés
p3 t xi p4 t iy p5 p6 t xi p7 t iy 1
x
D
egyenletrendszer pi-re
i y
O2
η
A ζ
i=0, 1, 2, 3
C
O’
A’
C’ P
B
1
tP v 99
6.2.3 Kalibráció Szűrés R>K & R>(G+B)/2+s
Szűrés R>K, G>K és B>K
Sarkok keresése
X S
H ( xs ) ( yi (a xxs xi bxxs )) 2 ( yi (a x xs xi bx xs )) 2 xi xs
xi xs
100
6.2.4 Kontúrok keresése
A piros kiszűrése után statisztikai osztályozás + súlypontok
Regressziós Fourier-görbék a súlyponti koordinátarendszerben (Fourier-transzformált) n n 1 R( ) a0 ai cosi bi sin i 2 i 1 i 1
2
1 R a a cos i b sin i k 0 i k i k min k 1 i 1 i 1 2 N
n
n
101
6.3 A térlátás Pinhole (tűlyuk) kamera modell Intrinsic: A kamera belső felépítését leíró paraméterek. Extrinsic: A kamera világbeli helyzetét leíró paraméterek. 6.3.1 Intrinsic paraméterek Fókusztávolság: fx, fy (nem négyzet pixel) Optikai középpont (principle point): cx, cy Lencsetorzítás: Radiális: k1, k2, k3 (paraméterek - hordó, vagy párna torzítást. ) Tangenciális: p0, p1 a lencse nem lesz teljesen párhuzamos a képsíkkal
102
y
A leképezés:
f x 0 1 0
A pixel koordináták:
0 fy 0
xˆ ˆy
Radiális torzítás:
r
P
η
cx X / Z c y Y / Z 1 1
Πy
Pk
z Pxy
O C f OC
x cx fx
Πx
Px ξ
x s
y cy fy
x2 y2
ˆy k r
drx xˆ k1 r 2 k 2 r 4 k 3 r 6 dr y
Tangenciális torzítás:
Py
1
2
k2r 4 k3r 6
dp x 2 p1 xˆ yˆ p2 r 2 2 xˆ 2
dp y 2 p1 r 2 2 yˆ 2 2 p2 xˆ yˆ
A koordináták:
~ xˆ dr dp x x x ~y yˆ dr dp y y
103
6.3.2 Extrinsic paraméterek Pozíció: t a kamera világbeli pozíciója
Orientáció: R a kamera világbeli nézeti iránya. (bázistranszformációval) u (http://opencv.org/)
t x t t y t z
x
R u y uz
vx vy vz
wx wy w z
104