Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Низькочастотні та Високочастотні Фільтри | Обробка Зображень з OpenCV
Основи Комп'ютерного Зору

book
Низькочастотні та Високочастотні Фільтри

Однією з ключових переваг перетворення Фур'є є можливість виконання високочастотної та низькочастотної фільтрації.

Після застосування перетворення Фур'є:

необхідно створити фільтруючу маску

Низькочастотна фільтрація (розмиття)

Низькочастотний фільтр видаляє високочастотні компоненти, що призводить до розмиття зображення. Маска низькочастотного фільтра:

  • rows, cols = image.shape: retrieves the number of rows and columns from the grayscale image;

  • crow, ccol = rows // 2, cols // 2: computes the center coordinates of the image;

  • mask = np.zeros((rows, cols), np.uint8): creates a mask of zeros with the same dimensions as the image;

  • mask[crow-30:crow+30, ccol-30:ccol+30] = 1: sets a 60×60 square region at the center of the mask to 1, allowing only the low-frequency components (near the center of the frequency domain) to pass through while filtering out high-frequency details.

Високочастотна фільтрація (Виявлення контурів)

Високочастотний фільтр видаляє низькочастотні компоненти та підсилює краї. Маска високих частот:

  • highpass_mask = np.ones((rows, cols), np.uint8): ініціалізує маску з одиниць з такими ж розмірами, як і зображення, тобто всі частоти спочатку пропускаються;

  • highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0: встановлює невеликий квадрат 10×10 у центрі (область низьких частот) у нуль, ефективно блокуючи ці частоти.

Застосування фільтра

Після створення маски необхідно застосувати фільтр і перетворити зображення назад у просторову область:

  • dft_filtered = dft_shift * mask: застосування маски у частотній області (наприклад, низькочастотний або високочастотний фільтр) шляхом поелементного множення зі зсунутою DFT зображення;

  • dft_inverse = np.fft.ifftshift(dft_filtered): скасування попереднього зсуву для повернення частотних компонентів на їхні початкові позиції;

  • image_filtered = np.fft.ifft2(dft_inverse): обчислення оберненого перетворення Фур'є для перетворення відфільтрованих частотних даних назад у просторову область;

  • image_filtered = np.abs(image_filtered): взяття модуля для усунення залишкових уявних компонентів, отримання дійсного відфільтрованого зображення.

Завдання

Swipe to start coding

Вам надано зображення вівці у змінній image та зображення у частотній області у змінній dft_shift:

  • Отримайте розмірність матриці image та збережіть у змінних rows і cols;
  • Обчисліть центральну точку та збережіть у crow і ccol;
  • Визначте low_mask як масив із нулями розміром (rows, cols) та типом np.uint8;
  • Виберіть 20x20 центральну область у low_mask та заповніть її значеннями 1.
  • Визначте high_mask як масив із одиницями розміром (rows, cols) та типом np.uint8;
  • Виберіть 20x20 центральну область у high_mask та заповніть її значеннями 0;
  • Застосуйте low_mask і high_mask до dft_shift та збережіть відфільтровані частоти у lowpass_dft_filtered та highpass_dft_filtered відповідно;
  • Виконайте обернене перетворення для lowpass_dft_filtered:
    • Виконайте зворотне зміщення та збережіть у lowpass_dft_inverse;
    • Виконайте обернене перетворення та збережіть зображення у image_lowpass;
    • Видаліть від'ємні значення для image_lowpass.
  • Виконайте обернене перетворення для highpass_dft_inverse:
    • Виконайте зворотне зміщення та збережіть у lowpass_dft_inverse;
    • Виконайте обернене перетворення та збережіть зображення у image_highpass;
    • Видаліть від'ємні значення для image_highpass.

Рішення

import io
import cv2
import numpy as np
import urllib.request
from PIL import Image
import matplotlib.pyplot as plt

url = "https://content-media-cdn.codefinity.com/courses/ef049f7b-ce21-45be-a9f2-5103360b0655/task_pictures/sheep.jpg"
with urllib.request.urlopen(url) as response:
image_data = response.read()
image = np.array(Image.open(io.BytesIO(image_data)))
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)

# Write your code below
rows, cols = image.shape
crow, ccol = rows // 2, cols // 2

low_mask = np.zeros((rows, cols), np.uint8)
low_mask[crow-10:crow+10, ccol-10:ccol+10] = 1

high_mask = np.ones((rows, cols), np.uint8)
high_mask[crow-10:crow+10, ccol-10:ccol+10] = 0

lowpass_dft_filtered = dft_shift * low_mask
highpass_dft_filtered = dft_shift * high_mask

lowpass_dft_inverse = np.fft.ifftshift(lowpass_dft_filtered) # Inverse Shifting
image_lowpass = np.fft.ifft2(lowpass_dft_inverse) # Inverse Transformation
image_lowpass = np.abs(image_lowpass) # Remove negative values

highpass_dft_inverse = np.fft.ifftshift(highpass_dft_filtered) # Inverse Shifting
image_highpass = np.fft.ifft2(highpass_dft_inverse) # Inverse Transformation
image_highpass = np.abs(image_highpass) # Remove negative values
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 3
single

single

import io
import cv2
import numpy as np
import urllib.request
from PIL import Image
import matplotlib.pyplot as plt

url = "https://content-media-cdn.codefinity.com/courses/ef049f7b-ce21-45be-a9f2-5103360b0655/task_pictures/sheep.jpg"
with urllib.request.urlopen(url) as response:
image_data = response.read()
image = np.array(Image.open(io.BytesIO(image_data)))
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)

# Write your code below
rows, cols = ___
crow, ccol = ___

low_mask = ___
low_mask[___] = ___

high_mask = ___
high_mask[___] = ___

lowpass_dft_filtered = ___
highpass_dft_filtered = ___

lowpass_dft_inverse = ___ # Inverse Shifting
image_lowpass = ___ # Inverse Transformation
image_lowpass = ___ # Remove negative values

highpass_dft_inverse = ___ # Inverse Shifting
image_highpass = ___ # Inverse Transformation
image_highpass = ___ # Remove negative values

# Display the results
plt.figure(figsize=(10,10))

plt.subplot(3,1,1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')

plt.subplot(3,1,2)
plt.imshow(image_lowpass, cmap='gray')
plt.title('Lowpass')

plt.subplot(3,1,3)
plt.imshow(image_highpass, cmap='gray')
plt.title('Highpass')

plt.tight_layout()
plt.show()

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

some-alt