#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include <opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#define _USE_MATH_DEFINES
#include <math.h>
//#define M_PI 3.14159265358979323846
int main(int argc, char *argv[])
{
cv::Mat srcImage = cv::imread("./test.jpg",cv::IMREAD_COLOR);
int width = srcImage.rows;
int height = srcImage.cols;
cv::Mat dstImage = cv::Mat::zeros(height,width,CV_8UC3);
int k_size = 3;
int p = floor(k_size / 2);
int *vs = new int[k_size * k_size];
//filtering
int count = 0;
for (int j = 0; j < height;j++)
{
for (int i = 0 ; i < width ; i++)
{
for (int c = 0; c<3; c++)
{
count = 0;
//初始化
for (int j = 0; j < k_size * k_size; j++)
{
vs[j] = 0;
}
for (int _j = -p;_j < p+1;_j++)
{
for (int _i = -p;_i < p+1;_i++)
{
if(((j+_j) >= 0) && ((i + _i) >= 0))
{
vs[count++] = (int)srcImage.at<cv::Vec3b>(j + _j,i+_i)[c];
}
}
}
//将kernel中的值,从小到大排序
std::sort(vs,vs + (k_size*k_size));
//anchor值
int v = dstImage.at<cv::Vec3b>(j,i)[c];
//anchor值比kernel中的最小值还小,则用最小值去替换anchor值
if(v < vs[0])
{
dstImage.at<cv::Vec3b>(j,i)[c] = vs[0];
}
//anchor值比kernel中的最大值还大,则用最大值去替换anchor值
if(v > vs[(k_size * k_size) - 1])
{
dstImage.at<cv::Vec3b>(j,i)[c]= vs[(k_size * k_size) - 1];
}
}
}
}
cv::imshow("SrcImage",srcImage);
cv::imshow("DstImage",dstImage);
std::cout << "END!" << std::endl;
cv::waitKey(0);
return 0;
}