中值滤波C语言优化

图像平滑是图像预处理的基本操作,本文首先用不同的方法对一张图片做预处理比较它们效果的不同,然后针对中值滤波,实现了一种快速实现.(其实是copy的opencv实现,呵呵).因为opencv的实现方法感觉太好了,今天就特别写下来.既有备忘的作用,同时如果谁看到这篇文章,也可以借鉴下opencv的实现.

1 原始图像

2 均值滤波图像

3 中值滤波图像

4 双边滤波图像

5高斯滤波图像

上图的代码

void CDialogTest2013Dlg::OnBnClickedMfcbutton1()

{

char file[10]="e:\\1.jpg";

IplImage *src = cvLoadImage(file,0);

CvSize picSize;

picSize.width = src->width;

picSize.height = src->height;

IplImage *dst_midian= cvCreateImage(picSize,8,1);

IplImage *dst_blur = cvCreateImage(picSize,8,1);

IplImage *dst_gaussian = cvCreateImage(picSize,8,1);

IplImage *dst_bilateral = cvCreateImage(picSize,8,1);

cvSmooth(src, dst_midian, CV_MEDIAN,3,3);

cvSmooth(src, dst_blur, CV_BLUR,3,3);

cvSmooth(src, dst_gaussian, CV_GAUSSIAN,3,3);

cvSmooth(src, dst_bilateral, CV_BILATERAL,3,3);

}

均值滤波原理:把一个点周围点求均值,这个均值给这个点.

中值滤波原理:把一个点周围的点排序,把中位数给这个点.

双边滤波原理:这个一句话说不清楚,可以看这个博文 http://blog.csdn.net/bugrunner/article/details/7170471

高斯滤波原理:均值滤波对一个点周围点求和是每个点的权重都是1,高斯滤波的权重不是1了,是一个类似高斯分布的权重分布,距离目标点

近的地方权重高点,距离目标点远的地方,权重低些.

中值滤波的opencv实现

template<class Op, class VecOp>

staticvoid

medianBlur_SortNet(const Mat& _src, Mat& _dst,int m )

{

typedef typename Op::value_type T;

typedef typename Op::arg_type WT;

typedef typename VecOp::arg_type VT;

const T* src =(const T*)_src.data;

T* dst =(T*)_dst.data;

int sstep =(int)(_src.step/sizeof(T));

int dstep =(int)(_dst.step/sizeof(T));

Size size = _dst.size();

int i, j, k, cn = _src.channels();

Op op;

VecOp vop;

volatile bool useSIMD = checkHardwareSupport(CV_CPU_SSE2);

if( m ==3)

{

if( size.width ==1|| size.height ==1)

{

int len = size.width + size.height -1;

int sdelta = size.height ==1? cn : sstep;

int sdelta0 = size.height ==1?0: sstep - cn;

int ddelta = size.height ==1? cn : dstep;

for( i =0; i < len; i++, src += sdelta0, dst += ddelta )

for( j =0; j < cn; j++, src++)

{

WT p0 = src[i >0?-sdelta :0];

WT p1 = src[0];

WT p2 = src[i < len -1? sdelta :0];

op(p0, p1); op(p1, p2); op(p0, p1);

dst[j]=(T)p1;

}

return;

}

size.width *= cn;

for( i =0; i < size.height; i++, dst += dstep )

{

const T* row0 = src + std::max(i -1,0)*sstep;

const T* row1 = src + i*sstep;

const T* row2 = src + std::min(i +1, size.height-1)*sstep;

int limit = useSIMD ? cn : size.width;

for(j =0;;)

{

for(; j < limit; j++)

{

int j0 = j >= cn ? j - cn : j;

int j2 = j < size.width - cn ? j + cn : j;

WT p0 = row0[j0], p1 = row0[j], p2 = row0[j2];

WT p3 = row1[j0], p4 = row1[j], p5 = row1[j2];

WT p6 = row2[j0], p7 = row2[j], p8 = row2[j2];

op(p1, p2); op(p4, p5); op(p7, p8); op(p0, p1);  //op(p1, p2)  交换p1和p2两个数

op(p3, p4); op(p6, p7); op(p1, p2); op(p4, p5);

op(p7, p8); op(p0, p3); op(p5, p8); op(p4, p7);

op(p3, p6); op(p1, p4); op(p2, p5); op(p4, p7);

op(p4, p2); op(p6, p4); op(p4, p2);

dst[j]=(T)p4;

}

if( limit == size.width )

break;

for(; j <= size.width - VecOp::SIZE - cn; j += VecOp::SIZE )

{

VT p0 = vop.load(row0+j-cn), p1 = vop.load(row0+j), p2 = vop.load(row0+j+cn);

VT p3 = vop.load(row1+j-cn), p4 = vop.load(row1+j), p5 = vop.load(row1+j+cn);

VT p6 = vop.load(row2+j-cn), p7 = vop.load(row2+j), p8 = vop.load(row2+j+cn);

vop(p1, p2); vop(p4, p5); vop(p7, p8); vop(p0, p1);

vop(p3, p4); vop(p6, p7); vop(p1, p2); vop(p4, p5);

vop(p7, p8); vop(p0, p3); vop(p5, p8); vop(p4, p7);

vop(p3, p6); vop(p1, p4); vop(p2, p5); vop(p4, p7);

vop(p4, p2); vop(p6, p4); vop(p4, p2);

vop.store(dst+j, p4);

}

limit = size.width;

}

}

}

}

}

中值滤波C语言优化的更多相关文章

  1. 关于中值滤波算法,以及C语言实现(转)

    源:关于中值滤波算法,以及C语言实现 1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制 ...

  2. 学习 opencv---(8)非线性滤波:中值滤波,双边滤波

    正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...

  3. opencv-11-中值滤波及自适应中值滤波

    开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...

  4. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  5. opencv实现图像邻域均值滤波、中值滤波、高斯滤波

    void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...

  6. MATLAB灰度图、中值滤波图

    x=imread(‘x.jpg’); x=rbg2gray(x);  %转成灰度图像 k=medfilt2(x);   %中值滤波,默认为3X3矩阵 figure, imshow(k); medfil ...

  7. 基于FPGA的中值滤波算法实现

    在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...

  8. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...

  9. 3D Slicer中文教程(七)—图像中值滤波

    1.中值滤波概念 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护边缘 ...

随机推荐

  1. 最大子树和 树形dp

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  2. 基于linux内核包过滤技术的应用网关

    目录 基于linux内核包过滤技术的应用网关 硬件形态 基本原理 应用场景 主要功能 其他功能 客户定制 基于linux内核包过滤技术的应用网关 硬件形态 基本原理 应用场景 媒体内容过滤和深度识别 ...

  3. hql语句加别名的错误

    写了一个查询数量的方法,结果执行不出来,debug后是runtimeException,然后就在那个hql里面使劲找,将他翻译成sql在数据库中执行,结果也没问题,原来的hql如下: 注意这个num, ...

  4. A Simple Math Problem(矩阵快速幂)----------------------蓝桥备战系列

    Lele now is thinking about a simple function f(x).  If x < 10 f(x) = x.  If x >= 10 f(x) = a0 ...

  5. POJ - 2018 二分+单调子段和

    依然是学习分析方法的一道题 求一个长度为n的序列中的一个平均值最大且长度不小于L的子段,输出最大平均值 最值问题可二分,从而转变为判定性问题:是否存在长度大于等于L且平均值大于等于mid的字段和 每个 ...

  6. 有用的 Angular CLI 命令参数

    这是一些有用的 Angular 5 CLI 命令参数,注意参数前面的-和--的不同... 1. 指定build的输出为production version,合并优化css and js files. ...

  7. fopen\fread\fwrite\fseed函数的使用

    使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法为: FILE *fopen(char *filename, char *mode); filename为文 ...

  8. C++ GUI Qt4编程(10)-3.4spreadsheet

    1. C++ GUI Qt4编程第三章,增加spreadsheet. 2. spreadsheet.h /**/ #ifndef SPREADSHEET_H #define SPREADSHEET_H ...

  9. java中的集合:继承关系和简介

    1.继承关系图 2.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collect ...

  10. javascript中构造函数与普通函数的区别还有关于“new”操作符的一些原理

    有一种创建对象的方法叫做工厂模式,例如: function person(name,age){ var o=new Object(); o.name=name; o.age=age; return o ...