c++如何使用opencv为灰度图像加入椒盐噪声
时间: 2024-09-06 14:02:01 浏览: 80
在C++中使用OpenCV为灰度图像加入椒盐噪声,可以使用`cv::Mat::setTo()`函数来实现。椒盐噪声是由两种噪声组成的,一种是幅度较小的“盐”噪声,另一种是幅度较大的“椒”噪声。在灰度图像中,通常是随机地将某些像素点设置为最大值(白色),而将另一些像素点设置为最小值(黑色)。
以下是一个简单的例子,展示了如何使用OpenCV为灰度图像加入椒盐噪声:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include <random>
int main() {
// 读取或创建一个灰度图像
cv::Mat src = cv::imread("path_to_image", cv::IMREAD_GRAYSCALE);
if (src.empty()) {
std::cout << "图像读取失败" << std::endl;
return -1;
}
// 创建两个随机数生成器
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, src.rows * src.cols - 1);
// 假设我们要为1%的像素点加入椒盐噪声
float noise_ratio = 0.01;
int noise_count = static_cast<int>(noise_ratio * src.total());
// 加入椒噪声(白色)
for (int i = 0; i < noise_count; ++i) {
int r = dis(gen) % src.rows;
int c = dis(gen) % src.cols;
src.at<uchar>(r, c) = 255; // 将像素值设置为白色
}
// 加入盐噪声(黑色)
for (int i = 0; i < noise_count; ++i) {
int r = dis(gen) % src.rows;
int c = dis(gen) % src.cols;
src.at<uchar>(r, c) = 0; // 将像素值设置为黑色
}
// 显示原始和加噪声后的图像
cv::imshow("Original Image", src);
cv::waitKey(0);
return 0;
}
```
在上述代码中,我们首先读取或创建了一个灰度图像`src`。然后使用了两个随机数生成器来确定哪些像素点会被设置为噪声点。我们通过`at<uchar>(r, c)`直接访问和修改图像矩阵中的像素值。最后,我们通过`imshow`函数显示了原始图像和加噪声后的图像。
阅读全文