#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <cmath>
using namespace cv;
using namespace std;
const int WINDOW_SIZE = 1;
void MyGetMedian(uchar myArray[], int len, uchar& median, int& num);
void MyMedianFiltering(Mat& src, Mat& dst);
/**
* @function main
*/
int main( int argc, char** argv )
{
// load image
char* imageName = "images/Lenna_noise.jpg";
Mat image;
image = imread(imageName,1);
if(!image.data)
{
cout << "No image data" << endl;
getchar();
return -1;
}
// show image
namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image", image);
cvtColor( image, image, CV_RGB2GRAY );
Mat dst;
MyMedianFiltering(image, dst);
namedWindow("out_image", CV_WINDOW_AUTOSIZE);
imshow("out_image", dst);
waitKey(0);
return 0;
}
int compareMyType (const void * a, const void * b)
{
if ( *(uchar*)a < *(uchar*)b ) return -1;
if ( *(uchar*)a == *(uchar*)b ) return 0;
if ( *(uchar*)a > *(uchar*)b ) return 1;
}
void MyGetMedian(uchar myArray[], int len, uchar& median, int& num)
{
qsort(myArray, len, sizeof(uchar), compareMyType);
median = myArray[len/2];
num = len/2;
}
void MyMedianFiltering(Mat& src, Mat& dst)
{
CV_Assert(src.data);
CV_Assert(src.depth() == CV_8U);
// create dst image
dst.create(src.size(), src.type());
int channels = dst.channels();
uchar myArray[(2*WINDOW_SIZE+1)*(2*WINDOW_SIZE+1)];
int len = (2*WINDOW_SIZE+1)*(2*WINDOW_SIZE+1);
for( int i = WINDOW_SIZE; i < dst.rows-WINDOW_SIZE; ++i )
{
uchar* p_dst = dst.ptr<uchar>(i);
uchar* p_src = src.ptr<uchar>(i);
for ( int j = WINDOW_SIZE; j < dst.cols-WINDOW_SIZE; ++j )
{
int num = 0;
for( int tmp_i = i-WINDOW_SIZE; tmp_i <= i+WINDOW_SIZE; tmp_i++ )
{
p_src = src.ptr<uchar>(tmp_i);
for( int tmp_j = j-WINDOW_SIZE; tmp_j <= j+WINDOW_SIZE; tmp_j++ )
{
myArray[num++] = p_src[tmp_j];
}
}
uchar median = 0;
MyGetMedian(myArray, len, median, num);
p_dst[j] = median;
}
}
}
图像中值滤波实现
最新推荐文章于 2021-10-25 15:11:16 发布