技术文摘
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;
}
这三种滤波算法在图像处理中都有广泛的应用,根据不同的需求选择合适的滤波算法可以有效地提高图像处理的效果。在实际应用中,还可以结合其他图像处理技术,如边缘检测、图像分割等,以获得更好的图像处理结果。
- Github 推出 Classroom 功能,助力老师在线改作业
- 10 个技巧助你成为优秀 Vue 开发者
- 做诸多架构,你果真懂 SOA 吗?
- 构建即时消息应用(三):对话
- core-js 作者获刑 18 个月,月下载量过亿的 npm 包或无人维护
- Github 8 小时连续故障之因:数据库基础架构
- 2020 年前端性能优化的 23 条建议
- 22 个常用的 Python 包
- 从事数据科学,编码技能是否达标?
- 轻松读懂 HashMap
- Spring Boot 注解全览,值得收藏!
- 分布式事务常见的三类解决方案
- OPPO 加速构建应用生态系统:Hello Watch 软件开发大赛今日开启
- 苹果 Swift 编程语言拟扩大对 Windows 10 和 Linux 平台支持
- 事半功倍!这 5 个 React 应用库不容错过