高性能计算-openmp-图像卷积滤波算法(12)
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)的更多相关文章
- Win8 Metro(C#)数字图像处理--2.51图像统计滤波算法
原文:Win8 Metro(C#)数字图像处理--2.51图像统计滤波算法 [函数名称] 图像统计滤波 WriteableBitmap StatisticalFilter(Writeab ...
- Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法
原文:Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法 [函数名称] 高斯平滑滤波器 GaussFilter(WriteableBitmap src,int r ...
- 基于FPGA的均值滤波算法实现
我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于 ...
- zz图像卷积与滤波的一些知识点
Xinwei: 写的通俗易懂,终于让我这个不搞CV.不搞图像的外行理解卷积和滤波了. 图像卷积与滤波的一些知识点 zouxy09@qq.com http://blog.csdn.net/zouxy09 ...
- 用python实现对图像的卷积(滤波)
之前在看卷积神经网络,很好奇卷积到底是什么,最后看到了这篇文章http://blog.csdn.net/zouxy09/article/details/49080029,讲得很清楚,这篇文章中提到了对 ...
- 基于Vivado HLS在zedboard中的Sobel滤波算法实现
基于Vivado HLS在zedboard中的Sobel滤波算法实现 平台:zedboard + Webcam 工具:g++4.6 + VIVADO HLS + XILINX EDK + ...
- Python下opencv使用笔记(图像频域滤波与傅里叶变换)
Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654 收藏 展开 本文转载自 https://blog ...
- 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...
- paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他
在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...
- OPENCV基本滤波算法
图像滤波的主要目的是为了在保留图像细节的情况下尽量的对图像的噪声进行消除,从而是后来的图像处理变得更加的方便. 图像的滤波效果要满足两个条件:1.不能损坏图像的轮廓和边缘这些重要的特征信息.2.图像的 ...
随机推荐
- React函数式组件避免无用渲染的方案
在class组件中可以使用shouldComponentUpdate钩子函数,但是函数式组件中是没有这种钩子函数的,那么在函数式组件中来达到类似的效果呢? 答案是:React.Memo,如以下使用案例 ...
- webpack笔记-webpack基础用法(二)
webpack 本质上是一个打包工具,它会根据代码的内容解析模块依赖,帮助我们把多个模块的代码打包. 一切文件:JavaScript.CSS.SCSS.图片.模板,在 Webpack 眼中都是一个个模 ...
- InfoTS: 具有信息感知增强的时间序列对比学习《Time Series Contrastive Learning with Information-Aware Augmentations》(对比学习、信息感知增强、高保真、多样性、信息论-信息瓶颈、元学习器)(没看懂,还需要再回顾)
现在是2024年5月23日,14:30,开始看论文. 论文:Time Series Contrastive Learning with Information-Aware Augmentations ...
- ASP.NET Core – Partial View
前言 之前写过一篇 ASP.NET Core – View Component 里面有提到, View Component 是 Partial View 的加强版. 多了一个 .cs 可以写逻辑. 那 ...
- ASP.NET Core Library – scriban (Template Engine)
前言 有些项目会需要让 end user 写模板 (rich text) 同时又需要做一些 data binding. 这几乎是 programmer 的工作了... 在 C#, 大可以使用 Razo ...
- 记一次 公司.NET项目部署在Linux环境压测时 内存暴涨分析
一:背景 讲故事 公司部署在某碟上的项目在9月份压测50并发时,发现某个容器线程.内存非正常的上涨,导致功能出现了异常无法使用.根据所学,自己分析了下线程和内存问题,分析时可以使用lldb或者wind ...
- 记录JDK8到JDK17各个版本的更新重点
虽然大多数公司还是用的JDK8但是也要去了解和学习一下新得东西 ## JDK8新特性(2014年初)(LTS版本) 1.Lambda表达式 2.函数式编程 3.接口可以添加默认方法和静态方法,也就是定 ...
- 【赵渝强老师】NoSQL数据库之Cassandra基础
一.Cassandra简介 Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable.其主要功能比Dynamo (分布式的Key-Value存储系统)更丰富,但支持度却不如 ...
- OCR+PDF解析配套前端工具开源详解!
面对日常生活和工作中常见的OCR识别.PDF解析.翻译.校对等场景,配套的可视化工具能够极大地提升我们的使用体验和工作效率. 通过可视化界面,我们可以直观地看到文本识别.解析和翻译的结果,便捷评估产品 ...
- 墨天轮沙龙 | 腾讯云陈昊:TDSQL-C Serverless应用与技术实践
导读 数据库的发展由对性能的要求,逐步发展为对更为极致成本的要求,Serverless数据库是在高性能云数据库之上的极致成本优化方案.[墨天轮数据库沙龙-Serverless专场]邀请到腾讯云数据库产 ...