#include<iostream>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<stdio.h>
#include<stdlib.h>
#include<iomanip>
#include<cstdlib>
#include<math.h>
#include<conio.h>
using namespace std;
using namespace cv;
// Insertion Sort
void insertionSort(int window[],int length)
{
int temp, i, j;
for (i = 0; i < length; i++)
{
temp = window[i];
for (j = i - 1; j >= 0 && temp < window[j]; j--)
{
window[j + 1] = window[j];
}
window[j + 1] = temp;
}
}
void insertionSort2(double window[], int length)
{
double temp;
int i, j;
for (i = 0; i < length; i++)
{
temp = window[i];
for (j = i - 1; j >= 0 && temp < window[j]; j--)
{
window[j + 1] = window[j];
}
window[j + 1] = temp;
}
}
float main()
{
//Original Image Display
Mat org = imread("pep.tif", CV_LOAD_IMAGE_GRAYSCALE);
namedWindow("Original Image", CV_WINDOW_AUTOSIZE);
imshow("Original Image", org);
//Noised Image Display
Mat noi = imread("n2.tif", CV_LOAD_IMAGE_GRAYSCALE);
namedWindow("Noised Image", CV_WINDOW_AUTOSIZE);
imshow("Noised Image", noi);
//////////////////////////////////////Calculate MSE(org,noi)//////////////////////////////////////////
//MSEnoi
float MSEnoi = 0;
for (int i = 0; i < org.rows; i++)
{
for (int j = 0; j < org.cols; j++)
{
MSEnoi += pow((float)org.at<uchar>(i, j) - (float)noi.at<uchar>(i, j),2);
}
}
MSEnoi = MSEnoi / (org.rows*org.cols);
cout << "MSE of 1-point Median Filter = " << roundf(MSEnoi * 100) / 100 << endl;
//////////////////////////////////////Median Filter 5-point cross-shaped////////////////////////////
//Flipping Padding
Mat fpi; // fpi = Flipping Padding Image
int top = 1, bottom = 1, left = 1, right = 1;
copyMakeBorder(noi, fpi, top, bottom, left, right, BORDER_CONSTANT, 0);
//Median Filter with 5-point cross-shaped
int window5p[5];
Mat med5p_temp = fpi.clone(); // Copy Image
for (int i = 1; i < fpi.rows - 1; i++)
{
for (int j = 1; j < fpi.cols - 1; j++)
{
window5p[0] = fpi.at<uchar>(i, j);
window5p[1] = fpi.at<uchar>(i, j + 1);
window5p[2] = fpi.at<uchar>(i, j - 1);
window5p[3] = fpi.at<uchar>(i + 1, j);
window5p[4] = fpi.at<uchar>(i - 1, j);
insertionSort(window5p, 5); // Sort 5 elements
med5p_temp.at<uchar>(i, j) = window5p[2]; // Median filter
}
}
// Erase redundant border of med5p_temp
Mat med5p = noi.clone(); // Same size with the noised image
for (int i = 1; i < med5p_temp.rows - 1; i++)
{
for (int j = 1; j < med5p_temp.cols - 1; j++)
{
med5p.at<uchar>(i - 1, j - 1) = med5p_temp.at<uchar>(i, j);
}
}
//Median Filtered Image Display
namedWindow("Median 5-point cross-shaped", CV_WINDOW_AUTOSIZE);
imshow("Median 5-point cross-shaped", med5p);
//Calculate MSE5p (Mean Squared Error)
float MSE5p = 0;
for (int i = 0; i < org.rows; i++)
{
for (int j = 0; j < org.cols; j++)
{
MSE5p += pow((float)org.at<uchar>(i, j) - (float)med5p.at<uchar>(i, j), 2);
}
}
MSE5p = MSE5p / (org.rows*org.cols);
cout << "MSE of 5-point cross-shaped Median Filter = " << roundf(MSE5p * 100) / 100 << endl;
//////////////////////////////////////Median Filter 1x2////////////////////////////////////
//Flipping Padding end-right Column
Mat fpi12;
copyMakeBorder(noi, fpi12, 0, 0, 0, 1, BORDER_CONSTANT, 0);
//Median Filter 1x2
int window12[2];
Mat med12 = noi.clone(); // Same size w/ the noised image, No need erase redundant columns
for (int i = 0; i < fpi12.rows; i++)
{
for (int j = 0; j < fpi12.cols - 1; j++)
{
window12[0] = fpi12.at<uchar>(i, j);
window12[1] = fpi12.at<uchar>(i, j + 1);
med12.at<uchar>(i, j) = (window12[0] + window12[1]);
if ((med12.at<uchar>(i, j)) % 2 == 1)
{
med12.at<uchar>(i, j) = (window12[0] + window12[1]) / 2 + 1; // round up
}
else med12.at<uchar>(i, j) = (window12[0] + window12[1]) / 2;
}
}
//Median Filter 1x2 Display
namedWindow("Median 1x2", CV_WINDOW_AUTOSIZE);
imshow("Median 1x2", med12);
//MSE12
float MSE12 = 0;
for (int i = 0; i < org.rows; i++)
{
for (int j = 0; j < org.cols; j++)
{
MSE12 += pow((float)org.at<uchar>(i, j) - (float)med12.at<uchar>(i, j), 2);
}
}
MSE12 = MSE12 / (org.rows*org.cols);
cout << "MSE of 1x2 Median Filter = " << roundf(MSE12 * 100) / 100 << endl;
/////////////////////////////////////Median Filter 1x3////////////////////////////////////////
//Flipping Padding end-left & end-right Columns
Mat fpi13;
copyMakeBorder(noi, fpi13, 0, 0, 1, 1, BORDER_CONSTANT, 0);
//Median Filter 1x3
int window13[3];
Mat med13_temp = fpi13.clone();
for (int i = 0; i < fpi13.rows; i++)
{
for (int j = 1; j < fpi13.cols - 1; j++)
{
window13[0] = fpi13.at<uchar>(i, j);
window13[1] = fpi13.at<uchar>(i, j + 1);
window13[2] = fpi13.at<uchar>(i, j - 1);
insertionSort(window13, 3); // Sort 3 elements
med13_temp.at<uchar>(i, j) = window13[1]; // Median Filter 1x3
}
}
//Erase redundant border of med12_temp
Mat med13 = noi.clone(); //Same size with the noised image
for (int i = 0; i < med13_temp.rows; i++)
{
for (int j = 1; j < med13_temp.cols - 1; j++)
{
med13.at<uchar>(i, j - 1) = med13_temp.at<uchar>(i, j);
}
}
//Median Filter 1x3 Display
namedWindow("Median 1x3", CV_WINDOW_AUTOSIZE);
imshow("Median 1x3", med13);
//MSE13
float MSE13 = 0;
for (int i = 0; i < org.rows; i++)
{
for (int j = 0; j < org.cols; j++)
{
MSE13 += pow((float)org.at<uchar>(i, j) - (float)med13.at<uchar>(i, j), 2);
}
}
MSE13 = MSE13 / (org.rows*org.cols);
cout << "MSE of 1x3 Median Filter = " << roundf(MSE13 * 100) / 100 << endl;
///////////////////////////Median Filter 2x2//////////////////////////////////////////////////////
//Flipping Padding end-right column & bottom row
Mat fpi22;
copyMakeBorder(noi, fpi22, 0, 1, 0, 1, BORDER_CONSTANT, 0);
//Median Filter 2x2
int window22[4];
Mat med22 = noi.clone(); // Same size w/ the noised image and no need erase redundant borders
for (int i = 0; i < fpi22.rows - 1; i++)
{
for (int j = 0; j < fpi22.cols - 1; j++)
{
window22[0] = fpi22.at<uchar>(i, j);
window22[1] = fpi22.at<uchar>(i, j + 1);
window22[2] = fpi22.at<uchar>(i + 1, j);
window22[3] = fpi22.at<uchar>(i + 1, j + 1);
insertionSort(window22, 4); // Sort 4 elements;
med22.at<uchar>(i, j) = (window22[1] + window22[2]);
if ((med22.at<uchar>(i, j)) % 2 == 1)
{
med22.at<uchar>(i, j) = (window22[1] + window22[2]) / 2 + 1; //round up
}
else med22.at<uchar>(i, j) = (window22[1] + window22[2]) / 2;
}
}
//Median Filter 2x2 Display
namedWindow("Median 2x2", CV_WINDOW_AUTOSIZE);
imshow("Median 2x2", med22);
//MSE22
float MSE22 = 0;
for (int i = 0; i < org.rows; i++)
{
for (int j = 0; j < org.cols; j++)
{
MSE22 += pow((float)org.at<uchar>(i, j) - (float)med22.at<uchar>(i, j), 2);
}
}
MSE22 = MSE22 / (org.rows*org.cols);
cout << "MSE of 2x2 Median Filter = " << roundf(MSE22 * 100) / 100 << endl;
/////////////////////////////Median Filter 3x3////////////////////////////////////////
//Flipping Padding
//Mat fpi33;
//copyMakeBorder(noi, fpi33, 1, 1, 1, 1, BORDER_CONSTANT,0);
//Median Filter 3x3
//int window33[9];
//Mat med33_temp = fpi33.clone();
//for (int i = 1; i < fpi33.rows - 1; i++)
//{
//for (int j = 1; j < fpi33.cols - 1; j++)
//{
//window33[0] = fpi33.at<uchar>(i, j);
//window33[1] = fpi33.at<uchar>(i, j + 1);
//window33[2] = fpi33.at<uchar>(i, j - 1);
//window33[3] = fpi33.at<uchar>(i + 1, j);
//window33[4] = fpi33.at<uchar>(i - 1, j);
//window33[5] = fpi33.at<uchar>(i - 1, j + 1);
//window33[6] = fpi33.at<uchar>(i - 1, j - 1);
//window33[7] = fpi33.at<uchar>(i + 1, j + 1);
//window33[8] = fpi33.at<uchar>(i + 1, j - 1);
//insertionSort(window33, 9);
没有合适的资源?快使用搜索试试~ 我知道了~
多种中值滤波器5 点交叉1x2, 1x3, 2x2, 3x3, 3x4,来降低图像中的椒盐噪音
共35个文件
tlog:10个
pdb:4个
obj:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 29 浏览量
2023-03-04
14:53:52
上传
评论
收藏 4.05MB RAR 举报
温馨提示
多种中值滤波器 (5 点交叉, 1x2, 1x3, 2x2, 3x3, 3x4, 4x4, 4x5, 5x5, 7x7) 来降低图像中的椒盐噪音。我还计算了 MSE 值来决定中值滤波器的质量并画出图形来表示 MSE 和中点.rar
资源推荐
资源详情
资源评论
收起资源包目录
多种中值滤波器 (5 点交叉, 1x2, 1x3, 2x2, 3x3, 3x4, 4x4, 4x5, 5x5, 7x7) 来降低图像中的椒盐噪音。我还计算了 MSE 值来决定中值滤波器的质量并画出图形来表示 MSE 和中点.rar (35个子文件)
OpenCV_Test
OpenCV_Test
OpenCV_Test.vcxproj 8KB
Median5p.cpp 19KB
OpenCV_Test.vcxproj.filters 960B
x64
Release
OpenCV_Test.log 983B
OpenCV_Test.tlog
unsuccessfulbuild 0B
OpenCV_Test.lastbuildstate 200B
link.command.1.tlog 2KB
link.read.1.tlog 3KB
cl.command.1.tlog 2B
link.write.1.tlog 594B
vc120.pdb 756KB
Debug
Test.obj 185KB
Median5p.obj 304KB
OpenCV_Test.log 2KB
OpenCV_Test.tlog
OpenCV_Test.lastbuildstate 198B
CL.write.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 3KB
cl.command.1.tlog 3KB
link.write.1.tlog 774B
CL.read.1.tlog 69KB
vc120.pdb 1.01MB
Source.obj 218KB
vc120.idb 1.12MB
pep.tif 65KB
n2.tif 65KB
x64
Release
OpenCV_Test.pdb 827KB
OpenCV_Test.exe 17KB
Debug
OpenCV_Test.ilk 1.29MB
OpenCV_Test.pdb 1.96MB
OpenCV_Test.v12.suo 4KB
OpenCV_Test.exe 113KB
OpenCV_Test.v12.suo 27KB
OpenCV_Test.sdf 14MB
OpenCV_Test.sln 1KB
共 35 条
- 1
资源评论
GZM888888
- 粉丝: 176
- 资源: 2945
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功