Hi Andreas, On Sat, 29 Oct 2011 11:33:37 +0200, Andreas Tharang <[email protected]> wrote: > I`ve made a little testscript to test the bilinear interpolation of > image2d_t-objects. > The script: > > import pyopencl as cl > import numpy as np > import cv2 # OpenCV 2.3.1 > > Img = cv2.imread("Test.jpg") # read Image with width = 709px and height > = 472px > Img = cv2.cvtColor(Img, cv2.COLOR_BGR2GRAY) # convert to grayscale > print Img.shape # prints: (472L, 709L) > OutImg = np.empty(shape=Img.shape, dtype=np.uint8) # create Output-Image > > ctx = cl.create_some_context() > queue = cl.CommandQueue(ctx) > > mf = cl.mem_flags > dev_Img = cl.Image(ctx, > mf.READ_ONLY | mf.COPY_HOST_PTR, > cl.ImageFormat(cl.channel_order.R, > cl.channel_type.UNSIGNED_INT8), > hostbuf=Img) > dev_OutImg = cl.Image(ctx, > mf.WRITE_ONLY | mf.ALLOC_HOST_PTR, > cl.ImageFormat(cl.channel_order.R, > cl.channel_type.UNSIGNED_INT8), > shape=Img.shape) > > prg = cl.Program(ctx, """ > const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | > CLK_FILTER_LINEAR | CLK_ADDRESS_NONE; > > __kernel void ImageCopy(__read_only image2d_t Img, __write_only > image2d_t Out) > { > const int2 dims = get_image_dim(Img); > const int2 Coords = (int2)(get_global_id(0), get_global_id(1)); > const float2 NormCoords = (convert_float2(Coords) + > (float2)(0.5f) + (float2)(0.4f)) / convert_float2(dims); // = (x + 0.5 + > 0.4)/h ; (y + 0.5 + 0.2)/w > > uint4 Pixel = read_imageui(Img, smp, NormCoords); > write_imageui(Out, Coords, Pixel); > } > """).build() > > prg.ImageCopy(queue, Img.shape, None, dev_Img, dev_OutImg) > cl.enqueue_read_image(queue, dev_OutImg, (0, 0), OutImg.shape, > OutImg).wait() > cv2.imwrite("Out.jpg", OutImg) > > The problem: This is the input-image: > http://s7.directupload.net/file/d/2692/hkbb8pn2_jpg.htm > And when i add a small offset to the image-coords ( here 0.4f) the > output is something like this: > http://s1.directupload.net/file/d/2692/xuqzmtp4_jpg.htm > When i don't add this little offset or use CLK_FILTER_NEAREST then the > result is o.k. > The effect is proportional to the ratio of the image height and width > and the absolute value of the offset. > Also only the offset in image-width direction has a influence ( if i add > (float2)(0.4f,0.0f) the result is nearly o.k. - 4 diagonal pixel-bands > remains) > A quadratic image produces allways the correct output. > The script runs on a NVidia NVS3100M with image-support. > I`ve tried to swap the Image-shapes and Coords in all ways in and > outside the kernel - no good result.
This is unlikely to be an issue with PyOpenCL, I think--it's more likely that the hardware or the driver is at fault. My first try would be to replace the image write with a write to a regular 2D array. Hope that helps, Andreas
pgpN6VCGRjyJV.pgp
Description: PGP signature
_______________________________________________ PyOpenCL mailing list [email protected] http://lists.tiker.net/listinfo/pyopencl
