PyOpenCL图像处理:两张图片不带权重叠加
2018-02-23 00:00
676 查看
# -*- coding: utf-8 -*- from __future__ import absolute_import, print_function import numpy as np import pyopencl as cl import cv2 from PIL import Image def RoundUp(groupSize, globalSize): r = globalSize % groupSize; if r == 0: return globalSize else: return globalSize + groupSize - r # 创建Context # 如果有多个设备,则会提示选择 ctx = cl.create_some_context() # 创建CommandQueue queue = cl.CommandQueue(ctx) mf = cl.mem_flags # 通过字符串内容编译OpenCL的Program prg = cl.Program(ctx, """ __kernel void image_add(__read_only image2d_t input,__read_only image2d_t input2, __write_only image2d_t output){ //初始化采样器 const sampler_t sampler = CLK_FILTER_NEAREST | CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP; //获取图片大小 const int2 size = get_image_dim(input); //设置当前像素 int2 coord = (int2)(get_global_id(0),get_global_id(1)); if(coord.x >= 0 && coord.x < size.x && coord.y >= 0 && coord.y < size.y){ float4 color = read_imagef(input,sampler,coord) + read_imagef(input2,sampler,coord); color.w = 1.0f; write_imagef(output,coord,color); } } """).build() # 打开图片文件 src1 = Image.open('temp/images/f1.png') src2 = Image.open('temp/images/f2.png') dist = Image.new('RGBA',(640,480),(255,255,255)) # OpenCL处理的图片文件格式RGBA,unit8 imageFormat = cl.ImageFormat(cl.channel_order.RGBA,cl.channel_type.UNSIGNED_INT8) # 将图片从Host复制到Device img1 = cl.Image(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,imageFormat,src1.size,None,src1.tobytes()) img2 = cl.Image(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,imageFormat,src2.size,None,src2.tobytes()) output = cl.Image(context=ctx,flags=mf.WRITE_ONLY,format=imageFormat,shape=src1.size) # 根据图片大小定义WorkSize localWorkSize = ( 8, 8 ) globalWorkSize = ( RoundUp(localWorkSize[0], src1.size[0]), RoundUp(localWorkSize[1], src1.size[1])) # 执行Kernel prg.image_add(queue,globalWorkSize,localWorkSize,img1,img2,output) buffer = np.zeros(src1.size[0] * src1.size[1] * 4, np.uint8) origin = ( 0, 0, 0 ) region = ( src1.size[0], src1.size[1], 1 ) # 将处理好的图片从设备复制到HOST cl.enqueue_read_image(queue, output, origin, region, buffer).wait() # 保存图片 dist = Image.frombytes("RGBA",src1.size, buffer.tobytes()) dist.save('temp/images/cl-output.png') dist.show()
程序运行结果:
相关文章推荐
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
- 【Android图像处理】图片叠加/给图片添加纹理
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
- Atitit 混合叠加俩张图片的处理 图像处理解决方案 javafx blend
- Atitit 混合叠加俩张图片的处理 图像处理解决方案 javafx blend
- Android 图片特效处理:drawBitmapMesh——图像扭曲+动感
- Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
- android图片特效处理之图片叠加
- 图像处理------相似图片识别(直方图应用篇)
- MATLAB与图像处理(四):将图片序列转化为视频文件,将视频文件转化为图片
- 用python简单处理图片(4):图像中的像素访问
- 《图像叠加及透明度处理》
- 旋转翻转UIImage 不是UIImageView 适用于源图像的处理,例如截图后旋转----改变图片大小
- 图像处理经典图片Lena背后的故事
- 图像处理之相似图片识别(直方图应用篇)【转】
- 图像处理之CPU图片滤镜
- 【数字图像处理】一.MFC详解显示BMP格式图片
- Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理
- Html和css 两张图片叠加一起
- keras实现deepid:flatten中间层、merge多个层次、二维图像的处理、权重的保存与重用、Autoencoder