图像的中值滤波

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通道灰度中值滤波后图*******************
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值