понеділок, 3 травня 2021 р.

Нерізке маскування та підйом високих частот

Mathedemo
Якщо до зображення додати (відняти) його лапласіан $$ g(x,y)=f(x,y)+c \nabla^2 f(x,y), c=\pm 1, $$ то отримаємо фільтр підвищення різкості з ядрами:$$ \begin{vmatrix} -1 & -1 & -1] \\ -1 & 9 &-1 \\ -1 & -1 &-1 \end{vmatrix}, \begin{vmatrix} 0 & -1 & 0] \\ -1 & 5 &-1 \\ 0 & -1 &0 \end{vmatrix} $$ які підкреслюють краї зображення.

Функція cv2.detailEnhance реалізовує інший алгоритм підвищення різкості:

 img_details = cv2.detailEnhance(img, sigma_s=10, sigma_r=0.15) 
Якщо застосувати фільтр підвищення різкості до оригінального незашумленого зображення отримуються надзвичайно чіткі нереалістичні зображення
Результати обробки зображення (ліворуч) фільтром підвищення різкості ( посередині) та функцією detailEnhance(праворуч).

Описана технологія називається нерізким маскуванням, яка поширюється на довільні фільтри. Для розмитого деяким фільтром зображення $f_b(x,y)$ нове зображення $m(x,y)=f(x,y)-f_b(x,y)$ називається маскою. Потім ця маска додається до вихідного зображення з множником $k:$ $$ g(x,y)=f(x,y)+k \cdot m(x,y)=(k+1) f(x,y)-k f_b(x,y), $$ що призводить до посилення високочастотних компонент. При $k=1$ отримуємо нерізке маскування, а при $k>1$ отримуємо фільтрацію з підйомом високих частот(high-boost filtering).

Реалізація в OpenCV

# Розмиваємо зображення фільтром Гауса
gauss = cv2.GaussianBlur(image, (7,7), 0)
# Вибираємо коефіцєнт
k=1
# Піднімаємо високі частоти 
unsharp_image = cv2.addWeighted(image, k+1, gauss, -k, 0) 
Повзунок для вибору коефіцієнта $k$
img=cv2.imread('foto.jpg')
img_blur=cv2.GaussianBlur(img,(3,3),3)
img_L=cv2.Laplacian(img_blur, cv2.CV_8U)

def empty(a):pass
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",300,300)
cv2.createTrackbar("k/10","TrackBars",0,100,empty)
while True:
    k = cv2.getTrackbarPos("k/10","TrackBars")/10
    unsharp_image = cv2.addWeighted(img, k+1, img_L, k, 0)
    cv2.imshow("TrackBars",  unsharp_image)
    key=cv2.waitKey(3)
    if key == 27:break
cv2.destroyAllWindows() 
print(k)

Немає коментарів:

Дописати коментар