PyCUDAを使ってLaplacian filter(ラプラシアンフィルタ)を作成するプログラムがあったので、今後の画像処理学習の参考のためにこのコードを拝借しようと思う。
スポンサーリンク
参照サイトをgit clone¶
cd git
!git clone https://github.com/ashwinashok9111993/andromeda.git
cd andromeda
ls
スポンサーリンク
laplacian.pyをload¶
#%load laplacian.py
__author__ = 'ashwin'
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
from pycuda.compiler import SourceModule
import scipy.misc as scm
import matplotlib.pyplot as p
#realrow = np.random.random([20,20]).astype(np.float32)
#print realrow.shape
realrow = scm.imread('lenaG.jpg').astype(np.float32)
(M,N)=realrow.shape
print (realrow.shape)
mod_copy_texture=SourceModule(
"""
texture<float,2>tex;
__global__ void copy_texture_kernel(float *C,float * data)
{
int i = threadIdx.x+(blockIdx.x*(blockDim.x));
int j = threadIdx.y+(blockIdx.y*(blockDim.y));
int gx=0;
int gy=0;
int M=C[0];
int N=C1;
while(i<M)
{
while(j<N)
{
data[i*N+j] = 8*tex2D(tex,j,i)-tex2D(tex,j-1,i)-tex2D(tex,j-1,i-1)-tex2D(tex,j-1,i+1)-tex2D(tex,j+1,i)-tex2D(tex,j+1,i+1)-tex2D(tex,j+1,i-1)-tex2D(tex,j,i+1)-tex2D(tex,j,i-1);
__syncthreads();
j += blockDim.y * gridDim.y;
}
i += blockDim.x * gridDim.x;
}
}
""")
########
#get the kernel
########
copy_texture_func = mod_copy_texture.get_function("copy_texture_kernel")
#########
#Map the Kernel to texture object
#########
texref = mod_copy_texture.get_texref("tex")
cuda.matrix_to_texref(realrow , texref , order = "C")
#texref.set_flags(cuda.TRSF_NORMALIZED_COORDINATES)
#texref.set_filter_mode()
gpu_output = np.zeros_like(realrow)
copy_texture_func(cuda.In(np.float32([M,N])),cuda.Out(gpu_output),block=(32,32, 1), grid=(M/32,N/32,1), texrefs=[texref])
p.gray()
p.subplot(1,2,1)
p.imshow(realrow)
p.subplot(1,2,2)
p.imshow(gpu_output)
p.show()
__author__ = 'ashwin'
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
from pycuda.compiler import SourceModule
import scipy.misc as scm
import matplotlib.pyplot as p
#realrow = np.random.random([20,20]).astype(np.float32)
#print realrow.shape
realrow = scm.imread('lenaG.jpg').astype(np.float32)
(M,N)=realrow.shape
print (realrow.shape)
mod_copy_texture=SourceModule(
"""
texture<float,2>tex;
__global__ void copy_texture_kernel(float *C,float * data)
{
int i = threadIdx.x+(blockIdx.x*(blockDim.x));
int j = threadIdx.y+(blockIdx.y*(blockDim.y));
int gx=0;
int gy=0;
int M=C[0];
int N=C2;
while(i<M)
{
while(j<N)
{
data[i*N+j] = 8*tex2D(tex,j,i)-tex2D(tex,j-1,i)-tex2D(tex,j-1,i-1)-tex2D(tex,j-1,i+1)-tex2D(tex,j+1,i)-tex2D(tex,j+1,i+1)-tex2D(tex,j+1,i-1)-tex2D(tex,j,i+1)-tex2D(tex,j,i-1);
__syncthreads();
j += blockDim.y * gridDim.y;
}
i += blockDim.x * gridDim.x;
}
}
""")
########
#get the kernel
########
copy_texture_func = mod_copy_texture.get_function("copy_texture_kernel")
#########
#Map the Kernel to texture object
#########
texref = mod_copy_texture.get_texref("tex")
cuda.matrix_to_texref(realrow , texref , order = "C")
#texref.set_flags(cuda.TRSF_NORMALIZED_COORDINATES)
#texref.set_filter_mode()
gpu_output = np.zeros_like(realrow)
copy_texture_func(cuda.In(np.float32([M,N])),cuda.Out(gpu_output),\
block=(32,32, 1), grid=(M//32,N//32,1), texrefs=[texref])
p.rcParams['figure.figsize'] = 30, 30
plt.rcParams["font.size"] = "18"
p.gray()
p.subplot(1,2,1)
p.imshow(realrow)
p.subplot(1,2,2)
p.imshow(gpu_output)
p.show()
スポンサーリンク
OpenCVと比較¶
opencvのlaplacian filterと比較してみる。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('lenaG.jpg',0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
plt.rcParams["font.size"] = "30"
plt.subplot(2,2,1),plt.imshow(gpu_output,cmap = 'gray')
plt.title('PyCUDA'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('OpenCV'), plt.xticks([]), plt.yticks([])
plt.show()
色が薄くて分かりにくいので画像を修正する。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('lenaG.jpg',0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
plt.rcParams["font.size"] = "30"
plt.subplot(2,2,1),plt.imshow(gpu_output,cmap = 'gray', vmin=0, vmax=64)
plt.title('PyCUDA'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray', vmin=0, vmax=32)
plt.title('OpenCV'), plt.xticks([]), plt.yticks([])
plt.show()
速度比較もしてみようと思ったが面倒くさいからやめた。
スポンサーリンク
スポンサーリンク