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

Post on 06-Jul-2020

23 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related