1. 目标:使用openmp实现图像滤波算法

给定一个输入图像,你的任务是将其划分为多个块,并使用多个进程对每个块进行滤波操作。
要求:
1、使用分段并行结构和指令section来并行执行不同的计算步骤。
2、使用单线程指令single或master确保某些代码段只在单个线程中执行。
3、使用线程同步和阻塞机制来确保所有线程在进入下一步处理之前完成当前步骤的计算。
4、使用任务池并行化来处理滤波操作,并根据图像块的大小和数量选择静态任务或动态任务。

2. 思路

思路:

(1). 根据结果目标元素位置,判断出要计算的原始图像数据和卷积核的位置边界

(2). 输出图像每个元素的计算当做一个任务

(3). 如果对数据分块的处理:

(a) 每个分块需要根据卷积核大小增加冗余数据空间,决定不采用分块模式。
(b) 遍历分块分配任务仍需要放在single单线程内处理
(c) 分块处理增加了代码复杂性,并无其他优点。决定不采用分快处理

3. 代码

#include <stdio.h>
#include <stdlib.h>
#include <omp.h> #define N 5 //输入图像方阵列维度
#define FN 3 //卷积核方阵列维度 void print_matrixS(unsigned char* matrix, int rows, int cols)
{
printf("matrix:\n");
for (size_t i = 0; i < rows; i++)
{
for (size_t j = 0; j < cols; j++)
printf("%d\t",matrix[i*cols+j]);
printf("\n");
}
} void main()
{
unsigned char inPic[N][N] = {0}; //输入图像
unsigned char outPic[N][N] = {0}; //输出图像
unsigned char conv[FN][FN] = {0}; //卷积核
double startTime,endTime; //计算的起始终止时间
//输入图像初始化
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
inPic[i][j] = rand()%256;
}
//初始化卷积核,中值滤波初始化为1
for(int i=0;i<FN;i++)
{
for(int j=0;j<FN;j++)
conv[i][j] = 1;
}
omp_set_num_threads(10);
startTime = omp_get_wtime();
//计算
#pragma omp parallel proc_bind(close)
{
//在单线程内分配任务
#pragma omp single
{
// #pragma omp for collapse(2) schedule(guided)
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//将每个输出图像数据的计算都作为一个task
#pragma omp task shared(conv)
{
//确定计算结果每个元素卷积要参与的输入图像的数据位置边界
int up,down,left,right;
int half = FN/2; //卷积核一半向下取整
left = (j - half)>=0 ? j-half : 0;
right = (j+half)<=N-1 ? j+half : N-1;
up = (i - half)>=0 ? i-half : 0;
down = (i+half)<=N-1 ? i+half : N-1;
int rNums,cNums; //参与计算的行列数
rNums = down - up +1;
cNums = right - left +1;
//需要确定卷积核参与计算的边界,只需要左上角坐标
int rBegin,cBegin;
rBegin = FN/2-(i-up);
cBegin = FN/2-(j-left);
// 计算: 均值滤波,采用先求和再平均,减少乘法次数和误差
int sum=0;
int weightSum = 0;
for(int r=up;r<=down;r++,rBegin++)
{
for(int c=left,cTempBegin=cBegin;c<=right;c++,cTempBegin++)
{
sum += inPic[r][c] * conv[rBegin][cTempBegin];
weightSum += conv[rBegin][cTempBegin];
}
}
double e = 1.0/(double)weightSum;
outPic[i][j] = (short)(sum*e);
}
}
}
}
}
#pragma omp taskwait
endTime = omp_get_wtime();
printf("inPicSize %d useSec %f\n",N,(double)(endTime-startTime));
print_matrixS((unsigned char*)inPic,N,N);
print_matrixS((unsigned char*)outPic,N,N);
// print_matrixF((float*)conv,FN,FN);
}

高性能计算-openmp-图像卷积滤波算法(12)的更多相关文章

  1. Win8 Metro(C#)数字图像处理--2.51图像统计滤波算法

    原文:Win8 Metro(C#)数字图像处理--2.51图像统计滤波算法  [函数名称]   图像统计滤波   WriteableBitmap StatisticalFilter(Writeab ...

  2. Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法

    原文:Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法  [函数名称]   高斯平滑滤波器      GaussFilter(WriteableBitmap src,int r ...

  3. 基于FPGA的均值滤波算法实现

    我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于 ...

  4. zz图像卷积与滤波的一些知识点

    Xinwei: 写的通俗易懂,终于让我这个不搞CV.不搞图像的外行理解卷积和滤波了. 图像卷积与滤波的一些知识点 zouxy09@qq.com http://blog.csdn.net/zouxy09 ...

  5. 用python实现对图像的卷积(滤波)

    之前在看卷积神经网络,很好奇卷积到底是什么,最后看到了这篇文章http://blog.csdn.net/zouxy09/article/details/49080029,讲得很清楚,这篇文章中提到了对 ...

  6. 基于Vivado HLS在zedboard中的Sobel滤波算法实现

     基于Vivado HLS在zedboard中的Sobel滤波算法实现 平台:zedboard  + Webcam 工具:g++4.6  + VIVADO HLS  + XILINX EDK + ...

  7. Python下opencv使用笔记(图像频域滤波与傅里叶变换)

    Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654  收藏 展开 本文转载自  https://blog ...

  8. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)

    最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...

  9. paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他

    在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...

  10. OPENCV基本滤波算法

    图像滤波的主要目的是为了在保留图像细节的情况下尽量的对图像的噪声进行消除,从而是后来的图像处理变得更加的方便. 图像的滤波效果要满足两个条件:1.不能损坏图像的轮廓和边缘这些重要的特征信息.2.图像的 ...

随机推荐

  1. Gluon 编译 JavaFx -> android apk

    Gluon 编译 JavaFx -> android apk 本文的内容属 在linux服务器上 搭建 Gluon 编译 android-apk 环境 这一篇文章直接跟着官网操作一次性成功 虚拟 ...

  2. C语言指针进阶

    目录 字符指针 指针数组 数组指针 数组指针的定义 &数组名VS数组名 数组指针的使用 数组参数.指针参数 一维数组传参 二维数组传参 一级指针传参 二级指针传参 一级指针 二级指针 数组指针 ...

  3. 一条 SQL 语句在 MySQL 中是如何执行的?

    本篇文章会分析下一个 SQL 语句在 MySQL 中的执行流程,包括 SQL 的查询在 MySQL 内部会怎么流转,SQL 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构 ...

  4. ScanFormer:逐层抵达目标,基于特征金字塔的指代表达理解框架 | CVPR'24

    指代表达理解(REC)旨在在图像中定位由自由形式自然语言描述指定的目标对象.尽管最先进的方法取得了令人印象深刻的性能,但它们对图像进行了密集感知,包含与语言查询无关的多余视觉区域,导致额外的计算开销. ...

  5. 课时05:Linux必备系统命令

  6. ant-design-vue 登录表单校验

    最近刚刚上手了 Vue3 的 antdv ui框架,来做个简单的登录校验练练手 安装 antdv 依赖 npm install ant-design-vue --save 在 main.ts/js 中 ...

  7. 五行强度得分_喜用神api免费接口_json数据八字五行强弱接口

    本API接口基于深厚的八字学原理,为用户提供详尽的五行(金.木.水.火.土)强弱分析.五行打分评估,以及精准的喜用神判断.用户只需输入自己的八字信息,即可获得全面而深入的命理解读. ‌一.核心功能‌ ...

  8. USB总线-Linux内核USB设备驱动ftrace分析(十一)

    1.简介 USB Gadget Driver定义了很多trace event,使用者可以在用户空间通过ftrace接口,追踪USB Gadget Driver的行为. USB设备控制器驱动定义的tra ...

  9. 将python文件编译成exe文件

    第一种方法:我们只会生成一个exe文件,因为所有的库文件他都会包含在这个exe文件中 1.安装:pyinstaller pip install pyinstaller 2.使用如下命令编译 pyins ...

  10. 在mac上配置nginx 并将前端的打包文件运行

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...