Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Additív színmodell: piros, zöld, kék keverése
RGB hullámhossz:700nm, 546nm, 435nm
Elektronikai eszközök alkalmazzák: kijelzők, kamerák
16 millió szín kódolható
Szürke árnyalat: R=G=B
OPENCV: BGR
◦ Mátrix típus: CV_8UC3
◦ Pont típus: img.at<Vec3b>(i, j)
◦ Tartomány: R, G, B [0, 255]
◦ Tartomány váltás: r, g, b [0, 1]
rgb.convertTo(norm_rgb, CV_32FC3, 1/255.0);
Töltsd le az alábbi képet:
https://en.wikipedia.org/wiki/File:Indian_hybrid_Orange.jpg
Készíts egy függvényt, ami a narancsokat egy másik képre másolja.
void narancsmasolo( const cv::Mat src, cv::Mat& dest );
Emlékeztető
◦ Kép beolvasása:
cv::imread( elérési_út, ImreadModes::IMREAD_COLOR )
◦ Kép létrehozása:
img.create( méret, típus );
◦ Kép másolása (deep copy):
img2 = img.clone();
◦ Képpont elérése
img.at<cv::Vec3b>(sor, oszlop)[csatorna]
csatorna: 0 - kék, 1 - zöld, 2 - piros
Hue (színezet)
Saturation/Chroma (telítettség) ◦ Alap- és kiegészítőszínek telítettsége maximális
◦ Szürke telítettsége nulla
Value ( max( R, G, B) )
3 millió szín kódolható
OpenCV
◦ Mátrix típus pl.: CV_8UC3
◦ Pont típus: img.at<Vec3b>(i, j)
◦ Tartomány: H [0, 179], S, V [0, 255]
◦ Áttérés BGR-ből HSV-be: cvtConvert( InputArray src, OutputArray dest,
ColorConversionCodes::COLOR_BGR2HSV);
Piros 0
Sárga 60
Zöld 120
Kékeszöld 180
Kék 240
Bíbor 300
Töltsd le az alábbi képet:
https://en.wikipedia.org/wiki/File:Indian_hybrid_Orange.jpg
Készíts egy függvényt, ami a narancsokat egy másik képre másolja.
void narancsmasoloHSV( const cv::Mat src, cv::Mat& dest );
Emlékeztető
◦ Kép beolvasása:
imread( elérési_út, ImreadModes::IMREAD_COLOR )
◦ Kép létrehozása:
img.create( méret, típus );
◦ Áttérés HSV színtérbe:
cvtConvert( InputArray src, OutputArray dest, ColorConversionCodes::COLOR_BGR2HSV);
◦ Kép másolása (deep copy):
img2 = img.clone();
◦ Képpont elérése
img.at<cv::Vec3b>(sor, oszlop)[csatorna]
csatorna: 0 - kék, 1 - zöld, 2 - piros
Szétválik a színezet (a*,b*) és a világosság (L)
Tartományok: ◦ L*: [0, 100]
◦ a*: zöld-vörös tengely: [-100, 100]
◦ b*: kék-sárga tengely: [-100, 100]
Teljes színkülönbség:
∆𝐸∗ = ∆𝐿∗2 + ∆𝑎∗2 + ∆𝑏∗2
Színezet változás:
∆𝐻∗ = ∆𝐸∗2 − ∆𝐿∗2 − ∆𝐶∗2
Telítettség (chroma):
𝐶∗ = 𝑎∗2 + 𝑏∗2
Színezeti szög számítása:
ℎ𝑎𝑏° = 𝑎𝑟𝑐𝑡𝑔
𝑏∗
𝑎∗
Szétválik a színezet (a*,b*) és a világosság (L)
Tartományok: ◦ L*: [0, 100]
◦ a*: zöld-vörös tengely: [-100, 100]
◦ b*: kék-sárga tengely: [-100, 100]
Teljes színkülönbség:
∆𝐸∗ = ∆𝐿∗2 + ∆𝑎∗2 + ∆𝑏∗2
Színezet változás:
∆𝐻∗ = ∆𝐸∗2 − ∆𝐿∗2 − ∆𝐶∗2
Telítettség (chroma):
𝐶∗ = 𝑎∗2 + 𝑏∗2
Színezeti szög számítása:
ℎ𝑎𝑏° = 𝑎𝑟𝑐𝑡𝑔
𝑏∗
𝑎∗
Szétválik a színezet (a*,b*) és a világosság (L)
Tartományok: ◦ L*: [0, 100]
◦ a*: zöld-vörös tengely: [-100, 100]
◦ b*: kék-sárga tengely: [-100, 100]
Teljes színkülönbség:
∆𝐸∗ = ∆𝐿∗2 + ∆𝑎∗2 + ∆𝑏∗2
Színezet változás:
∆𝐻∗ = ∆𝐸∗2 − ∆𝐿∗2 − ∆𝐶∗2
Telítettség (chroma):
𝐶∗ = 𝑎∗2 + 𝑏∗2
Színezeti szög számítása:
ℎ𝑎𝑏° = 𝑎𝑟𝑐𝑡𝑔
𝑏∗
𝑎∗
OpenCV tartományok CV_8UC3-nál: L*: [0, 255] ( eredet_L* = opencv_L*100/255.0 )
a*: [0, 255] ( eredeti_a* = opencv_a* - 128 )
b*: [0, 255] ( eredeti_b* = opencv_b* - 128 )
Érdemes a CV_32FC3-at használni:
cv::Mat rgb = imread(…); //szokásos RGB kép (CV_8UC3)
//RGB kép átskálázása ( [0, 1] tartományra )
cv::Mat rgbf;
rgb.convertTo(rgbf, CV_32FC3, 1.0 / 255.0);
//rgbf képet használjuk a színrendszer váltásnál.
cv::Mat lab(rgbf.size(), CV_32FC3);
cv::cvtColor(rgbf, lab, COLOR_BGR2Lab);
Készíts egy programot, ami:
• megjelenít egy kapott képet
• a felhasználó egérrel kiválaszthat egy pontot
• hatására egy másik képen megjelennek a kijelölt ponthoz hasonló színű pontok (RGB térben t távolságra lévő képpontok (t kezdeti értéke 15))
A felh. változtathassa a t távolságot a + és - gombok leütésével
Kép felolvasása, megjelenítése
Egér eseménykezelő hozzáadása (setMouseCallback)
int key = ' ';
do{
ha volt esemény, eredménykép létrehozása és megjelenítése
key = cv::WaitKey(1);
ha + v. - akkor adott tavolsag valtoztatasa
}while (key != 'q');
Eseménykezelő:
void onMouse(int mevent, int x, int y, int flag, void* userdata){
esemény és/vagy állapot ellenőrzése
szükséges adatok mentése az userdata változóba: pl. x, y
pl:
if( mevent == EVENT_LBUTTONDBLCLK )
TO DO
if( flag == EVENT_FLAG_LBUTTON )
TO DO
}
Eseménykezelő felhasználása:
userdata_tipusa adat; //pl: Vec3b, Point, saját struktúra
imshow( ablak, kep );
setMouseCallback( ablak, onMouse, &adat );
{várakoztatás vagy ciklus}
Képek (vagy azok eredetiének) származási helye: https://en.wikipedia.org/wiki/File:HSV_color_solid_cone_chroma_gray.png
http://www.texample.net/media/tikz/examples/PDF/cielab.pdf
https://commons.wikimedia.org/wiki/File:Lab_color_space.png