Катаев Александр - singularis lab...cv2.bilateralfilter(src, d, c, s[, dst[,...
TRANSCRIPT
Фильтрация изображений
Катаев Александр Ведущий инженер-программист, к.т.н.
Алексеев Алексей Инженер-программист
Singularis Lab, Ltd.
Найди кота!
15 - 21 августа, Иннополис 2
Шум
15 - 21 августа, Иннополис 3
Размытие (усреднение) 5x5
15 - 21 августа, Иннополис 4
Границы зашумленного изображения
15 - 21 августа, Иннополис 5
Границы фильтрованного изображения
15 - 21 августа, Иннополис 6
Оператор свертки
𝑔 = 𝐼 ∗ ℎ
𝑔 𝑖, 𝑗 = 𝐼 𝑖 − 𝑘, 𝑗 − 𝑙 ℎ(𝑘, 𝑙)
𝑘,𝑙
Свертка
15 - 21 августа, Иннополис 8
Примеры ядер свертки
Identity
Box
Gauss
15 - 21 августа, Иннополис 9
10 0 00 1 00 0 0
1
9
1 1 11 1 11 1 1
1
16
1 2 12 4 21 2 1
Примеры ядер свертки
edges
v-edges
h-edges
15 - 21 августа, Иннополис 10
0 1 01 −4 10 1 0
−1 0 1
−101
Оператор Собеля
𝐺𝑥
𝐺𝑦
Sobel
15 - 21 августа, Иннополис 11
−1 −2 −10 0 01 2 1
−1 0 1−2 0 2−1 0 1
𝐺𝑥2 + 𝐺𝑦
2
Фильтр Canny
1. GaussBlur 2. Gx=…, Gy =…
3. G = 𝐺𝑥2 + 𝐺𝑦
2
4. Θ = arctan𝐺𝑦
𝐺𝑥, округляем до
𝜋
4
5. G > thresh_up –> accept 6. G < thresh_low -> reject 7. G >= thresh_low И G <= thresh_up -> accept, if
connected with accepted
15 - 21 августа, Иннополис 12
Сепарабельные фильтры
𝐴𝑎 𝐴𝑏 𝐴𝑐𝐵𝑎 𝐵𝑏 𝐵𝑐𝐶𝑎 𝐶𝑏 𝐶𝑐
=𝐴𝐵𝐶⋅ [𝑎 𝑏 𝑐]
I∗𝐴𝑎 𝐴𝑏 𝐴𝑐𝐵𝑎 𝐵𝑏 𝐵𝑐𝐶𝑎 𝐶𝑏 𝐶𝑐
= 𝐼 ∗𝐴𝐵𝐶⋅ 𝑎 𝑏 𝑐 = 𝐼 ∗
𝐴𝐵𝐶∗ 𝑎 𝑏 𝑐
Фильтр Гаусса
𝐺𝑖 = 𝑒−𝑖−𝑘𝑠𝑖𝑧𝑒−12
2
2𝜎2
15 - 21 августа, Иннополис 14
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst
Размеры ядра и sigma
15 - 21 августа, Иннополис 15
Нерезкое маскирование
• Нерезкое маскирование (unsharp mask)
I𝑝 = 𝐼 + 𝛾(𝐼 − ℎ ∗ 𝐼)
• Многоуровневая фильтрация
𝐼1 = ℎ1 ∗ 𝐼, 𝐼2 = ℎ2 ∗ 𝐼, … I𝑝 = 𝐼 + 𝛾1 𝐼 − 𝐼1 + 𝛾2 𝐼1 − 𝐼2 +⋯
15 - 21 августа, Иннополис 16
Нерезкое маскирование
15 - 21 августа, Иннополис 17
AdaptiveThreshold
15 - 21 августа, Иннополис 18
Thresh(80) Thresh(200) Adaptive (size=201)
Нелинейные фильтры
• Билатеральный (bilateralBlur)
• Медианный (medianBlud)
• Морфологические операции (erode, dilate, morphologyEx)
Фильтр Гаусса
𝐼𝑝 𝑥 =1
𝑊𝑝 𝐼 𝑥𝑖 𝐺𝜎 |𝐼 𝑥𝑖 − 𝐼 𝑥
𝑥∈Ω
𝐺𝜎 𝑥 =1
2𝜋𝜎2𝑒−𝑥2
2𝜎2
• Размывает все
• Может работать очень быстро
15 - 21 августа, Иннополис 20
Билатеральный фильтр
𝐼𝑝 𝑥 =1
𝑊𝑝 𝐼 𝑥𝑖 𝐺𝑐 |𝐼 𝑥𝑖 − 𝐼 𝑥 𝐺𝑠 𝑥𝑖 − 𝑥
𝑥∈Ω
𝐺𝜎 𝑥 =1
2𝜋𝜎2𝑒−𝑥2
2𝜎2
cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst
• Сохраняет контрастные границы • Убирает небольшие шумы и неконтрастную текстуру • Нелинейный, очень медленный для больших окон
15 - 21 августа, Иннополис 21
Bilateral: sigma_c=20, sigma_s=10, size=51
15 - 21 августа, Иннополис 22
original
15 - 21 августа, Иннополис 23
Gaussian: sigma=20, size=51
15 - 21 августа, Иннополис 24
Медианный фильтр
• Значения в окне сортируются по интенсивности, выбирается среднее и записывается в выходной массив
• Нелинейный (медленный)
• Эффективно удаляет точечный шум (малое окно)
• Выполняет примитивную сегментацию (большое окно)
15 - 21 августа, Иннополис 25
Точечный шум
15 - 21 августа, Иннополис 26
Отфильтрованное изображение (k=3)
15 - 21 августа, Иннополис 27
K=5
15 - 21 августа, Иннополис 28
K=11
15 - 21 августа, Иннополис 29
K=25
15 - 21 августа, Иннополис 30
canny
15 - 21 августа, Иннополис 31
canny, median k=5
15 - 21 августа, Иннополис 32
canny, median k=25
15 - 21 августа, Иннополис 33
Морфологическая фильтрация
• Эрозия
res = cv2.erode(img,kernel)
• Дилация
res = cv2.dilate(img,kernel)
kernel = np.ones((3,3),np.uint8)
15 - 21 августа, Иннополис 34
Морфологическая фильтрация
• Открытие = dilate(erode(image)) cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
• Закрытие = erode(dilate(image)) cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
15 - 21 августа, Иннополис 35
Пример MORPH_OPEN
15 - 21 августа, Иннополис 36
Спасибо за внимание
37
Александр Катаев
Алексей Алексеев
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 августа, Иннополис