图像中值滤波实现

#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;

		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值