#include"iostream"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
uchar GetMedianFilter(uchar *a,int len)
{
uchar tmp; //冒泡排序
for(int i=0;i<len-1;i++)
for(int j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
if(len&1>0) //是奇数
{
return a[len/2];
}
else
{
return (a[len/2]+a[len/2-1])/2;
}
}
void MedianFilter(Mat src,Mat &out,int nFilterW,int nFilterH)
{
int nWidth=src.cols;
int nHeight=src.rows;
out.create(nHeight,nWidth,src.type());
uchar *pSrc=NULL;
uchar *pOut=out.data;
uchar *a=new uchar[nFilterH*nFilterW];
int k=0;
for(int i=nFilterH/2;i<nHeight-nFilterH+nFilterH/2;i++)
for(int j=nFilterW/2;j<nWidth-nFilterW+nFilterW/2;j++)
{
k=0;
pSrc=(src.data+i*nWidth+j);
for(int l=-nFilterH/2;l<nFilterH/2+1;l++)
for(int m=-nFilterW/2;m<nFilterW/2+1;m++)
{
a[k++]=*(pSrc+l*nWidth+m);
}
*(pOut+i*nWidth+j)=GetMedianFilter(a,nFilterH*nFilterW);
}
delete a;
imshow("src",src);
imshow("out",out);
//waitKey(0);
}
void main()
{
Mat img=imread("C:\\Users\\Administrator\\Desktop\\工作\\testp\\sat.jpg",0);
Mat outImg;
MedianFilter(img,outImg,7,7);
Mat dst;
medianBlur(img,dst,7);
imshow("opencv_dst",dst);
waitKey(0);
}
转载请注明原文地址: https://ju.6miu.com/read-1307921.html