opencv cvEqualizeHist cvSmooth高斯、均值、中值滤波

opencv cvEqualizeHist cvSmooth高斯、均值、中值滤波

JNI端实现直方图均衡化、调用cvSmooth() 实现高斯、均值、中值滤波
demo: http://download.csdn.net/detail/keen_zuxwang/9852593

/* Smoothes array (removes noise) */
CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst,
                      int smoothtype CV_DEFAULT(CV_GAUSSIAN),
                      int size1 CV_DEFAULT(3),
                      int size2 CV_DEFAULT(0),
                      double sigma1 CV_DEFAULT(0),
                      double sigma2 CV_DEFAULT(0));

src:
输入图像.
dst:
输出图像
smoothtype:(param1对应size1, param2对应size2, param3对应sigma1, param4对应sigma2)
CV_BLUR 简单模糊
对每个像素param1,param2求和,并缩放1/(param1*param2),亦即求简单平均值
CV_BLUR_NO_SCALE 无缩放变化的模糊
对每个像素param1,param2求和 特别说明的是输入图像和结果图像必须有不同的数值精度,以保证不会发生溢出,如果源图像是8u,则结果图像必须是16s或者32s
CV_MEDIAN 中值模糊
取中心像素的正方形领域类的每个像素的值用中间值代替
CV_GAUSSIAN 高斯模糊
param3为零时,高斯卷积核sigma通过以下公式计算
sigma(x) = (n(x)/2-1)*0.30+0.80,n(x)= param1
sigma(y) = (n(y)/2-1)*0.30+0.80,n(y)= param2
如果第四个参数指定,则第三个和第四个参数分别表示sigma的水平方向和垂直方向的值
如果第三个,第四个参数已经指定,而前两个参数为0,那么窗口的尺寸由sigma确定速度较慢但最有效
CV_BILATERAL 双向滤波
因为高斯模糊是在图像在空间内的像素是缓慢变化的,但随机的两个点可能形成很大的像素差,高斯滤波在保留信号的条件下减少噪声,但在接近边缘的地方无效,双向滤波可以解决这个问题,但需要更多的时间代价,
其需要两个参数,param1表示空域中所使用的高斯核的宽度,param2表示颜色域高斯核的高度

JNI:
smooth.cpp:

#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <android/log.h>
#include <iostream>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include "opencv2/imgproc/types_c.h"
#include "opencv2/imgproc/imgproc_c.h"

using namespace std;
using namespace cv;

#define LOG_TAG "libsmooth"
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))

#ifdef __cplusplus
extern "C" {
#endif

void EqualizeGray(IplImage* pImg)  //直方图均衡化
{
    IplImage* pGray=cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1);
    cvCvtColor(pImg,pGray,CV_BGR2GRAY);
    pGray->origin=pImg->origin;
    //cvShowImage("Gray Image",pGray);

    IplImage* pEqualizedImg=cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1);
    cvEqualizeHist(pGray, pEqualizedImg);
    //cvShowImage("Equalize Image",pEqualizedImg);
    cvReleaseImage(&pGray);
}

JNIEXPORT jlong JNICALL Java_com_example_smooth_MainActivity_equalizehist(JNIEnv *env, jclass clz, jlong imageGray)
{
    LOGD("          equalizehist         !");
    Mat imageMat = Mat(*(Mat*)imageGray);
    IplImage  temp_src = imageMat;
    IplImage* imageg = &temp_src;

    IplImage* pGray=cvCreateImage(cvSize(imageg->width,imageg->height),IPL_DEPTH_8U,1);
    cvCvtColor(imageg, pGray,CV_BGR2GRAY);
    pGray->origin=imageg->origin;

    IplImage* pEqualizedImg=cvCreateImage(cvSize(imageg->width,imageg->height),IPL_DEPTH_8U,1);
    cvEqualizeHist(pGray, pEqualizedImg);

    Mat *hist = new Mat(pEqualizedImg);
    return (jlong) hist;
}

JNIEXPORT jlong JNICALL Java_com_example_smooth_MainActivity_gaussiansmooth(JNIEnv *env, jclass clz, jlong imageGray)
{
    LOGD("          gaussiansmooth         !");
    Mat imageMat = Mat(*(Mat*)imageGray);
    IplImage  temp_src = imageMat;
    IplImage* imageg = &temp_src;

    //对图像进行核大小为 param1×param2 的高斯卷积。
    cvSmooth(imageg, imageg, CV_GAUSSIAN, 3, 3);//高斯滤波器

    Mat *hist = new Mat(imageg);
    return (jlong) hist;
}

JNIEXPORT jlong JNICALL Java_com_example_smooth_MainActivity_blursmooth(JNIEnv *env, jclass clz, jlong imageGray)
{
    LOGD("          blursmooth         !");
    Mat imageMat = Mat(*(Mat*)imageGray);
    IplImage  temp_src = imageMat;
    IplImage* imageg = &temp_src;

    //简单模糊- -对每个象素param1×param2邻域求和并做尺度变换 1/(param1×param2)。
    cvSmooth(imageg,imageg,CV_BLUR,3,3);//均值滤波器

    Mat *hist = new Mat(imageg);
    return (jlong) hist;
}

JNIEXPORT jlong JNICALL Java_com_example_smooth_MainActivity_mediansmooth(JNIEnv *env, jclass clz, jlong imageGray)
{
    LOGD("          mediansmooth         !");
    Mat imageMat = Mat(*(Mat*)imageGray);
    IplImage  temp_src = imageMat;
    IplImage* imageg = &temp_src;

    //对图像进行核大小为param1×param1 的中值滤波 (邻域是正方形)。
    cvSmooth(imageg,imageg,CV_MEDIAN,3,3);//中值滤波器

    Mat *hist = new Mat(imageg);
    return (jlong) hist;
}

JNIEXPORT jlong JNICALL Java_com_example_smooth_MainActivity_pyrdown(JNIEnv *env, jclass clz, jlong imageGray)
{
    LOGD("          pyrdown         !");
    Mat imageMat = Mat(*(Mat*)imageGray);
    IplImage  temp_src = imageMat;
    IplImage* imageg = &temp_src;

    //IPL_DEPTH_8U,3
    IplImage* pImg3=cvCreateImage(cvSize(imageg->width/2,imageg->height/2), imageg->depth, imageg->nChannels);

  cvPyrDown(imageg, pImg3, CV_GAUSSIAN_5x5);  //图像赋值

    Mat *hist = new Mat(pImg3);
    return (jlong) hist;
}

JNIEXPORT jlong JNICALL Java_com_example_smooth_MainActivity_pyrup(JNIEnv *env, jclass clz, jlong imageGray)
{
    LOGD("          pyrdown         !");
    Mat imageMat = Mat(*(Mat*)imageGray);
    IplImage  temp_src = imageMat;
    IplImage* imageg = &temp_src;

    IplImage* pImg3=cvCreateImage(cvSize(imageg->width*2,imageg->height*2), imageg->depth, imageg->nChannels); //IPL_DEPTH_8U,3

  cvPyrUp(imageg, pImg3, CV_GAUSSIAN_5x5);  //图像赋值

    Mat *hist = new Mat(pImg3);
    return (jlong) hist;
}

#ifdef __cplusplus
}
#endif

直方图均衡化:
这里写图片描述

图像高斯滤波
这里写图片描述

图像中值滤波
这里写图片描述

图像均值滤波
这里写图片描述

图像pyrdown:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值