OpenCV 图像处理中滤波技术介绍

VS2022配置OpenCV环境

  1. 关于OpenCV在VS2022上配置的教程可以参考:VS2022 配置OpenCV开发环境详细教程

图像处理中滤波技术

图像滤波是图像处理中的一种重要技术,用于改善图像质量或提取图像中的特定特征。以下是一些常见的图像滤波技术:

  1. 均值滤波(Mean Filter)

    • 简单且广泛使用的线性滤波器,用于平滑图像并减少噪声。
    • 通过将每个像素值替换为该像素周围邻域内像素值的平均值来实现。
  2. 高斯滤波(Gaussian Filter)

    • 一种权重滤波器,使用高斯函数作为权重,对图像进行平滑处理。
    • 高斯滤波器对图像的边缘和细节有较好的保留效果。
  3. 中值滤波(Median Filter)

    • 一种非线性滤波器,通过替换每个像素值为其邻域内的中值来减少噪声。
    • 对于椒盐噪声(salt-and-pepper noise)特别有效。
  4. 锐化滤波(Sharpening Filter)

    • 通过增强图像中的高频成分来提高图像的清晰度。
    • 常用的锐化滤波器包括拉普拉斯滤波器。
  5. 拉普拉斯滤波(Laplacian Filter)

    • 用于边缘检测,通过突出图像中的二阶导数来实现。
    • 拉普拉斯滤波器可以增强图像的边缘,但也可能放大噪声。
  6. 双边滤波(Bilateral Filter)

    • 结合了均值滤波和高斯滤波的优点,同时保留了边缘信息。
    • 它根据像素的强度和空间距离进行加权,以平滑图像而不模糊边缘。
  7. 高通滤波(High-pass Filter)

    • 允许高频信号通过,阻止低频信号。
    • 在图像处理中,通常用于突出边缘和细节。
  8. 低通滤波(Low-pass Filter)

    • 与高通滤波器相反,允许低频信号通过,阻止高频信号。
    • 用于图像平滑和去噪。
  9. 傅里叶变换滤波(Fourier Transform Filtering)

    • 使用傅里叶变换将图像从空间域转换到频率域。
    • 在频率域中应用滤波器,然后通过逆傅里叶变换将图像转换回空间域。
  10. 形态学滤波(Morphological Filtering)

    • 包括膨胀(Dilation)、腐蚀(Erosion)、开运算(Opening)、闭运算(Closing)等。
    • 用于图像的形态学操作,如去除小的不规则性或连接断裂的区域。

每种滤波技术都有其特定的应用场景和效果。选择合适的滤波器取决于图像的特性和处理目标。例如,高斯滤波适合于平滑图像和去除高斯噪声,而中值滤波则更适合于去除椒盐噪声。在实际应用中,可能需要结合多种滤波技术来达到最佳效果。

均值滤波

  1. 介绍:均值滤波是最简单的滤波器之一,它将每个像素的值替换为其邻域内所有像素值的平均值。
  2. 函数:blur()
  3. c++ demo:
cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image, blur_image;
    image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::blur(image, blur_image, cv::Size(5, 5)); // 5x5的均值滤波
    cv::imshow("blur_image", blur_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:

高斯滤波

  1. 介绍: 高斯滤波使用高斯函数作为权重来计算邻域内像素的平均值,对图像进行平滑。
  2. 函数:GaussianBlur()
  3. c++ demo
cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image, gaussian_image;
    image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::GaussianBlur(image, gaussian_image, cv::Size(5, 5), 0); // 5x5的高斯滤波
    cv::imshow("gaussian_image", gaussian_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:

中值滤波

  1. 介绍:中值滤波是一种非线性滤波器,它将每个像素替换为其邻域内所有像素值的中值,对椒盐噪声非常有效。
  2. 函数:medianBlur()
  3. c++ demo
cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image, median_image;
    image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::medianBlur(image, median_image, 5); // 5x5的中值滤波
    cv::imshow("median_image", median_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:

双边滤波

  1. 介绍:双边滤波在平滑图像的同时保留边缘,它根据像素值的接近度和空间距离来加权。
  2. 函数:bilateralFilter()
  3. c++ demo
cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image, bilateral_image;
    image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::bilateralFilter(image, bilateral_image, 9, 75, 75); // 9x9的双边滤波
    cv::imshow("bilateral_image", bilateral_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:

锐化滤波

  1. 介绍:锐化滤波通过增强图像的高频分量来使图像看起来更清晰。
  2. 函数:filter2D()
  3. c++ demo
cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image, sharpen_image;
    image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::Mat kernel = (cv::Mat_<char>(3, 3) << 0, -1, 0,
        -1, 5, -1,
        0, -1, 0);
    cv::filter2D(image, sharpen_image, image.depth(), kernel);
    cv::imshow("sharpen_image", sharpen_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:

拉普拉斯滤波

  1. 介绍:拉普拉斯滤波是一种边缘增强的线性滤波器,它使用拉普拉斯算子来突出图像的二阶导数。
  2. 函数
  3. c++ demo:
cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image, laplacian_image;
    image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::Laplacian(image, laplacian_image, CV_16S, 1);
    cv::convertScaleAbs(laplacian_image, laplacian_image); // 转换为无符号8位
    cv::imshow("laplacian_image", laplacian_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:

方框滤波

  1. 介绍:方框滤波是一种简单的线性滤波器,它将每个像素的值替换为其邻域内所有像素值的总和除以邻域大小。
  2. 函数:blur()
  3. c++ demo
cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat src_image, box_image;
    src_image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::blur(src_image, box_image, cv::Size(3, 3), cv::Point(-1, -1), 
    cv::BORDER_DEFAULT);
    cv::imshow("box_image", box_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:

自定义滤波器

  1. 介绍:可以创建自定义的滤波器核来应用特定的效果。

  2. 函数:filter2D

  3. c++ demo

cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat src_image, custom_filtered_image;
    src_image = cv::imread("amy.png", cv::IMREAD_COLOR);
    cv::Mat custom_kernel = (cv::Mat_<float>(3, 3) << 1, 1, 1,
        1, 0, 1,
        1, 1, 1);
    cv::filter2D(src_image, custom_filtered_image, src_image.depth(), custom_kernel);
    cv::imshow("custom_filtered_image", custom_filtered_image);
    cv::waitKey(0); // 等待用户按键
    return 0;
}
  • 结果:
相关推荐
IT古董4 分钟前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
凯哥是个大帅比4 分钟前
人工智能ACA(五)--深度学习基础
人工智能·深度学习
m0_7482329224 分钟前
DALL-M:基于大语言模型的上下文感知临床数据增强方法 ,补充
人工智能·语言模型·自然语言处理
szxinmai主板定制专家29 分钟前
【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
大数据·人工智能·fpga开发
海棠AI实验室32 分钟前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
机器懒得学习43 分钟前
基于YOLOv5的智能水域监测系统:从目标检测到自动报告生成
人工智能·yolo·目标检测
QQ同步助手1 小时前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度
AIGC大时代1 小时前
如何使用ChatGPT辅助文献综述,以及如何进行优化?一篇说清楚
人工智能·深度学习·chatgpt·prompt·aigc
流浪的小新1 小时前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
martian6652 小时前
【人工智能数学基础篇】——深入详解多变量微积分:在机器学习模型中优化损失函数时应用
人工智能·机器学习·微积分·数学基础