Фильтр верхних частот для обработки изображений в python с использованием scipy/numpy

В настоящее время я изучаю обработку изображений. В Scipy я знаю, что в Scipy.signal есть один медианный фильтр. Может ли кто-нибудь сказать мне, есть ли один фильтр, похожий на фильтр высоких частот?

Спасибо


person Hold_My_Anger    schedule 23.05.2011    source источник


Ответы (5)


«Фильтр верхних частот» — очень общий термин. Существует бесконечное количество различных «фильтров верхних частот», которые делают очень разные вещи (например, фильтр обнаружения краев, как упоминалось ранее, технически является фильтром верхних частот (большинство из них на самом деле являются полосовыми фильтрами), но его эффект сильно отличается от того, который вы, вероятно, имел в виду.)

В любом случае, исходя из большинства вопросов, которые вы задавали, вам, вероятно, следует изучить scipy.ndimage вместо scipy.filter, особенно если вы собираетесь работать с большими изображениями (ndimage может выполнять операции на месте, экономя память).

В качестве базового примера показаны несколько различных способов ведения дел:

import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage
import Image

def plot(data, title):
    plot.i += 1
    plt.subplot(2,2,plot.i)
    plt.imshow(data)
    plt.gray()
    plt.title(title)
plot.i = 0

# Load the data...
im = Image.open('lena.png')
data = np.array(im, dtype=float)
plot(data, 'Original')

# A very simple and very narrow highpass filter
kernel = np.array([[-1, -1, -1],
                   [-1,  8, -1],
                   [-1, -1, -1]])
highpass_3x3 = ndimage.convolve(data, kernel)
plot(highpass_3x3, 'Simple 3x3 Highpass')

# A slightly "wider", but sill very simple highpass filter 
kernel = np.array([[-1, -1, -1, -1, -1],
                   [-1,  1,  2,  1, -1],
                   [-1,  2,  4,  2, -1],
                   [-1,  1,  2,  1, -1],
                   [-1, -1, -1, -1, -1]])
highpass_5x5 = ndimage.convolve(data, kernel)
plot(highpass_5x5, 'Simple 5x5 Highpass')

# Another way of making a highpass filter is to simply subtract a lowpass
# filtered image from the original. Here, we'll use a simple gaussian filter
# to "blur" (i.e. a lowpass filter) the original.
lowpass = ndimage.gaussian_filter(data, 3)
gauss_highpass = data - lowpass
plot(gauss_highpass, r'Gaussian Highpass, $\sigma = 3 pixels$')

plt.show()

введите здесь описание изображения

person Joe Kington    schedule 24.05.2011
comment
Спасибо за отличный сценарий! Я многое узнал о convolve() и matplotlib и даже о Python. (Я понятия не имел, что что-то вроде plot.i может работать.) - person David Poole; 28.07.2011
comment
разве фильтр Гаусса не является фильтром нижних частот? - person A. H.; 10.11.2013
comment
@ А.Х. - Да, но если вычесть гауссовский фильтр нижних частот из исходного изображения, вы получите эквивалентный фильтр верхних частот. Это то, что называется гауссовским высоким проходом. (Посмотрите на комментарии над кодом для этой части.) - person Joe Kington; 10.11.2013
comment
Учитывая возвращение convolve, возможно ли получить dx и dy? - person pceccon; 18.03.2014

Вот как мы можем спроектировать HPF с scipy fftpack

from skimage.io import imread
import matplotlib.pyplot as plt
import scipy.fftpack as fp

im = np.mean(imread('../images/lena.jpg'), axis=2) # assuming an RGB image
plt.figure(figsize=(10,10))
plt.imshow(im, cmap=plt.cm.gray)
plt.axis('off')
plt.show()

Исходное изображение

введите описание изображения здесь

F1 = fftpack.fft2((im).astype(float))
F2 = fftpack.fftshift(F1)
plt.figure(figsize=(10,10))
plt.imshow( (20*np.log10( 0.1 + F2)).astype(int), cmap=plt.cm.gray)
plt.show()

Частотный спектр с БПФ

введите описание изображения здесь

(w, h) = im.shape
half_w, half_h = int(w/2), int(h/2)

# high pass filter
n = 25
F2[half_w-n:half_w+n+1,half_h-n:half_h+n+1] = 0 # select all but the first 50x50 (low) frequencies
plt.figure(figsize=(10,10))
plt.imshow( (20*np.log10( 0.1 + F2)).astype(int))
plt.show()

Блокировать низкие частоты спектра

введите описание изображения здесь

im1 = fp.ifft2(fftpack.ifftshift(F2)).real
plt.figure(figsize=(10,10))
plt.imshow(im1, cmap='gray')
plt.axis('off')
plt.show()

Выходное изображение после применения HPF

введите описание изображения здесь

person Sandipan Dey    schedule 05.07.2018

Один простой фильтр верхних частот:

-1 -1 -1
-1  8 -1
-1 -1 -1

Другой простой пример — оператор Собеля.

При обработке изображений такие фильтры часто называют «детекторами краев». в последний раз проверял.

person Martin Thompson    schedule 23.05.2011
comment
Правда, оператор Лапласа часто называют краевым детектором. Печально, потому что это не так. Он действительно хорошо обнаруживает линии и точки, а не края (например, он не дает высокого отклика на краях, там он стремится к нулю). - person Cris Luengo; 06.07.2018

scipy.filter содержит большое количество универсальных фильтров. Что-то вроде iirfilter можно настроить для получения типичных цифровых или аналоговых фильтров высоких частот Чебышева или Буттворта.

person talonmies    schedule 23.05.2011

Вы можете использовать фильтр Гаусса, так как он дает большую резкость, чем чистый HPF, для использования простого HPF вы можете использовать следующий код

import numpy as np
import cv2
from scipy import ndimage

class HPF(object):
    def __init__(self, kernel, image):
        self.kernel = np.array(kernel)
        self.image = image

    def process(self):
        return ndimage.convolve(self.image, self.kernel)


if __name__ == "__main__":
    #enter ur image location
    image = cv2.imread("images/test2.jpg", 0)
    kernel3x3 = [[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]
    kernel5x5 = [[-1, -1, -1, -1, -1],
    [-1, 1, 2, 1, -1],
    [-1, 2, 4, 2, -1],
    [-1, 1, 2, 1, -1],
    [-1, -1, -1, -1, -1]]

    hpf1 = HPF(kernel3x3, image)
    hpfimage1 = hpf1.process()
    hpf2 = HPF(kernel5x5, image)
    hpfimage2 = hpf2.process()
    cv2.imshow("3x3",hpfimage1)
    cv2.imshow("5x5",hpfimage2)
    cv2.waitKey()
    cv2.destroyAllWindows()

Чтобы использовать фильтр Гаусса, просто добавьте к изображению размытие по Гауссу.

blurred = cv2.GaussianBlur(image, (11, 11), 0)

Затем минус из исходного изображения

g_hpf = image - blurred

Исходный код взят из: Image Повышение резкости с помощью фильтра верхних частот с использованием Python и OpenCV

person Mohd Shibli    schedule 18.08.2018