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

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

Спасибо

Ответы [ 5 ]

43 голосов
/ 25 мая 2011

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

Во всяком случае, основываясь на большинстве вопросов, которые вы задавали, вам, вероятно, следует рассмотреть 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()

enter image description here

4 голосов
/ 23 мая 2011

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

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

Оператор Собеля является еще одним простым примером.

При обработке изображений эти виды фильтров часто называют "детекторами кромок" - страница Википедии была в порядке в этот последний раз, когда я проверял.

1 голос
/ 05 июля 2018

Вот как мы можем создать 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()

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

enter image description here

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()

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

enter image description here

(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()

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

enter image description here

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

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

enter image description here

1 голос
/ 23 мая 2011

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

0 голосов
/ 18 августа 2018

Вы можете использовать фильтр Гаусса, поскольку он дает большую резкость, чем чистый 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

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

...