高通滤波学习(opencv)

高通滤波学习(opencv)_第1张图片

以下代码参考视频解析

这段代码使用了二维FFT变换对输入图像进行频域处理,并设计了一个简单的高通滤波器。

前两行使用了numpy库中的fft2函数对输入图像image进行二维傅里叶变换(FFT)。接着,fft_shift函数将转化后的频谱数据fft_image移至频谱中心。这一步可以利用np.fft.ifftshift逆IFFT移动到原先的位置,不过代码没有实现。

接下来通过设定一个简单的高通滤波器,mask矩阵代表在频域缩小的高频分量。具体来说,给予仿照网站https://homepages.inf.ed.ac.uk/rbf/HIPR2/highpass.htm 定义为一个方形的掩膜(即简单的低通和高通相减),中央留下1,其余元素全部赋为0。然后再通过对滤波器结果与移位后得到的FFT图像进行点乘的方式进行滤波操作。最后再对滤波后数据应用ifftshift函数反转移动的内容,并用np.fft.ifft2 invert 进行傅里叶逆变换并取实数部分,输出被滤波后的图像filtered_image,转变成整数uint8类型的像素值。

一般的应用范围包括图像处理、计算机视觉、数字信号处理及其它领域,如图像增强、降噪等。在计算机视觉中,频域滤波器被广泛应用于对精细特征的提取、图像去噪等方面。

如果想要看懂代码,需要了解傅里叶变换及其频域概念,以及如何使用numpy库进行零频率移动和高通滤波器的设计。此外还需要理解FFT(快速傅里叶变换)和IFFT(逆傅里叶变换)原理,并且对numpy库中这些数据处理函数的参数含义有所了解。

    def image_filter(self, image):
        """高通滤波器"""

        # 进行二维FFT变换
        fft_image = np.fft.fft2(image)

        # 将零频率分量移到频谱的中心
        fft_shift = np.fft.fftshift(fft_image)

        # 可视化频谱
        # magnitude_spectrum = 20 * np.log(np.abs(fft_shift))

        # 设计一个简单的高通滤波器
        rows, cols = image.shape
        center_row, center_col = rows // 2, cols // 2
        cutoff_freq = 1

        # 创建滤波器
        mask = np.ones((rows, cols), np.uint8)
        mask[center_row - cutoff_freq:center_row + cutoff_freq,
        center_col - cutoff_freq:center_col + cutoff_freq] = 0

        # 应用滤波器
        filtered_shift = fft_shift * mask

        # 将频谱转换回原始状态
        filtered_image = np.fft.ifftshift(filtered_shift)

        # 进行逆FFT变换
        filtered_image = np.fft.ifft2(filtered_image)
        filtered_image = np.abs(filtered_image).astype(np.uint8)
        #
        # cv2.imshow("back_eft_src", filtered_image)
        src_filter_img =  filtered_image.copy()

        limit_gray_num = self.re_bg_gray_num(src_filter_img)

        # print("调整")

        #print("当前图片中位数:",limit_gray_num)
        if limit_gray_num >= 28:
            #print("超过额定28当前中位数亮度为,",limit_gray_num)
            # limit_gray_num = int(limit_gray_num*1.1)
            # if limit_gray_num >= 255:
            #     limit_gray_num = 255

            limit_gray_num = int(limit_gray_num*1.19)
            if limit_gray_num >= 255:
                limit_gray_num = 255


            #print("自动调整额定亮度为,", limit_gray_num)
            pass
        else:
            #print("低于额定28当前中位数暗度为,", limit_gray_num)
            black_limie_num =  15

            limit_gray_num = limit_gray_num + black_limie_num


        # print("\n")
        # print("输出:",limit_gray_num)
        # # limit_gray_num = self.tem # 测试用
        # print("limit_gray_num: ", limit_gray_num)
        # 对图像进行简单后处理
        for i in range(rows):
            for j in range(cols):

                if filtered_image[i, j] > limit_gray_num:
                # if filtered_image[i, j] > 28:
                    # filtered_image[i,j] = min((filtered_image[i,j] + 50), 255)
                    filtered_image[i, j] = 255
                else:
                    filtered_image[i, j] = 0  # 黑色

        return filtered_image,src_filter_img

你可能感兴趣的:(opencv,opencv,学习,python)