現在、画像処理を勉強しています。 Scipyでは、Scipy.signalに中央値フィルターが1つあることを知っています。ハイパスフィルターに似たフィルターが1つある場合、誰か教えてもらえますか?
ありがとうございました
「ハイパスフィルター」は非常に一般的な用語です。非常に異なる処理を行う無数の異なる「ハイパスフィルター」があります(たとえば、前述のように、エッジ検出フィルターは技術的にはハイパス(ほとんどが実際にはバンドパスです)フィルターですが、おそらく、念頭に置いていました。)
とにかく、あなたが尋ねてきたほとんどの質問に基づいて、あなたはおそらく、特にあなたが仕事をするつもりである場合、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()
これは、scipy fftpack
を使用してHPFを設計する方法です。
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()
FFTを使用した周波数スペクトル
(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
Sobel演算子 も簡単な例です。
画像処理では、これらの種類のフィルターは「エッジ検出器」と呼ばれることが多い- Wikipediaのページ は、私が最後に確認したときは問題ありませんでした。
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
元のコードは以下から取得されました: Python and OpenCV)を使用したハイパスフィルターによる画像のシャープ化