#include<iostream>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<ctime>
using namespace cv;
using namespace std;
//椒盐噪声
void salt(Mat &input, int num)
{
int i, j;
srand(time(NULL));
for (int x=0;x<num;++x)
{
i = rand() % input.rows;
j = rand() % input.cols;
input.at<uchar>(i, j) = 255;
}
}
//均值滤波
void junzhi(const Mat &input, Mat &output) {
//访问像素点
for (int i=1;i<input.rows; ++i)
for (int j=1;j<input.cols;++j)
{
if ( (i-1>= 0) && (j-1)>= 0 &&(i+1)<input.rows &&(j+1)<input.cols )
{//边缘不处理
output.at<uchar>(i, j) = (input.at<uchar>(i, j) + input.at<uchar>(i - 1, j - 1) + input.at<uchar>(i - 1, j) + input.at<uchar>(i, j - 1) +
input.at<uchar>(i - 1, j + 1) + input.at<uchar>(i + 1, j - 1) + input.at<uchar>(i + 1, j + 1) + input.at<uchar>(i, j + 1) +
input.at<uchar>(i + 1, j)) / 9;
}
else
{//边缘
output.at<uchar>(i, j) = input.at<uchar>(i, j) ;
}
}
}
//求九个数的中值
uchar Median(uchar n1,uchar n2, uchar n3, uchar n4, uchar n5, uchar n6, uchar n7, uchar n8, uchar n9)
{
uchar arr[9];
arr[0] = n1;
arr[1] = n2;
arr[2] = n3;
arr[3] = n4;
arr[4] = n5;
arr[5] = n6;
arr[6] = n7;
arr[7] = n8;
arr[8] = n9;
for (int gap = 9 / 2; gap > 0; gap /= 2)
for (int i = gap; i < 9; ++i)
for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
swap(arr[j], arr[j + gap]);
return arr[4];
}
//中值滤波
void zhongzhi(const Mat &input, Mat &output)
{
Mat out(input.size(), input.type());
for (int i = 0; i < input.rows; ++i)
for (int j = 0; j < input.cols; ++j) {
if ((i - 1) > 0 && (i + 1) < input.rows && (j - 1) > 0 && (j + 1) < input.cols)
{
out.at<uchar>(i, j) = Median( input.at<uchar>(i, j), input.at<uchar>(i + 1, j + 1),input.at<uchar>(i + 1, j), input.at<uchar>(i, j + 1),
input.at<uchar>(i + 1, j - 1),input.at<uchar>(i - 1, j + 1), input.at<uchar>(i - 1, j), input.at<uchar>(i, j - 1),input.at<uchar>(i - 1, j - 1) );
}
else
out.at<uchar>(i, j) = input.at<uchar>(i, j);
}
out.copyTo(output);
}
int main() {
Mat img = imread("picture2.jpg");
imshow("彩色",img);
cvtColor(img, img, COLOR_BGR2GRAY);
imshow("原图", img);
//加噪声
Mat salt_img;
img.copyTo(salt_img);
salt(salt_img, 1000);
imshow("噪声图像",salt_img);
Mat img1(img.size(), img.type());
Mat img2 , img3, img4;
junzhi(salt_img, img1);
imshow("自编均值滤波", img1);
blur(salt_img, img2, Size(3, 3));
imshow("openCV自带的均值滤波", img2);
zhongzhi(salt_img, img3);
imshow("自编中值滤波处理后", img3);
medianBlur(salt_img,img4, 3);
imshow("openCV自带的中值滤波", img4);
waitKey(0);
return 0;
}
数字图像处理 中值滤波 均值滤波 C++ opencv
5星 · 超过95%的资源 需积分: 41 93 浏览量
2019-04-02
14:57:59
上传
评论 10
收藏 29.09MB ZIP 举报
weixin_38248693
- 粉丝: 2
- 资源: 5
最新资源
- 基于JavaScript 实现的KMP 算法
- 基于C++实现二叉树的创建,遍历,添加,查找与删除
- 基于C语言实现二叉树的基本操作
- 毕业设计基于STM32的测量温度与压力的数据处理设计C语言完整源码+论文.zip
- 基于MATLAB的PCA算法人脸识别项目源码+GUI界面+说明文档.zip
- 基于STM32的测量温度与压力的数据处理设计源码+论文(毕业设计).zip
- Vision Transformer 网络对不同氨气氧气浓度轨迹RAS 图像数据集的分类,包含训练权重和数据集、迁移学习
- 基于C51带字库LCD12864(ST7920)的keil工程源码,只支持8位并口通讯(不支持串口),可显示中文.zip
- 基于SI4463射频模块433MD-SMA无线模块软硬件技术资料及(SI4463)IC技术资料文档.zip
- (GPS+北斗+GSM)HLK-GS2503模块软硬件开发资料包硬件参考设计(原理图PCB)+技术文档资料.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈