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. [Udemy] AWS Certified Data Analytics Specialty - 4.Analysis

    Kinesis Data Analytics Analytics 可以和 Lambda集成 RANDOM_CUT_FOREST, 异常检测算法 OpenSearch = ElasticSearch O ...

  2. 小tips:前端容易读错的单词列表

    排名第一的是width,音标/wɪdθ/,发/i/的音,不是发/ai/的音: hidden音标/ˈhɪdn/发/i/的音,不是发/ai/的音: hide音标/haɪd/,发/ai/的音: float音 ...

  3. MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系

    前言 它们关系挺乱的, 而且不只是我一个人感觉乱 还有 所以这篇做一个整理吧. Material Design Google 的设计指南. 早年用于 Android Apps, 现在也用于 Web A ...

  4. SQL Server – 冷知识 (新手)

    前言 没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入. 变量作用域 SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了 ...

  5. Java 之跨docker容器备份数据库

    Java 之跨docker容器备份数据库 摘] java中执行数据库备份,每隔10分钟备份一次,保留四份备份文件,项目在windows系统下运行备份命令没问题.项目采用docker部署后,jar部署在 ...

  6. 十种SQL的语法

    一.ORDER BY FIELD()自定义排序逻辑 ORDER BY FIELD(str,str1,...) 自定义排序sql如下: SELECT * from order_diy ORDER BY ...

  7. 暑假集训CSP提高模拟5

    听好了: 7 月 22 日,比样的学长就此陷落.每个陷落的学长都将迎来一场模拟赛,为这些模拟赛带来全新的题面. 你所熟知的一切都将改变,你所熟悉的算法都将加诸比样的考验. 至此,一锤定音. 尘埃,已然 ...

  8. 批量读取nii文件的shape

    import SimpleITK as sitk from glob import glob import os path = glob(r"D:\MyData\date\*") ...

  9. SpringBoot进阶教程(八十二)Spring Security图形验证码

    在之前的博文<SpringBoot进阶教程(八十)Spring Security>中,已经介绍了在Spring Security中如何基于formLogin认证.基于HttpBasic认证 ...

  10. webpack配置 alias用于方便引用文件

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