图像分块加速处理

写在前面

本文整理自网上的博客加上,对程序进行了些简单的调试,和自己的一些思考,写的不太完善,也可能有些地方表达的不太准确,如果后续发现有问题再进行完善修改

加速的原理

图像在进行处理的时候可以进行分块加速,那么分块为什么可以加速,原来计算机里面是多核的,分块以后,使用计算机的多核同时并行处理,最后再把结果组合起来,就能达到加速的效果

加速的实现

MATLAB如何加速

matlab在计算大数据内存以及大矩阵运算时,提供多核运算的解决方案,Matlab的并行计算实质还是主从结构的分布式计算。当你初始化Matlab并行计算环境时,你最初的Matlab进程自动成为主节点,同时初始化多个Matlab计算子节点

如何查看电脑的核的数目

首先检查电脑有几个核:在快速启动工具栏上点右键,选择“启动任务管理器”,或者在开始-运行中输入“taskmgr”,启动任务管理器。点性能选项卡,可以看到CPU使用记录,右上角有几个框就代表有几个核心。当然还有其他方法,如需了解请点参考2

关于内核

CPU(Central Processing Unit): 中央处理单元,CPU != 物理核,更 != 逻辑核。
物理核(physical core/processor): 可以看的到的,真实的cpu核,有独立的电路元件以及L1,L2缓存,可以独立地执行指令。
逻辑核(logical core/processor): 在同一个物理核内,逻辑层面的核。(比喻,像动画片一样,我们看到的“动画”,其实是一帧一帧静态的画面,24帧/s连起来就骗过了人类的眼睛,看起来像动起来一样。逻辑核也一样,物理核通过高速运算,让应用程序以为有两个cpu在运算)。
关系:通常所说的核是指的逻辑核

MATLAB测试

明白了核的概念以后,我们来在MATLAB上检测一下:
我们可以通过matlabpool命令来启动和配置Matlab并行计算池,但是较高版本的MATLAB会出现“未定义函数或变量 ‘matlabpool’”的错误,而采用了parpool命令来代替
在mathwork中我们可以对parpool进行检索,点击右边的translate可以将网页翻译成中文

使用本地配置文件启动由2名工作人员组成的并行池。

parpool('local',2)

查找当前并行池中的工作人员数。

poolobj = gcp('nocreate'); % If no pool, do not create new one.
if isempty(poolobj)
    poolsize = 0;
else
    poolsize = poolobj.NumWorkers
end

关于关闭

使用默认配置文件创建并行池, 然后删除该池。

poolobj = parpool;
delete(poolobj)

装配成函数如下:

function [] = closematlabpool
   poolobj = gcp('nocreate');
   delete(poolobj);
end

也可以直接

delete(gcp('nocreate'))

更详细的内容请参考资料5

各博客的案例

案例1:

 %% 启动并行计算 
 core_number=2; %想要调用的处理器个数
 parpool('local',core_number); 
 % % % % % % 启动后有如下提示: 
 % Starting parallel pool (parpool) using the 'local' profile ... 
 % connected to 2 workers. 
 %% 算例(没有实际意义,甚至很奇怪的例子)
 temp = []; 
 for j = 1:100 
    for i = 1:10
       x = i + j; 
       temp(i) = x; 
    end 
    % y = x + 1; 
  %x是临时变量,不能在parfor循环外使用
  y = temp .^ 2; 
  %temp是sliced变量(基本就是向量),可以在parfor循环外使用 end 
  %% 关闭并行计算 delete(gcp('nocreate')); 
  % % % % % 关闭后有如下提示: 
  % Parallel pool using the 'local' profile is shutting down.

案例2:
最好的方法是这样:

for k=1:M*N
  i=mod(k-1,M)+1    %行号
  j=floor((k-1)/M)+1     %列号
end

Note:

  1. Matlab启动并行环境是比较慢的,不过不用每次都重新启动环境,启动一次以后能一直使用
  2. parfor循环中的临时变量不能在循环外使用且每次parfor迭代后临时变量都会自动清除
  3. parfor使用时机:每次循环相互独立,且数据量较大
  4. parfor只能用在单循环当中

图像分块

clc; clear all; close all;
I = imread('lena.jpg');
height= size(I, 1); %求出行
width = size(I, 2); %求出列
region_size = 256;  %区域宽高大小
numRow = round(height/region_size);%图像在垂直方向能分成多少个大小为region_size
numCol = round(width/region_size);%图像在水平方向能分成多少个大小为region_size
I=imresize(I,[numRow*region_size,numCol*region_size]);%重新生成新的图像,以防止temp下标越界
 
t1 = (0:numRow-1)*region_size + 1; t2 = (1:numRow)*region_size;
t3 = (0:numCol-1)*region_size + 1; t4 = (1:numCol)*region_size;
figure; 
k = 0;
for i = 1 : numRow
    for j = 1 : numCol
        
        temp = I(t1(i):t2(i), t3(j):t4(j), :);
        k = k + 1;
        subplot(numRow, numCol, k);
        imshow(temp);       
    end
end

特征值进行合并

最后把图像的各部分进行组合

end

参考

1、如何利用MATLAB并行计算缩短程序运行时间
2、如何查看电脑CPU的核心个数
3、CPU、物理核、逻辑核概念与关系
4、matlab并行一 配置matlab并行计算池
5、在mathwork中查parpool的用法
6、Matlab使用:多核并行计算
7、Matlab 并行计算学习初步
8、matlab并行一 配置matlab并行计算池
9、matlab并行之parafor
10、MATLAB与图像处理(三):图像分成块

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值