利用 AVX 向量化技术优化的中值滤波

代码和注释如下:

void medianFilterAVX(int height, int width, unsigned char *__restrict src, unsigned char *__restrict  dst)
{// 注意是从 1 开始for(int i = 1; i < height - 1; i++){int j;// 4字节*8 = 32for(j = 1; j < width - 1 - 32; j += 32){__m256i a[9]; // 3*3 的领域a[0] = _mm256_loadu_si256((__m256i *)(src + i * width + j)); // 非对齐模式加载8 个 int 型a[1] = _mm256_loadu_si256((__m256i *)(src + i * width + j + 1));a[2] = _mm256_loadu_si256((__m256i *)(src + i * width + j - 1));a[3] = _mm256_loadu_si256((__m256i *)(src + (i + 1) * width + j));a[4] = _mm256_loadu_si256((__m256i *)(src + (i + 1) * width + j + 1));a[5] = _mm256_loadu_si256((__m256i *)(src + (i + 1) * width + j - 1));a[6] = _mm256_loadu_si256((__m256i *)(src + (i - 1) * width + j));a[7] = _mm256_loadu_si256((__m256i *)(src + (i - 1) * width + j + 1));a[8] = _mm256_loadu_si256((__m256i *)(src + (i - 1) * width + j - 1));// 因为只要知道中值就好(a[4])for( int ji = 0; ji < 5; ji++){for( int k = ji + 1; k < 9; k++){// 逐字节的比较(32个字节)__m256i large = _mm256_max_epu8(a[ji], a[k]);__m256i small = _mm256_min_epu8(a[ji], a[k]);a[ji] = small;a[k] = large;}}_mm256_storeu_si256((__m256i *)(dst + i * width + j), a[4]);// 非对齐模式存储8 个 int 型}// 不能被 32 整除的部分for(int je = j; je < width - 1; je++){unsigned char a[9];a[0] = src[i * width + je];a[1] = src[i * width + je + 1];a[2] = src[i * width + je - 1];a[3] = src[(i + 1) * width + je];a[4] = src[(i + 1) * width + je + 1];a[5] = src[(i + 1) * width + je - 1];a[6] = src[(i - 1) * width + je];a[7] = src[(i - 1) * width + je + 1];a[8] = src[(i - 1) * width + je - 1];for( int ji = 0; ji < 5; ji++){for( int jj = ji + 1; jj < 9; jj++){unsigned char large = std::max<unsigned char>(a[ji], a[jj]);unsigned char small = std::min<unsigned char>(a[ji], a[jj]);a[ji] = small;a[jj] = large;}}dst[i * width + je] = a[4];}}// 边界处理:直接拷贝for( int i = 0; i < width; i++){dst[i] = src[i];dst[(height - 1)*width + i] = src[(height - 1) * width + i];}for(int i = 0; i < height; i++){dst[i * width] = src[i * width];dst[i * width + width - 1] = src[i * width + width - 1];}
}

入口函数:

cv::Mat input = imread("micky.png", cv::IMREAD_GRAYSCALE);cv::Mat scale;
cv::resize(input, scale, cv::Size(3200, 3200));// 为了使得优化效果更明显int width = scale.cols;
int height = scale.rows;
cv::Mat output = cv::Mat(cv::Size(width, height), CV_8UC1, cv::Scalar(0));Timer timer;
//meanFilter(scale.data, output.data, width, height);
medianFilter(height, width, scale.data, output.data);
timer.rlog("时间");timer.restart();
medianFilterAVX(height, width, scale.data, output.data);
timer.rlog("时间");

和串行版本的比较结果如下:提升了将近 19 倍

AVX 指令集并行技术优化中值滤波相关推荐

  1. AVX 指令集并行技术优化积分计算圆周率 π

    通过 AVX 指令集并行技术优化积分计算圆周率 π 完整代码和解释如下 // AVX_PI.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" # ...

  2. 基于Matlab的图像处理②(图像增强技术,中值滤波,均值滤波)

    目录 一.常用函数 1.导入图像 2.显示图像 3.显示图片色彩直方图 4.调整对比度 5.分块显示 6.导出图像 7.中值滤波 8.增加噪声 9.灰度函数 二.运行代码 三.效果 一.常用函数 1. ...

  3. 轨迹系列2——一种基于中值滤波的轨迹纠偏方法和几点思考

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在无路网的情况下,如何进行轨迹纠偏也是一个很多人在研究的内容, ...

  4. 中值滤波 matlab程序实现(一)

    中值滤波:基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术.中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,一般为方形邻域,也可以为圆形.十字形等等,然后将邻域中各像素的灰度值 ...

  5. 【老生谈算法】matlab实现车牌识别中值滤波算法——车牌识别中值滤波算法

    基于Matlab的车牌识别中值滤波算法的研究与实现 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于Matlab的车牌识别中值滤波算 ...

  6. C++手敲灰度图均值滤波中值滤波高斯滤波

    一.均值滤波(Meaning Filtering)概念 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板 ...

  7. 图像处理实验,中值滤波处理椒盐噪声

    一.实验目的 图像变换是数字图像处理中的一种综合变换,如直方图变换.几何变换等.通过本实验,掌握中值滤波处理. 二.实验任务 设计程序,用中值滤波法(模板的大小为3×3).进行去噪处理. 得出实验结果 ...

  8. 均值滤波、中值滤波的matlab实现

    目前比较经典的图像去噪算法主要有以下三种:   均值滤波算法:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度 的平均值来代替每个像素的灰度.有效抑制加性噪声,但容易引起图像模 糊, 可以对其进行 ...

  9. 中值滤波原理及其代码实现

    本文主要是对高斯滤波,中值滤波原理进行简单介绍,随后用代码实现高斯噪声和椒盐噪声.以及用高斯滤波和中值滤波对这两种图像进行相关的处理. 高斯噪声:就是服从高斯正态分布的噪声,通常是因为高温或者是传感器 ...

最新文章

  1. idea工程本地依赖_IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题(已解决)...
  2. java爬虫下载付费html网页模板
  3. Yelp研发实践:使用服务拆分单块应用
  4. 从汇编去分析线程安全
  5. nginx搭建文件服务器脚本,基于docker搭建nginx文件服务器的方法步骤
  6. Linux中7个用来浏览网页和下载文件的命令
  7. 一维数组模拟数据结构-------栈
  8. 域名使用cname方式跳转不到新域名_七牛云图床和Markdown使用
  9. CVPR 2021 | 谷歌发布视频全景分割数据集!顺带开发个模型屠榜
  10. 用过那些号称媲美迅雷的下载神器,发现没一个能打的。
  11. android定位!每个程序员都必须掌握的8种数据结构!完整版开放下载
  12. Tableau6——地图绘制
  13. AUTOCAD——拉伸
  14. 申报2021国家高新技术企业认定,有哪些标准?
  15. tfs php,TFS的原理及应用
  16. WINVNC Server详解
  17. C++描述 LeetCode 112. 路径总和
  18. 夕拾算法初级篇:5)1020. 月饼(贪心)
  19. getline()函数的几点疑惑
  20. 【专题5: 硬件设计】 之 【15.RC滤波电路】

热门文章

  1. [RK3568 Android12] GT911触摸屏调试
  2. 互点宝SEO软件官方版
  3. 网站和APP用户注销功能的讨论
  4. 飞秋下载2010正式版 飞秋下载
  5. lammps计算团簇的方法
  6. MetaIn中poi点在智慧城市的运用
  7. GIS空间分析 数字地形分析3 可视性分析
  8. C语言实现Floyd算法
  9. linux系统参数之ip_local_port_range、tcp_max_tw_buckets、tcp_tw_reuse
  10. 如何通过局域网安装系统(网刻)