В настоящее время я изучаю обработку изображений. В Scipy я знаю, что в Scipy.signal есть один медианный фильтр. Может ли кто-нибудь сказать мне, есть ли один фильтр, похожий на фильтр высоких частот?
Спасибо
В настоящее время я изучаю обработку изображений. В Scipy я знаю, что в Scipy.signal есть один медианный фильтр. Может ли кто-нибудь сказать мне, есть ли один фильтр, похожий на фильтр высоких частот?
Спасибо
«Фильтр верхних частот» — очень общий термин. Существует бесконечное количество различных «фильтров верхних частот», которые делают очень разные вещи (например, фильтр обнаружения краев, как упоминалось ранее, технически является фильтром верхних частот (большинство из них на самом деле являются полосовыми фильтрами), но его эффект сильно отличается от того, который вы, вероятно, имел в виду.)
В любом случае, исходя из большинства вопросов, которые вы задавали, вам, вероятно, следует изучить 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()
Вот как мы можем спроектировать 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
Один простой фильтр верхних частот:
-1 -1 -1
-1 8 -1
-1 -1 -1
Другой простой пример — оператор Собеля.
При обработке изображений такие фильтры часто называют «детекторами краев». в последний раз проверял.
scipy.filter содержит большое количество универсальных фильтров. Что-то вроде iirfilter можно настроить для получения типичных цифровых или аналоговых фильтров высоких частот Чебышева или Буттворта.
Вы можете использовать фильтр Гаусса, так как он дает большую резкость, чем чистый 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