中值滤波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. XMLHttpRequest 与 Ajax 概要

    关于XMLHttpRequest 开发者使用XMLHttpRequest对象与服务端进行交互(发送http请求.接受返回数据等),可以在不打断用户下一步操作的情况下刷新局部页面.XMLHttpRequ ...

  2. 洛谷 P2286 [HNOI2004]宠物收养场

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  3. MacOs桌面自动被打乱的原因

    1 系统设置--Mission Control -- 自动根据最近使用情况排序的勾勾去掉

  4. 并排的两个div之间会有空隙

    两个并排的DIV会有如下图所示的空隙 是因为 代码中 两个DIV之前有个 ’回车‘ 这么写就OK了 可是为什么会有这种问题呢,是因为浏览器将 空格.回车.tab键等字符都当做一个空格处理,所以当你回车 ...

  5. UESTC - 1692 注意DP顺序

    #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...

  6. Oracle9i之xmltype应用(2)

    Oracle 9i提供的XML内置特性: Oracle 9i支持XMLType类型,它是一种Oracle 9i系统定义的对象类型.XMLType有内置的函数,有力的提供了推XML的创建,索检,索引等功 ...

  7. linux系统编程之(一) 信号量

    信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用,测 ...

  8. 【记录】sqli-labs-master搭建

    附上:链接:http://pan.baidu.com/s/1bpCRzl1 密码:ep48 下载完成后直接解压到phpstudy(该工具之前分享过,直接搜索下)的WWW目录下,启动phpstudy, ...

  9. 多个模块使用python logging

    链接:https://docs.python.org/2/howto/logging-cookbook.html#logging-cookbook 具体的使用方法,请参考如下代码: import lo ...

  10. GreenPlum 大数据平台--安装

    1. 环境准备 01, 安装包准备: Greenplum :  >>>>链接地址 Pgadmin客户端 :  >>>链接地址 greenplum-cc-web ...