二值图像的降噪算法

本文介绍了一种针对二值图像的降噪方法,旨在去除图像中的小噪点和大块噪点。通过参考csdn和简书上的博客,提供了具体的实现案例,包括去除小噪点和大噪点的步骤。在深度图中,该方法同样适用,但需注意背景和目标颜色的转换。读者可以通过调整宏定义来实现去除不同背景色的噪点。
摘要由CSDN通过智能技术生成

适合的主要目标:二值化图像(只有黑白两色)

主要效果:去除较小的噪点和大块的噪点。

具体参考的博客:https://blog.csdn.net/ysc6688/article/details/50772382

真的很有用啊。

如果还不理解的话,这里有一份解读:

https://www.jianshu.com/p/ec78a1419bae

要注意的是,例子中的是白色是背景,黑色是目标和噪点,如果是在深度图中,那么就是黑色是背景(超过量程或者看不到就都是黑色),白色是目标。

因此建议大家先看完原文,我这里给出自己修改后的(有点小尴尬啦,其实我就是使用了一下,对,就是这么理直气壮。^-^)

下面是例子啦:

去除小的噪点:

/*  函数名:       NaiveRemoveNoise
 *  传入变量:
 *  img:         图像指针
 *  pNum:         元素周围的个数 
 *  return:       void
*/
void NaiveRemoveNoise(int pNum, Mat* img)
{
    //naive remove noise
    int i,j,m,n,nValue,nCount;
    int nWidth = img->cols;
    int nHeight =img->
根据提供的引用内容,我们可以了解到图像降噪的过程是通过观察到的噪声图像 y y y 获取图像真值 x x x 的过程。其中,图像噪声 n n n 是一个重要的因素。在这里,我们介绍一种基于 MRF(Markov Random Field)的二值图像降噪算法。 MRF 是一种概率图模型,它可以用于描述随机变量之间的依赖关系。在二值图像降噪中,我们可以将每个像素点看作一个随机变量,它的取值为 0 或 1,表示黑色或白色。我们可以通过 MRF 模型来描述这些像素点之间的依赖关系,从而实现图像降噪的目的。 以下是基于 MRF 的二值图像降噪的 C++ 代码实现: ```c++ #include <iostream> #include <vector> #include <cmath> using namespace std; // 定义 MRF 模型中的能量函数 double energy(vector<vector<int>>& img, int i, int j, double beta) { int h = img.size(); int w = img[0].size(); int sum = 0; if (i > 0) { sum += img[i - 1][j]; } if (i < h - 1) { sum += img[i + 1][j]; } if (j > 0) { sum += img[i][j - 1]; } if (j < w - 1) { sum += img[i][j + 1]; } return -beta * sum * img[i][j]; } // 定义 Gibbs 采样算法 void gibbs_sampling(vector<vector<int>>& img, double beta, int iterations) { int h = img.size(); int w = img[0].size(); for (int k = 0; k < iterations; k++) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { double p0 = exp(-energy(img, i, j, beta)); double p1 = exp(-energy(img, i, j, -beta)); double p = p1 / (p0 + p1); double r = (double)rand() / RAND_MAX; if (r < p) { img[i][j] = 1; } else { img[i][j] = 0; } } } } } int main() { // 读入二值图像 vector<vector<int>> img = {{0, 1, 1, 0, 0}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {0, 1, 1, 0, 1}, {0, 0, 1, 1, 0}}; // 设置参数 double beta = 1.0; int iterations = 1000; // 进行 Gibbs 采样 gibbs_sampling(img, beta, iterations); // 输出降噪后的图像 for (int i = 0; i < img.size(); i++) { for (int j = 0; j < img[0].size(); j++) { cout << img[i][j] << " "; } cout << endl; } return 0; } ``` 上述代码中,我们首先定义了 MRF 模型中的能量函数 energy,它表示每个像素点的能量。然后,我们使用 Gibbs 采样算法图像进行降噪。最后,我们输出降噪后的图像
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值