Катаев Александр - singularis lab...cv2.bilateralfilter(src, d, c, s[, dst[,...

37
Фильтрация изображений Катаев Александр Ведущий инженер-программист, к.т.н. Алексеев Алексей Инженер-программист Singularis Lab, Ltd.

Upload: others

Post on 06-Jul-2020

23 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Фильтрация изображений

Катаев Александр Ведущий инженер-программист, к.т.н.

Алексеев Алексей Инженер-программист

Singularis Lab, Ltd.

Page 2: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Найди кота!

15 - 21 августа, Иннополис 2

Page 3: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Шум

15 - 21 августа, Иннополис 3

Page 4: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Размытие (усреднение) 5x5

15 - 21 августа, Иннополис 4

Page 5: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Границы зашумленного изображения

15 - 21 августа, Иннополис 5

Page 6: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Границы фильтрованного изображения

15 - 21 августа, Иннополис 6

Page 7: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Оператор свертки

𝑔 = 𝐼 ∗ ℎ

𝑔 𝑖, 𝑗 = 𝐼 𝑖 − 𝑘, 𝑗 − 𝑙 ℎ(𝑘, 𝑙)

𝑘,𝑙

Page 8: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Свертка

15 - 21 августа, Иннополис 8

Page 9: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Примеры ядер свертки

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

Page 10: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Примеры ядер свертки

edges

v-edges

h-edges

15 - 21 августа, Иннополис 10

0 1 01 −4 10 1 0

−1 0 1

−101

Page 11: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Оператор Собеля

𝐺𝑥

𝐺𝑦

Sobel

15 - 21 августа, Иннополис 11

−1 −2 −10 0 01 2 1

−1 0 1−2 0 2−1 0 1

𝐺𝑥2 + 𝐺𝑦

2

Page 12: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Фильтр 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

Page 13: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Сепарабельные фильтры

𝐴𝑎 𝐴𝑏 𝐴𝑐𝐵𝑎 𝐵𝑏 𝐵𝑐𝐶𝑎 𝐶𝑏 𝐶𝑐

=𝐴𝐵𝐶⋅ [𝑎 𝑏 𝑐]

I∗𝐴𝑎 𝐴𝑏 𝐴𝑐𝐵𝑎 𝐵𝑏 𝐵𝑐𝐶𝑎 𝐶𝑏 𝐶𝑐

= 𝐼 ∗𝐴𝐵𝐶⋅ 𝑎 𝑏 𝑐 = 𝐼 ∗

𝐴𝐵𝐶∗ 𝑎 𝑏 𝑐

Page 14: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Фильтр Гаусса

𝐺𝑖 = 𝑒−𝑖−𝑘𝑠𝑖𝑧𝑒−12

2

2𝜎2

15 - 21 августа, Иннополис 14

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst

Page 15: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Размеры ядра и sigma

15 - 21 августа, Иннополис 15

Page 16: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Нерезкое маскирование

• Нерезкое маскирование (unsharp mask)

I𝑝 = 𝐼 + 𝛾(𝐼 − ℎ ∗ 𝐼)

• Многоуровневая фильтрация

𝐼1 = ℎ1 ∗ 𝐼, 𝐼2 = ℎ2 ∗ 𝐼, … I𝑝 = 𝐼 + 𝛾1 𝐼 − 𝐼1 + 𝛾2 𝐼1 − 𝐼2 +⋯

15 - 21 августа, Иннополис 16

Page 17: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Нерезкое маскирование

15 - 21 августа, Иннополис 17

Page 18: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

AdaptiveThreshold

15 - 21 августа, Иннополис 18

Thresh(80) Thresh(200) Adaptive (size=201)

Page 19: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Нелинейные фильтры

• Билатеральный (bilateralBlur)

• Медианный (medianBlud)

• Морфологические операции (erode, dilate, morphologyEx)

Page 20: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Фильтр Гаусса

𝐼𝑝 𝑥 =1

𝑊𝑝 𝐼 𝑥𝑖 𝐺𝜎 |𝐼 𝑥𝑖 − 𝐼 𝑥

𝑥∈Ω

𝐺𝜎 𝑥 =1

2𝜋𝜎2𝑒−𝑥2

2𝜎2

• Размывает все

• Может работать очень быстро

15 - 21 августа, Иннополис 20

Page 21: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Билатеральный фильтр

𝐼𝑝 𝑥 =1

𝑊𝑝 𝐼 𝑥𝑖 𝐺𝑐 |𝐼 𝑥𝑖 − 𝐼 𝑥 𝐺𝑠 𝑥𝑖 − 𝑥

𝑥∈Ω

𝐺𝜎 𝑥 =1

2𝜋𝜎2𝑒−𝑥2

2𝜎2

cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst

• Сохраняет контрастные границы • Убирает небольшие шумы и неконтрастную текстуру • Нелинейный, очень медленный для больших окон

15 - 21 августа, Иннополис 21

Page 22: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Bilateral: sigma_c=20, sigma_s=10, size=51

15 - 21 августа, Иннополис 22

Page 23: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

original

15 - 21 августа, Иннополис 23

Page 24: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Gaussian: sigma=20, size=51

15 - 21 августа, Иннополис 24

Page 25: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Медианный фильтр

• Значения в окне сортируются по интенсивности, выбирается среднее и записывается в выходной массив

• Нелинейный (медленный)

• Эффективно удаляет точечный шум (малое окно)

• Выполняет примитивную сегментацию (большое окно)

15 - 21 августа, Иннополис 25

Page 26: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Точечный шум

15 - 21 августа, Иннополис 26

Page 27: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Отфильтрованное изображение (k=3)

15 - 21 августа, Иннополис 27

Page 28: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

K=5

15 - 21 августа, Иннополис 28

Page 29: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

K=11

15 - 21 августа, Иннополис 29

Page 30: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

K=25

15 - 21 августа, Иннополис 30

Page 31: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

canny

15 - 21 августа, Иннополис 31

Page 32: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

canny, median k=5

15 - 21 августа, Иннополис 32

Page 33: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

canny, median k=25

15 - 21 августа, Иннополис 33

Page 34: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Морфологическая фильтрация

• Эрозия

res = cv2.erode(img,kernel)

• Дилация

res = cv2.dilate(img,kernel)

kernel = np.ones((3,3),np.uint8)

15 - 21 августа, Иннополис 34

Page 35: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Морфологическая фильтрация

• Открытие = dilate(erode(image)) cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

• Закрытие = erode(dilate(image)) cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

15 - 21 августа, Иннополис 35

Page 36: Катаев Александр - Singularis Lab...cv2.bilateralFilter(src, d, c, s[, dst[, borderType]]) → dst •Сохраняет контрастные границы •Убирает

Пример MORPH_OPEN

15 - 21 августа, Иннополис 36