中值滤波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. css3中的display:-webkit-box的用法

    一. css weui-media-box__desc { color: #999999; font-size: 13px; line-height: 1.2; overflow: hidden; t ...

  2. 3.1、Factorization Machine模型

    Factorization Machine模型 在Logistics Regression算法的模型中使用的是特征的线性组合,最终得到的分隔超平面属于线性模型,其只能处理线性可分的二分类问题,现实生活 ...

  3. 配置YOLO2(ubuntu16.04+cuda8.0+opencv3.1.0)

    要求已经安装好了CUDA 8.0 以及OpenCV3.1.0 YOLO官方网站 配置darknet git clone https://github.com/pjreddie/darknet cd d ...

  4. 查看SELinux状态及关闭SELinux

    查看SELinux状态: 输入:/usr/sbin/sestatus -v SELinux status: enabled           ##开启状态 关闭SELinux 修改vi /etc/s ...

  5. 为Arch Linux添加鼠标支持(gpm)

    gpm的安装 在Arch Linux中安装gpm $ pacman -S gpm 如果你正在使用触控板,需要安装一下插件 $ pacman -S gpm xf86-input-synaptics 需要 ...

  6. JAVA基础——重新认识String字符串

    深入剖析Java之String字符串 在程序开发中字符串无处不在,如用户登陆时输入的用户名.密码等使用的就是字符串. 在 Java 中,字符串被作为 String 类型的对象处理. String 类位 ...

  7. 创建一个流(Stream)可以让Bitmap或Image保存到流里面

    创建一个流(Stream)可以让Bitmap或Image保存到流里面   http://blog.csdn.net/angxiao/article/details/7481465 写文件流       ...

  8. Subsequence(二分)

    A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, a ...

  9. POJ 3258:River Hopscotch (最大化最小值)

    [题意] 牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 ...

  10. 114th LeetCode Weekly Contest Array of Doubled Pairs

    Given an array of integers A with even length, return true if and only if it is possible to reorder ...