PyOpenCL图像处理:RGB图像边缘增强
2018-02-27 00:00
405 查看
# -*- 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, """ void filter2d_internal(__read_only image2d_t input, __write_only image2d_t output, const int maskWidth, const int maskHeight, float * mask,int compute_aver){ const sampler_t sampler = CLK_FILTER_NEAREST | CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE; const int2 size = get_image_dim(input); int2 coord = (int2)(get_global_id(0),get_global_id(1)); const int maskrows = maskWidth / 2; const int maskcols = maskHeight / 2; float4 color = (float4)(0,0,0,1.0f); int idx = 0; for(int y = -maskrows;y <= maskrows;++y){ for(int x = -maskcols; x <= maskcols;++x){ float4 srcColor = read_imagef(input,sampler,(int2)(x + coord.x,y + coord.y)); color.xyz += srcColor.xyz * mask[idx]; idx++; } } if(compute_aver){ color.xyz = color.xyz / (maskWidth * maskHeight); } write_imagef(output,coord,color); } __kernel void edge_enhance_filter(__read_only image2d_t input, __write_only image2d_t output){ float color_mask [9] = {0,0,0,-20,20,0,0,0,0}; filter2d_internal(input,output,3,3,color_mask,1); } """).build() # 打开图片文件 src1 = Image.open('temp/images/f2.png') print(src1.size) 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()) 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.edge_enhance_filter(queue,globalWorkSize,localWorkSize,img1,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()
相关文章推荐
- 彩色图像边缘检测--求RGB的最大变化率方向(数字图像处理(Digital Image Processing Second Edition)冈萨雷斯)
- PyOpenCL图像处理:RGB图像边缘检测
- Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果
- 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)
- 图像边缘检测与边缘增强处理——(Roberts、prewitt、sobel)
- (7)Air Band数字图像处理基础-边缘检测和轮廓跟踪
- matlab图像处理之RGB转Ycbcr or gray
- 图像处理中的直方图应用(通过直方图均衡化增强图像对比度)
- [Python]图像处理日记——第一天(如何查询图片属性,数组与RGB,灰度图像如何互换)
- MATLAB处理RGB图像时如何获得单通道,以及如何根据各单通道恢复彩色图像
- 图像增强之模板处理——(加权均值、加权中值、拉普拉斯滤波,FFT、DCT变换)
- 图像直方图均衡化和局部增强处理
- MATLAB图像处理_LAB与RGB颜色空间互转
- 小波的秘密9_图像处理应用:图像增强
- 图像处理中边缘检测和轮廓检测的区别
- 【图像处理专题(一)】图像边缘特征提取
- 【数字图像处理】一种求图像边缘的方法
- 图像处理之Canny边缘检测
- 图像处理--RGB到HSI的彩色转换--图像分割(MFC VC++)
- 冈萨雷斯数字图像处理——彩色图像增强3实例