import pyopencl as cl
import numpy as np
from PIL import Image
def main():
image = Image.open('my_image.png')
(width, height) = image.size
if image.mode != 'RGB':
image = image.convert('RGB')
intType = np.dtype(np.int)
imarr = np.array(image, dtype = intType)
platform = cl.get_platforms()[0]
device = platform.get_devices()[0]
ctx = cl.Context(devices = [device])
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
imarr_d = cl.Buffer(ctx, mf.READ_ONLY, imarr.nbytes)
cl.enqueue_copy(queue, imarr_d, imarr, is_blocking = True)
result = np.zeros([width, height], dtype = intType)
result_d = cl.Buffer(ctx, mf.READ_WRITE, result.nbytes)
cl.enqueue_copy(queue, result_d, result, is_blocking = True)
code = '''
__kernel void has_rgb_value(
__global int * imarr_d,
__global int * result_d)
{
int x = get_global_id(0);
int y = get_global_id(1);
int i = x * %(height)d * 3 + y * 3;
if (imarr_d[i + 0] == %(red)d &&
imarr_d[i + 1] == %(green)d &&
imarr_d[i + 2] == %(blue)d)
{
result_d[x * %(height)d + y] = 1;
}
}
__kernel void reduce(
__global int * result_d)
{
int i = get_global_id(0);
for (int j = 1; j < %(height)d; j ++)
{
result_d[i * %(height)d + 0] += result_d[i * %(height)d + j];
}
}
''' % {
'red' : 255,
'green' : 0,
'blue' : 255,
'height' : height
}
program = cl.Program(ctx, code).build()
program.has_rgb_value(
queue, (width, height), None,
imarr_d, result_d
).wait()
program.reduce(
queue, (width, ), None,
result_d
).wait()
cl.enqueue_copy(queue, result, result_d, is_blocking = True)
for i in range(1, width):
result[0, 0] += result[i, 0];
print result[0, 0]
if __name__ == '__main__':
main()
aW1wb3J0IHB5b3BlbmNsIGFzIGNsCmltcG9ydCBudW1weSBhcyBucApmcm9tIFBJTCBpbXBvcnQgSW1hZ2UKCmRlZiBtYWluKCk6CgogICAgaW1hZ2UgPSBJbWFnZS5vcGVuKCdteV9pbWFnZS5wbmcnKQoKICAgICh3aWR0aCwgaGVpZ2h0KSA9IGltYWdlLnNpemUKCiAgICBpZiBpbWFnZS5tb2RlICE9ICdSR0InOgogICAgICAgIGltYWdlID0gaW1hZ2UuY29udmVydCgnUkdCJykKCiAgICBpbnRUeXBlID0gbnAuZHR5cGUobnAuaW50KQoKICAgIGltYXJyID0gbnAuYXJyYXkoaW1hZ2UsIGR0eXBlID0gaW50VHlwZSkKCiAgICBwbGF0Zm9ybSA9IGNsLmdldF9wbGF0Zm9ybXMoKVswXQogICAgZGV2aWNlID0gcGxhdGZvcm0uZ2V0X2RldmljZXMoKVswXQoKICAgIGN0eCA9IGNsLkNvbnRleHQoZGV2aWNlcyA9IFtkZXZpY2VdKQogICAgcXVldWUgPSBjbC5Db21tYW5kUXVldWUoY3R4KQoKICAgIG1mID0gY2wubWVtX2ZsYWdzCgogICAgaW1hcnJfZCA9IGNsLkJ1ZmZlcihjdHgsIG1mLlJFQURfT05MWSwgaW1hcnIubmJ5dGVzKQogICAgY2wuZW5xdWV1ZV9jb3B5KHF1ZXVlLCBpbWFycl9kLCBpbWFyciwgaXNfYmxvY2tpbmcgPSBUcnVlKQoKICAgIHJlc3VsdCA9IG5wLnplcm9zKFt3aWR0aCwgaGVpZ2h0XSwgZHR5cGUgPSBpbnRUeXBlKQogICAgcmVzdWx0X2QgPSBjbC5CdWZmZXIoY3R4LCBtZi5SRUFEX1dSSVRFLCByZXN1bHQubmJ5dGVzKQogICAgY2wuZW5xdWV1ZV9jb3B5KHF1ZXVlLCByZXN1bHRfZCwgcmVzdWx0LCBpc19ibG9ja2luZyA9IFRydWUpCgogICAgY29kZSA9ICcnJwoKICAgIF9fa2VybmVsIHZvaWQgaGFzX3JnYl92YWx1ZSgKICAgICAgICBfX2dsb2JhbCBpbnQgKiBpbWFycl9kLAogICAgICAgIF9fZ2xvYmFsIGludCAqIHJlc3VsdF9kKQogICAgewogICAgICAgIGludCB4ID0gZ2V0X2dsb2JhbF9pZCgwKTsKICAgICAgICBpbnQgeSA9IGdldF9nbG9iYWxfaWQoMSk7CgogICAgICAgIGludCBpID0geCAqICUoaGVpZ2h0KWQgKiAzICsgeSAqIDM7CgogICAgICAgIGlmIChpbWFycl9kW2kgKyAwXSA9PSAlKHJlZClkICYmCiAgICAgICAgICAgIGltYXJyX2RbaSArIDFdID09ICUoZ3JlZW4pZCAmJgogICAgICAgICAgICBpbWFycl9kW2kgKyAyXSA9PSAlKGJsdWUpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdF9kW3ggKiAlKGhlaWdodClkICsgeV0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBfX2tlcm5lbCB2b2lkIHJlZHVjZSgKICAgICAgICBfX2dsb2JhbCBpbnQgKiByZXN1bHRfZCkKICAgIHsKICAgICAgICBpbnQgaSA9IGdldF9nbG9iYWxfaWQoMCk7CgogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgJShoZWlnaHQpZDsgaiArKykKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdF9kW2kgKiAlKGhlaWdodClkICsgMF0gKz0gcmVzdWx0X2RbaSAqICUoaGVpZ2h0KWQgKyBqXTsKICAgICAgICB9CiAgICB9CgogICAgJycnICUgewogICAgICAgICdyZWQnICAgIDogMjU1LAogICAgICAgICdncmVlbicgIDogMCwKICAgICAgICAnYmx1ZScgICA6IDI1NSwKICAgICAgICAnaGVpZ2h0JyA6IGhlaWdodAogICAgfQoKICAgIHByb2dyYW0gPSBjbC5Qcm9ncmFtKGN0eCwgY29kZSkuYnVpbGQoKQoKICAgIHByb2dyYW0uaGFzX3JnYl92YWx1ZSgKICAgICAgICBxdWV1ZSwgKHdpZHRoLCBoZWlnaHQpLCBOb25lLAogICAgICAgIGltYXJyX2QsIHJlc3VsdF9kCiAgICApLndhaXQoKQoKICAgIHByb2dyYW0ucmVkdWNlKAogICAgICAgIHF1ZXVlLCAod2lkdGgsICksIE5vbmUsCiAgICAgICAgcmVzdWx0X2QKICAgICkud2FpdCgpCgogICAgY2wuZW5xdWV1ZV9jb3B5KHF1ZXVlLCByZXN1bHQsIHJlc3VsdF9kLCBpc19ibG9ja2luZyA9IFRydWUpCgogICAgZm9yIGkgaW4gcmFuZ2UoMSwgd2lkdGgpOgogICAgICAgIHJlc3VsdFswLCAwXSArPSByZXN1bHRbaSwgMF07CgogICAgcHJpbnQgcmVzdWx0WzAsIDBdCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigp