技术文摘
C++在图像处理中三种常见滤波算法的实现
2024-12-30 19:56:14 小编
C++在图像处理中三种常见滤波算法的实现
在图像处理领域,滤波算法是一种重要的技术手段,用于去除图像中的噪声、平滑图像、增强边缘等。本文将介绍 C++中三种常见的滤波算法及其实现。
一、均值滤波
均值滤波是一种简单的线性滤波算法,它通过计算邻域内像素的平均值来替换中心像素的值。这种算法可以有效地去除图像中的椒盐噪声,但会使图像变得模糊。
以下是使用 C++实现均值滤波的示例代码:
#include <iostream>
#include <opencv2/opencv.hpp>
cv::Mat meanFilter(cv::Mat image, int kernelSize) {
cv::Mat filteredImage = image.clone();
int halfSize = kernelSize / 2;
for (int i = halfSize; i < image.rows - halfSize; i++) {
for (int j = halfSize; j < image.cols - halfSize; j++) {
int sum = 0;
for (int m = -halfSize; m <= halfSize; m++) {
for (int n = -halfSize; n <= halfSize; n++) {
sum += image.at<uchar>(i + m, j + n);
}
}
filteredImage.at<uchar>(i, j) = sum / (kernelSize * kernelSize);
}
}
return filteredImage;
}
int main() {
cv::Mat image = cv::imread("image.jpg", 0);
cv::Mat filteredImage = meanFilter(image, 3);
cv::imshow("Original Image", image);
cv::imshow("Filtered Image", filteredImage);
cv::waitKey(0);
return 0;
}
二、中值滤波
中值滤波是一种非线性滤波算法,它将邻域内像素的值进行排序,然后用中间值替换中心像素的值。中值滤波对椒盐噪声有很好的去除效果,并且能较好地保留图像的边缘信息。
以下是中值滤波的 C++实现代码:
#include <iostream>
#include <opencv2/opencv.hpp>
cv::Mat medianFilter(cv::Mat image, int kernelSize) {
cv::Mat filteredImage = image.clone();
int halfSize = kernelSize / 2;
for (int i = halfSize; i < image.rows - halfSize; i++) {
for (int j = halfSize; j < image.cols - halfSize; j++) {
std::vector<int> values;
for (int m = -halfSize; m <= halfSize; m++) {
for (int n = -halfSize; n <= halfSize; n++) {
values.push_back(image.at<uchar>(i + m, j + n));
}
}
std::sort(values.begin(), values.end());
filteredImage.at<uchar>(i, j) = values[values.size() / 2];
}
}
return filteredImage;
}
三、高斯滤波
高斯滤波是一种基于高斯函数的平滑滤波算法,它对图像进行加权平均,权重与像素距离中心的远近有关。高斯滤波在去除噪声的能较好地保留图像的细节信息。
以下是高斯滤波的 C++实现:
#include <iostream>
#include <opencv2/opencv.hpp>
cv::Mat gaussianFilter(cv::Mat image, double sigma, int kernelSize) {
cv::Mat filteredImage = image.clone();
int halfSize = kernelSize / 2;
cv::Mat kernel = cv::getGaussianKernel(kernelSize, sigma);
for (int i = halfSize; i < image.rows - halfSize; i++) {
for (int j = halfSize; j < image.cols - halfSize; j++) {
double sum = 0.0;
for (int m = -halfSize; m <= halfSize; m++) {
for (int n = -halfSize; n <= halfSize; n++) {
sum += image.at<uchar>(i + m, j + n) * kernel.at<double>(m + halfSize, n + halfSize);
}
}
filteredImage.at<uchar>(i, j) = sum;
}
}
return filteredImage;
}
这三种滤波算法在图像处理中都有广泛的应用,根据不同的需求选择合适的滤波算法可以有效地提高图像处理的效果。在实际应用中,还可以结合其他图像处理技术,如边缘检测、图像分割等,以获得更好的图像处理结果。
- Spring Boot、MyBatis 与 MySQL 完成读写分离的实现
- LiveCode 开源八年后转闭源:付出回报失衡
- 前端页面性能指标:面试必问的基本介绍
- 几行 Java 代码实现图片文字提取功能
- 探索团队隐含价值观与需求的指引
- VR 的这张“旧船票”能否登上“元宇宙”飞船
- OpenHarmony 2.0 对 RK3399 的移植方法
- OpenHarmony Neptune 开发板的 I2C 驱动实现 OLED 屏幕显示
- 从 Docker 小白到实战:Dockerfile 解析与实战演示,轻松上手
- OpenHarmony HDF 配置管理的分析与使用
- 前端实战:借助 CSS3 打造类在线直播的队列动画
- AR/VR 虽能一览众山小但非真好汉 元宇宙存局限性
- 无法回避的 setState 难题
- 仅用 90 行代码达成模块打包器实现
- 纯 Web 视频剪辑仅需 120 行代码实现