技术文摘
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;
}
这三种滤波算法在图像处理中都有广泛的应用,根据不同的需求选择合适的滤波算法可以有效地提高图像处理的效果。在实际应用中,还可以结合其他图像处理技术,如边缘检测、图像分割等,以获得更好的图像处理结果。
- 30 个实用的 JavaScript 基础代码片段
- 搞懂选择 Java 虚拟线程的原因
- 用 SwiftUI 打造灵活的选择器
- GORM 中的模型定义
- B 站 Kafka 的探索与实践:我们一同探讨
- 系统设计内的缓存技术:全面指引
- 不懂 Python GUI?这些框架超友好
- 代码进击之路:解决问题的架构思维培养之道
- Java 和 MySQL 数据迁移与同步技术剖析
- 探索 Go Slices 切片泛型库的奇妙之处
- Go 异步任务的有效解决途径:Asynq
- 深入研究案例以全面掌控 Python GIL
- 分布式服务中八种异步实现形式探析
- JDK21 虚拟线程掀起技术革命,系统吞吐量翻倍
- Sed 原地替换文件的有趣经历