Базовые алгоритмы обработки изображений
TRANSCRIPT
Базовые алгоритмы обработки изображений
Катаев Александр Ведущий инженер-программист, к.т.н.
Алексеев Алексей Инженер-программист
Singularis Lab, Ltd.
Найди кота!
15 - 21 августа, Иннополис 2
ЦВ Е Т
Зрение человека
Зрение человека
Зрение человека
Зрение человека
Зрение человека. Сетчатка
110-125 млн палочек (яркость) - пик чувствительности 498нм - 2-3 фотонов достаточно - инерционны - периферическое зрение 6-7 млн колбочек (цвет) - в 100 раз менее чувствительны - менее инерционны - 3 вида:
S 443 нм синий
M 544 нм зелёный
L 570 нм красный
Чувствительность к спектру
Кодирование цвета. Цветовая модель LMS
𝐿 = 𝐼 𝜆 𝐿 𝜆 𝑑𝜆
𝑀 = 𝐼 𝜆 𝑀 𝜆 𝑑𝜆
𝑆 = 𝐼 𝜆 𝑆 𝜆 𝑑𝜆
𝐼 𝜆 - интенсивность излучения с длиной волны 𝜆 𝐿 𝜆 , 𝑀 𝜆 , 𝑆 𝜆 -функции спектрального отклика (чувствительность сетчатки к излучению с длиной волны 𝜆)
Цветовая модель RGB
R=700.0nm G=546.1nm B=435.8nm
Цветовая модель XYZ
Y – отклик яркости Z – отклик синего (S) X - неотрицательная
Цветовые (хроматические) координаты xy
x=X/(X+Y+Z) y=Y/(X+Y+Z)
Цветовой охват
Аддитивные и субтрактивные цветовые модели
Цветоразностная модель YCrCb
Нелинейная модель L*a*b*
HSV
Преобразование цвета в OpenCV
• cvtColor(src, dst, code)
– COLOR_BGR2GRAY
– COLOR_BGR2XYZ
– COLOR_XYZ2BGR
– COLOR_BGR2YCrCb
– COLOR_YCrCb2BGR
– COLOR_HSV2BGR
– …..
Хранение данных
• Целые, 1 байт на канал, от 0 до 255
• Упакованные целые 16 бит (RGB555, RGB565)
• Вещественные, от 4 до 8 байт на канал в диапазоне 0.0 до 1.0 (или до 255.0)
• Логарифмические шкалы (HDR)
• Для HSV: H от 0 до 360 (до 180) S, V от 0 до 255
Расположение данных в памяти RGB,BGR
R G B R G B R G B R G B R G B R G B X X
R G B R G B R G B R G B R G B R G B X X
R G B R G B R G B R G B R G B R G B X X
R G B R G B R G B R G B R G B R G B X X
R G B R G B R G B R G B R G B R G B X X
R G B R G B R G B R G B R G B R G B X X
R G B R G B R G B R G B R G B R G B X X
Step (stride) = 20 bytes
width = cols = 6 pixels elem size = 3 bytes
image.at<vec3b>(row, col) = vec3b(R,G,B) image.ptr<vec3b>(row)[col) = vec3b(R,G,B) ((char*)image.data) [row * image.step + col * image.elem_size()]
Расположение данных в памяти RGBA
R G B A R G B A R G B A R G B A R G B A R G B
R G B A R G B A R G B A R G B A R G B A R G B
R G B A R G B A R G B A R G B A R G B A R G B
R G B A R G B A R G B A R G B A R G B A R G B
R G B A R G B A R G B A R G B A R G B A R G B
R G B A R G B A R G B A R G B A R G B A R G B
R G B A R G B A R G B A R G B A R G B A R G B
width = cols = 6 pixels
elem size = 4 bytes
Работа с каналами (с++)
// Создание трехканальной матрицы Mat image(rows, cols, CV_8UC3); // Запись цвета в 0й канал Image.at<vec3b>(row, col)[0] = 123; //Получение матриц каналов: Mat channels[3]; // Можно vector<Mat> split (image, channels); // работа с данными каналов channels[0].at<byte> (row, col) = 123; //Сборка изображения из матриц каналов merge(channels, image)
Фильтр Байера
G R G R G R G R
B G B G B G B G
G R G R G R G R
B G B G B G B G
G R G R G R G R
B G B G B G B G
Кодирование цвета YUV420
Цветокорекция
I=
H(I)=
Коррекция контрастности
𝐼𝑐 = 𝛼𝐼 𝛼 – контраст
(contrast, gain)
𝛼=1
𝛼 <1
𝛼 >1
Коррекция яркости
𝐼𝑐 = 𝛼𝐼 +𝛽 𝛽 – яркость
(brightness, bias)
𝛽=0
𝛽 >0
𝛽 <0
Коррекция яркости и контрастности
Гамма коррекция
𝐼𝑐 = 𝐼𝛾
𝛾 = 0,5
𝛾 = 1,0
𝛾 = 2,0
Обобщенная коррекция яркости/контрастности/цвета
𝐼𝑐 = 𝐹(𝑖)
Тонирование
Тон 𝐻𝑢𝑒𝑐 = 𝐹(𝐻𝑢𝑒)
Насыщенность 𝑆𝑎𝑡𝑢𝑟𝑎𝑡𝑒𝑐 = 𝐹(𝑆𝑎𝑡𝑢𝑟𝑎𝑡𝑒)
Look Up Tables (LUT)
𝐼𝑐 = 𝐹(𝐼) где функция 𝐹: [0,255] → 0,255 заменяем на
𝐼𝑐 = 𝐿𝑈𝑇 𝐼 где 𝐿𝑈𝑇 𝑖 = 𝐹 𝑖 , 𝑖 ∈ 0,255 Opencv: void LUT(src, lut, dst, interpolation=0)
Colormapping
applyColorMap(image, image_c, COLORMAP_JET)
applyColorMap(image, image_c, COLORMAP_AUTUMN)
applyColorMap(image, image_c, COLORMAP_BONE)
Нормализация
𝐼𝑐 =𝐼 −𝑚𝑖𝑛𝐼
max 𝐼−min 𝐼 * (beta-alpha) + alpha
исходное нормализованное
Выравнивание гистограммы
исходное выровненное
𝐻′ 𝑖 = 𝐻(𝑗)0≤𝑗<𝑖
𝐼𝑐 = 𝐻′(𝐼)
equalizeHist(I,I)
Выравнивание гистограммы
Retinex
исходное retinex
𝐼𝑐 =log 𝐼
log (𝐼 ∗ 𝐺 𝜎 )
𝐼 ∗ 𝐺 𝜎 - свертка по Гауссу (размытие изображения)
Прозрачность изображений
Mat image = imread(“mario.bmp”); Mat background = imread(“minas.bmp”); Mat mask; compare(image, CV_RGB(255,0,255), mask, CMP_EQ); image.copyTo(background, mask);
Прозрачность
Альфа-блендинг
𝐼 = 𝐼𝑎𝛼 + 𝐼𝑏(1 − 𝛼)
Mat alpha=…, Mat image = …, Mat background = … // Подготовка альфа канала std::vector<Mat> channels (3, alpha); merge(channels, alpha); // Альфа-блендинг Mat res = image.mul(alpha,1.0/255) + background.mul(Scalar::all(255)- alpha,1.0/255);
Композитинг
Композитинг по Портеру и Дафу
Композитинг по Портеру и Дафу
СR,pre = f(CA, CB)αAαB + YCAαA(1-αB) + ZCBαB(1-αA) СR = СR,pre / αr
αr= XαAαB+YαA(1-αB)+ZαB(1-αA)
• f(CA, CB) – определяет влияние цвета изображений A и B на результат
• X определяет влияние прозрачности изображений на результат.
• Y определяет влияние цвета и прозрачности изображения А на результат
• Z определяет влияние цвета и прозрачности изображения B на результат
Оператор f(CA, CB) X Y Z СR αr
clear 0 0 0 0 0 0
src CA 1 1 0 CAαA αA
dst CB 1 0 1 CBαB αB
src-over CA 1 1 1 CAαA+CBαB(1-αA) αA+αB-αAαB
dst-over CB 1 1 1 CR = CBαB + CAαA(1-αB) αA+αB-αAαB
src-in CA 1 0 0 CAαAαB αAαB
dst-in CB 1 0 0 CBαBαA αAαB
src-out CA 0 1 0 CAαA(1-αB) αA(1-αB)
dst-out CB 0 0 1 CBαB(1-αA) αB(1-αA)
src-atop CA 1 0 1 CAαAαB+CBαB(1-αA) αB
dst-atop CB 1 1 0 CBαBαA+CAαA(1-αB) αA
xor 0 0 1 1 CAαA(1-αB)+CBαB(1-αA) αA+αB-2αAαB
Сегментация, matting, Chroma-key
grabcut
Сравнение изображений.
Mean Square Error:
Peak Signal To Noise Ratio:
Спасибо за внимание
49
Александр Катаев
Алексей Алексеев
https://www.singularis-lab.com/
https://www.linkedin.com/company/singularis-lab-llc
http://habrahabr.ru/company/singularis
http://vk.com/singularis_lab
15 - 21 августа, Иннополис