1.myMath.h myMath.c包含自己写的一些找最大值、最小值、中值函数
myMath.h
#ifndef _MYMATH_H_
#define _MYMATH_H_
#ifndef max
#define max(x,y) (x) > (y) ? (x) : (y)
#endif
#ifndef min
#define min(x,y) (x) < (y) ? (x) : (y)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
float getMaxValue(float * data, int count);
float getMinValue(float * data, int count);
float getMidValue(float * data, int count);
#ifdef __cplusplus
}
#endif
#endif
myMath.c
#include <stdio.h>
#include <stdlib.h>
#include "myMath.h"
float getMaxValue(float * data, int count){
int i = 0;
float maxNumber = data[0];
for(i = 1; i < count; i ++){
if(data[i] > maxNumber){
maxNumber = data[i];
}
}
return maxNumber;
}
float getMinValue(float * data, int count){
int i = 0;
float minNumber = data[0];
for(i = 1; i < count; i ++){
if(data[i] < minNumber){
minNumber = data[i];
}
}
return minNumber;
}
float getMidValue(float * data, int count){
int i, j;
float temp = 0.0f;
for(i = 0; i < count - 1; i ++){
for(j = i + 1; j < count; j ++){
if(data[j] > data[i]){
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
if(count % 2 == 0){
float medianValue1 = data[count / 2 - 1];
float medianValue2 = data[count / 2];
return (medianValue1 + medianValue2) / 2.0f;
}else if(count % 2 == 1){
return data[count / 2];
}
return 0.0f;
}
2.MedianFilter.h MedianFilter.c是中值滤波的头文件和核心函数
MedianFilter.h
#ifndef _MEDIANFILTER_H_
#define _MEDIANFILTER_H_
#ifdef __cplusplus
extern "C"
{
#endif
int medianFilter(float * inData, float * outData, int dataWidth, int dataHeight, int medianWidth, int medianHeight, int channels);
#ifdef __cplusplus
}
#endif
#endif
MedianFilter.c
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <malloc.h>
#include "MedianFilter.h"
#include "myMate.h"
int medianFilter(float * inData, float * outData, int dataWidth, int dataHeight, int medianWidth, int medianHeight, int channels){
int widthTemp, heightTemp;
int i, j;
int m, n, z;
float * dataTemp = NULL;
int count = 0;
float medianData = 0.f;
if(channels > 32){
printf("channels is larger.\n");
return -1;
}
if(medianWidth % 2 == 0){
widthTemp = medianWidth / 2 - 1;
}else{
widthTemp = medianWidth / 2;
}
if(medianHeight % 2 == 0){
heightTemp = medianHeight / 2 - 1;
}else{
heightTemp = medianHeight / 2;
}
dataTemp = (float*)malloc(sizeof(float) * medianWidth * medianHeight);
for(z = 0; z < channels; z ++){
for(i = 0; i < dataHeight; i ++){
for(j = 0; j < dataWidth; j ++){
memset(dataTemp, 0, sizeof(float) * medianWidth * medianHeight);
count = 0;
medianData = 0.0f;
for(m = -heightTemp; m < medianHeight - heightTemp; m ++){
for(n = -widthTemp; n < medianWidth - widthTemp; n ++){
if(i + m >= 0 && i + m < dataHeight && j + n >= 0 && j + n < dataWidth){
dataTemp[count] = inData[((i + m) * dataWidth + (j + n)) * channels + z];
count ++;
}
}
}
medianData = getMidValue(dataTemp, count);
outData[(i * dataWidth + j) * channels + z] = medianData;
}
}
}
free(dataTemp);
return 0;
};
3.主函数
#include "stdafx.h"
#include "Tools.h"
#include "MedianFilter.h"
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
int imageWidth, imageHeight;
int channels = 1;
Mat mImage = imread("D:\\workSpace\\VSWorkSpace\\ImageProcess\\ImageProcess\\medianImage.jpg", 1);
imshow("srcImage", mImage);
float * imageData = NULL;
float * imageOutData = NULL;
imageWidth = mImage.cols;
imageHeight = mImage.rows;
channels = mImage.channels();
imageData = (float*)malloc(sizeof(float) * imageWidth * imageHeight * channels);
imageOutData = (float*)malloc(sizeof(float) * imageWidth * imageHeight * channels);
uCharDataToFloatData(mImage.data, imageData, imageWidth, imageHeight, channels);
medianFilter(imageData, imageOutData, imageWidth, imageHeight, 3, 3, channels);
floatDataToUCharData(imageOutData, mImage.data, imageWidth, imageHeight, channels, 1);
imshow("medianImage", mImage);
waitKey(0);
free(imageData);
free(imageOutData);
return 0;
}
uCharDataToFloatData();
floatDataToUCharData();
两个函数见链接
http://blog.csdn.net/jsf921942722/article/details/51526673
4.效果图
************************3通道彩色中值滤波原图*******************
************************3通道彩色中值滤波后图*******************
************************1通道灰度中值滤波原图*******************
************************1通道灰度中值滤波后图*******************