opencv图像傅里叶变换

一,平滑均值滤波,奇数尺寸,参数和为1,缺点没有去除噪声,反而让图像模糊,代码,

"""
平滑滤波
"""
def average_filter():
    img=cv2.imread('./data/opencv_logo.png')
    kernel=np.ones(shape=(5,5),dtype=np.float32)/25
    dst=cv2.filter2D(src=img,ddepth=-1,kernel=kernel)
    plt.subplot(121)
    plt.imshow(img)
    plt.title('original')
    plt.axis('off')
    plt.subplot(122)
    plt.imshow(dst)
    plt.title('Average')
    plt.axis('off')
    plt.show()

打印结果:

二,平滑高斯滤波,模拟人眼关注中心区域,有效去除高斯噪声

"""
高斯滤波
"""
def image_gauss():
    img = cv2.imread('./data/img.png')

    gauss_img = cv2.GaussianBlur(img, (7, 7),0)
    plt.subplot(121)
    plt.imshow(img)
    plt.title('original')
    plt.axis('off')
    plt.subplot(122)
    plt.imshow(gauss_img)
    plt.title('gauss_img')
    plt.axis('off')
    plt.show()

打印结果:

三,中值滤波,卷积域内的像素值从小到大排序,取中间值作为卷积输出,有效去除椒盐噪声

"""
中值滤波
"""
def image_median():
    img = cv2.imread('./data/img1.png')

    median_img = cv2.medianBlur(img,5)
    plt.subplot(121)
    plt.imshow(img)
    plt.title('original')
    plt.axis('off')
    plt.subplot(122)
    plt.imshow(median_img)
    plt.title('medians_img')
    plt.axis('off')
    plt.show()

打印结果:

四,高通滤波器(梯度滤波器)Sobel, and Laplacian,能够得到边缘信息。

https://docs.opencv.org/master/d5/d0f/tutorial_py_gradients.html
"""
三种高通滤波器
"""
def high_pass():
    img = cv2.imread('./data/dave.png', 0)
    laplacian = cv2.Laplacian(img, cv2.CV_64F)
    sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
    sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
    plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
    plt.title('Original'), plt.xticks([]), plt.yticks([])
    plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray')
    plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
    plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray')
    plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
    plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray')
    plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
    plt.show()

五,傅里叶变换用来分析各种滤波器的频率特性,图片中的边缘点和噪声可看成是高频分量,因为变化明显,没有很大变化的就看成低频分量

https://docs.opencv.org/master/de/dbc/tutorial_py_fourier_transform.html

"""
傅利叶变换
"""
def FFT():
    img = cv2.imread('./data/img3.png', 0)
    f = np.fft.fft2(img)
    fshift = np.fft.fftshift(f)
    magnitude_spectrum = 20 * np.log(np.abs(fshift))
    plt.subplot(121), plt.imshow(img, cmap='gray')
    plt.title('Input Image'), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
    plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
    plt.show()

在中间部分更亮,表明低频分量多

用60×60窗口去掉低频分量

def FFT():
    img = cv2.imread('./data/img3.png', 0)
    f = np.fft.fft2(img)
    fshift = np.fft.fftshift(f)
    # magnitude_spectrum = 20 * np.log(np.abs(fshift))
    # plt.subplot(121), plt.imshow(img, cmap='gray')
    # plt.title('Input Image'), plt.xticks([]), plt.yticks([])
    # plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
    # plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
    # plt.show()

    rows, cols = img.shape
    crow, ccol = int(rows / 2), int(cols / 2)
    fshift[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0
    f_ishift = np.fft.ifftshift(fshift)
    img_back = np.fft.ifft2(f_ishift)
    img_back = np.abs(img_back)
    plt.subplot(131), plt.imshow(img, cmap='gray')
    plt.title('Input Image'), plt.xticks([]), plt.yticks([])
    plt.subplot(132), plt.imshow(img_back, cmap='gray')
    plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
    plt.subplot(133), plt.imshow(img_back)
    plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
    plt.show()

可见只保留了人的边缘信息,证明了中间亮的那些部分是低频分量。

六,Laplacian为啥是高通滤波器

def laplace_high_pass():
    # simple averaging filter without scaling parameter
    mean_filter = np.ones((3,3))
    # creating a gaussian filter
    x = cv2.getGaussianKernel(5,10)
    gaussian = x*x.T
    # different edge detecting filters
    # scharr in x-direction
    scharr = np.array([[-3, 0, 3],
                       [-10,0,10],
                       [-3, 0, 3]])
    # sobel in x direction
    sobel_x= np.array([[-1, 0, 1],
                       [-2, 0, 2],
                       [-1, 0, 1]])
    # sobel in y direction
    sobel_y= np.array([[-1,-2,-1],
                       [0, 0, 0],
                       [1, 2, 1]])
    # laplacian
    laplacian=np.array([[0, 1, 0],
                        [1,-4, 1],
                        [0, 1, 0]])
    filters = [mean_filter, gaussian, laplacian, sobel_x, sobel_y, scharr]
    filter_name = ['mean_filter', 'gaussian','laplacian', 'sobel_x', \
                    'sobel_y', 'scharr_x']
    fft_filters = [np.fft.fft2(x) for x in filters]
    fft_shift = [np.fft.fftshift(y) for y in fft_filters]
    mag_spectrum = [np.log(np.abs(z)+1) for z in fft_shift]
    for i in range(6):
        plt.subplot(2,3,i+1),plt.imshow(mag_spectrum[i],cmap = 'gray')
        plt.title(filter_name[i]), plt.xticks([]), plt.yticks([])
    plt.show()

打印结果:

中间有白色的部分代表是低通滤波器,中间有黑色的部分代表是高通滤波器。

猜你喜欢

转载自blog.csdn.net/fanzonghao/article/details/81255203