2013-08-15 14:24:04 zhujun007007 阅读数 1587

opencv版本：2.3.1  IDE:vs2010 语言：C++。

/**
*@brief 随机噪声点过滤
*@param src 预处理图片
*@param w 预处理噪声点像素宽
*@param h 预处理噪声点像素高
@return None
*/
void Recognize::randomPointNoseFilter(Mat &src, int w, int h)
{
for(int i = 0; i < src.rows - h; i++)
for(int j = 0; j < src.cols - w; j++)
{
int countw = 0,counth = 0;
for(int k = 0; k < w; k++)
{
if((int)src.data[i * src.cols + j + k] != 0 || (int)src.data[(i + h - 1) * src.cols + j + k] != 0)
break;
countw++;
}
for(int k = 0; k < h; k++)
{
if((int)src.data[(i + k) * src.cols + j] != 0 || (int)src.data[(i + k) * src.cols + j + w - 1] != 0)
break;
counth++;
}
if(countw == w && counth == h)
{
for(int k = 0; k < h; k++)
for(int l = 0; l < w; l++)
src.data[(i + k) * src.cols + j + l] = 0;
}
}
}

2018-11-15 13:28:52 lehuoziyuan 阅读数 718

#define RAND_MAX 0x7fff

OpenCV提供了函数medianBlur和函数blur来实现均值滤波和中值滤波，这两个函数的使用方法简单，没必要作过多的说明，唯一需要说明白是这两个函数的第三个参数均需提供核算子的大小,关于“核算子”的概念，大家可参考博文https://blog.csdn.net/lehuoziyuan/article/details/84101788

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <time.h>
#include <iostream>

using namespace cv;
using namespace std;

void ColorSalt(Mat& image, int n)//本函数加入彩色盐噪声
{
srand((unsigned)time(NULL));
for (int k = 0; k<n; k++)//将图像中n个像素随机置零
{
int i = rand() % image.cols;
int j = rand() % image.rows; RAND_MAX
//将图像颜色随机改变
image.at<Vec3b>(j, i)[0] = 250;
image.at<Vec3b>(j, i)[1] = 150;
image.at<Vec3b>(j, i)[2] = 250;
}
}

void ColorPepper(Mat& image, int n)//本函数加入彩色椒噪声
{
srand((unsigned)time(NULL));
for (int k = 0; k<n; k++)
{
int i = rand() % image.cols;
int j = rand() % image.rows;
//将图像颜色随机改变
image.at<Vec3b>(j, i)[0] = 250;
image.at<Vec3b>(j, i)[1] = 150;
image.at<Vec3b>(j, i)[2] = 50;
}
}

int main()
{
//源图像
Mat dst;
Mat img = scr.clone();
Mat img1 = scr.clone();

cout << scr.channels() << " " << scr.type() << "  " << scr.depth();
imshow("原图像", scr);

ColorSalt(scr, 5000);  //加入白盐噪声
ColorPepper(scr, 1000); //加入黑椒噪声
imshow("带噪声的图像", scr);

medianBlur(scr, dst, 3);  //中值滤波，核算子大小为3，锚点为默认的中间点
imshow("中值滤波结果", dst);

ColorSalt(img, 5000);
ColorPepper(img, 1000);
blur(img, dst, Size(3, 3));//均值滤波，核算子大小为3，锚点为默认的中间点
imshow("均值滤波结果", dst);

waitKey(0);
return EXIT_SUCCESS;
}

2019-10-06 14:01:14 qq_39653453 阅读数 45

%过滤椒盐噪声较好的办法使用Q为正值的反调和滤波器
clc
clear
[M,N]=size(f);
R=imnoise2('salt & pepper',M,N,0.1,0);%概率为0.1的椒盐噪声
c=find(R==0);
gp=f;
gp(c)=0;
subplot(3,2,1)
imshow(f)
title('原图')
subplot(3,2,2)
imshow(gp)
title('概率0.1椒盐噪声污染')

R=imnoise2('salt & pepper',M,N,0,0.1);%仅被盐粒噪声污染
c=find(R==1);
gs=f;
gs(c)=255;
subplot(3,2,3)
imshow(gs);
title('被盐粒噪声污染')

%用反调和滤波器处理
fp=spfilt(gp,'chmean',3,3,1.5);%椒盐噪声是加了暗值的干扰，所以1.5
subplot(3,2,4)%3*3 Q=1.5的反调和滤波器滤波结果
imshow(fp)
title('过滤椒盐噪声')

fs=spfilt(gs,'chmean',3,3,-1.5);%椒盐噪声是加了亮值的干扰，所以-1.5
subplot(3,2,5)
imshow(fs)
title('过滤盐粒噪声')

2017-02-06 22:31:00 weixin_33851604 阅读数 120

• 图像的读取
• 图像的显示
• 访问图像的像素值

## OpenCV基础

namedWindow

• WINDOW_NORMAL or WINDOW_AUTOSIZE 调整窗口的大小以适应图像，不同的是，使用WINDOW_NORMAL可以手动调整窗口的大小；WINDOW_AUTOSIZE不能调整窗口的大小。
• WINDOW_FREERATIO or WINDOW_KEEPRATIO 改变窗口时是否会保持图像的ratio不变，没发现这俩有什么区别。

imshow显示图像

imread 读取图像数据到Mat中,第一个参数是图像的文件名；第二个参数是标志，标识怎么处理图像的色彩。常用的几个选项：

Mat是OpenCV中最重要的数据结构，在做图像处理时基本都是对该结构体的操作。Mat由两部分构成：矩阵头矩阵数据，矩阵头较小，创建的每个Mat实例都拥有一个矩阵头，而矩阵数据通常占有较大的空间，OpenCV中通过引用计数来管理这部分内存空间，当调用赋值运算符和拷贝构造函数时，并不会只复制矩阵头，并不会复制矩阵数据，只是将其的引用计数加1.例如：

Mat m = imread("img.jpg");
Mat a = m; // 赋值运算符
Mat b(m); // 拷贝构造函数

Mat m = imread("img.jpg");
Mat f = m.clone();
Mat g ;
m.copyTo(g);

• 通过指针
• 使用迭代器
• 调用at

## 图像噪声

• 外部噪声
• 内部噪声
这种分类方法，有助于理解噪声产生的源头，但对于降噪算法只能起到原理上的帮组。

• 加性噪声，加性噪声和图像信号强度不相关，这类噪声可以看着理想无噪声图像f和噪声的和。
• 乘性噪声，乘性噪声和图像信号是相关的，往往随图像信号的变化而变化。
而为了分析处理的方便，常常将乘性噪声近似认为是加性噪声，而且总是假定信号和噪声是互相独立的。

• 高斯噪声，高斯噪声模型经常被用于实践中。
• 脉冲噪声（椒盐噪声），图像上一个个点，也可称为散粒和尖峰噪声。
• 伽马噪声
• 瑞利噪声
• 指数分布噪声
• 均匀分布噪声
这种分类方法，引入了数学模型，对设计过滤算法比较有帮助。

## C++11 随机数发生器

• linear_congruential_engine 线性同余算法
• mersenne_twister_engine 梅森旋转算法
• subtract_with_carry_engine 带进位的线性同余算法

#include <random>

std::random_device rd; // 随机数种子
std::mt19937 mt(rd()); // 随机数引擎
std::normal_distribution<> d(5,20); // 高斯分布

std::map<int,int> hist;
for(int n = 0; n < 10000; n ++)
++hist[std::round(d(mt))]; // 生成符合高斯分布的随机数

## 添加图像噪声

// 添加椒盐噪声
{
// 随机数产生器
std::random_device rd; //种子
std::mt19937 gen(rd()); // 随机数引擎

auto cols = m.cols * m.channels();

for (int i = 0; i < num; i++)
{
auto row = static_cast<int>(gen() % m.rows);
auto col = static_cast<int>(gen() % cols);

auto p = m.ptr<uchar>(row);
p[col++] = 255;
p[col++] = 255;
p[col] = 255;
}
}

// 添加Gussia噪声
// 使用指针访问
void addGaussianNoise(Mat &m, int mu, int sigma)
{
// 产生高斯分布随机数发生器
std::random_device rd;
std::mt19937 gen(rd());

std::normal_distribution<> d(mu, sigma);

auto rows = m.rows; // 行数
auto cols = m.cols * m.channels(); // 列数

for (int i = 0; i < rows; i++)
{
auto p = m.ptr<uchar>(i); // 取得行首指针
for (int j = 0; j < cols; j++)
{
auto tmp = p[j] + d(gen);
tmp = tmp > 255 ? 255 : tmp;
tmp = tmp < 0 ? 0 : tmp;
p[j] = tmp;
}
}
}

## 使用滤波器去除噪声

blur(m, m2, Size(5, 5));第一个参数是输入的图像，第二个参数是输出的图像，第三个参数是滤波器的大小，这里使用的是$$5 \times 5$$的矩形。

## 总结

2017-02-10 16:19:41 pvxv1bbl 阅读数 354

• 图像的读取
• 图像的显示
• 访问图像的像素值

## OpenCV基础

namedWindow

• WINDOW_NORMAL or WINDOW_AUTOSIZE 调整窗口的大小以适应图像，不同的是，使用WINDOW_NORMAL可以手动调整窗口的大小；WINDOW_AUTOSIZE不能调整窗口的大小。
• WINDOW_FREERATIO or WINDOW_KEEPRATIO 改变窗口时是否会保持图像的ratio不变，没发现这俩有什么区别。

imshow显示图像

imread 读取图像数据到Mat中,第一个参数是图像的文件名；第二个参数是标志，标识怎么处理图像的色彩。常用的几个选项：

Mat是OpenCV中最重要的数据结构，在做图像处理时基本都是对该结构体的操作。Mat由两部分构成：矩阵头矩阵数据，矩阵头较小，创建的每个Mat实例都拥有一个矩阵头，而矩阵数据通常占有较大的空间，OpenCV中通过引用计数来管理这部分内存空间，当调用赋值运算符和拷贝构造函数时，并不会只复制矩阵头，并不会复制矩阵数据，只是将其的引用计数加1.例如：

Mat m = imread("img.jpg");
Mat a = m; // 赋值运算符
Mat b(m); // 拷贝构造函数

Mat m = imread("img.jpg");
Mat f = m.clone();
Mat g ;
m.copyTo(g);

• 通过指针
• 使用迭代器
• 调用at

## 图像噪声

• 外部噪声
• 内部噪声
这种分类方法，有助于理解噪声产生的源头，但对于降噪算法只能起到原理上的帮组。

• 加性噪声，加性噪声和图像信号强度不相关，这类噪声可以看着理想无噪声图像f和噪声的和。
• 乘性噪声，乘性噪声和图像信号是相关的，往往随图像信号的变化而变化。
而为了分析处理的方便，常常将乘性噪声近似认为是加性噪声，而且总是假定信号和噪声是互相独立的。

• 高斯噪声，高斯噪声模型经常被用于实践中。
• 脉冲噪声（椒盐噪声），图像上一个个点，也可称为散粒和尖峰噪声。
• 伽马噪声
• 瑞利噪声
• 指数分布噪声
• 均匀分布噪声
这种分类方法，引入了数学模型，对设计过滤算法比较有帮助。

## C++11 随机数发生器

• linear_congruential_engine 线性同余算法
• mersenne_twister_engine 梅森旋转算法
• subtract_with_carry_engine 带进位的线性同余算法

#include <random>

std::random_device rd; // 随机数种子
std::mt19937 mt(rd()); // 随机数引擎
std::normal_distribution<> d(5,20); // 高斯分布

std::map<int,int> hist;
for(int n = 0; n < 10000; n ++)
++hist[std::round(d(mt))]; // 生成符合高斯分布的随机数

## 添加图像噪声

// 添加椒盐噪声
{
// 随机数产生器
std::random_device rd; //种子
std::mt19937 gen(rd()); // 随机数引擎

auto cols = m.cols * m.channels();

for (int i = 0; i < num; i++)
{
auto row = static_cast<int>(gen() % m.rows);
auto col = static_cast<int>(gen() % cols);

auto p = m.ptr<uchar>(row);
p[col++] = 255;
p[col++] = 255;
p[col] = 255;
}
}

// 添加Gussia噪声
// 使用指针访问
void addGaussianNoise(Mat &m, int mu, int sigma)
{
// 产生高斯分布随机数发生器
std::random_device rd;
std::mt19937 gen(rd());

std::normal_distribution<> d(mu, sigma);

auto rows = m.rows; // 行数
auto cols = m.cols * m.channels(); // 列数

for (int i = 0; i < rows; i++)
{
auto p = m.ptr<uchar>(i); // 取得行首指针
for (int j = 0; j < cols; j++)
{
auto tmp = p[j] + d(gen);
tmp = tmp > 255 ? 255 : tmp;
tmp = tmp < 0 ? 0 : tmp;
p[j] = tmp;
}
}
}

## 使用滤波器去除噪声

blur(m, m2, Size(5, 5));第一个参数是输入的图像，第二个参数是输出的图像，第三个参数是滤波器的大小，这里使用的是$$5 \times 5$$的矩形。

