概述
中值滤波器(非线性)
中值滤波器对消除椒盐噪声非常有效。中值滤波器把当前像素和它的邻域组成一个集合,然后计算出这个集合的中间值,以此作为当前像素的值(集合中数值经过排序,中间位置的数值就是中间值)。当前像素被中间值代替。
这正是中值滤波器在消除椒盐噪声时如此高效的原因。事实上,如果在某个像素邻域中有一个异常的黑色或白色像素,该像素将无法作为中间值(它是最大值或最小值),因此肯定会被领域的值替换掉。
中值滤波器函数 (#include <opencv2/imgproc/imgproc.hpp>)
void medianBlur(InputArray src, OutputArray dst, int ksize)
示例程序
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <random>
using namespace std;
void salt(cv::Mat image, int n);
int main(int argc, char** argv) {
if( argc != 2)
{
cerr << "please enter the right numbers of images" << endl;
return -1;
}
cv::Mat image = cv::imread(argv[1]);
if (image.empty())
{
cerr << "don`t get the data of the argv[1]" << endl;
return -1;
}
cv::imshow("The original image", image);
cv::waitKey(0);
salt(image, 1000);
cv::imshow("The salt image",image);
cv::waitKey(0);
cv::Mat result;
cv::medianBlur(image,result, 5);
cv::imshow("The filter image", result);
cv::waitKey(0);
return 0;
}
void salt(cv::Mat image, int n)
{
std::default_random_engine generator; //#include <random>
std::uniform_int_distribution<int>
randomRow(0, image.rows - 1);
std::uniform_int_distribution<int>
randomCol(0, image.cols - 1);
int i, j;
for (int k = 0; k < n; k++){
//随机数生成图形位置
i = randomCol(generator);
j = randomRow(generator);
if(image.type() == CV_8UC1){
// 灰度图像
// 单通道8位图像
image.at<uchar>(j, i) = 255;
}else if(image.type() == CV_8UC3){
//彩色图像
//3通道
image.at<cv::Vec3b>(j,i)[0] = 255;
image.at<cv::Vec3b>(j,i)[1] = 255;
image.at<cv::Vec3b>(j,i)[2] = 255;
}
}
}
最后
以上就是阔达鸡为你收集整理的计算机视觉攻略 图像滤波笔记3 (中值滤波器)的全部内容,希望文章能够帮你解决计算机视觉攻略 图像滤波笔记3 (中值滤波器)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复