Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用OpenCL从灰度图像中过滤全白色像素_Python_Opencv_Opencl_Pyopencl - Fatal编程技术网

Python 使用OpenCL从灰度图像中过滤全白色像素

Python 使用OpenCL从灰度图像中过滤全白色像素,python,opencv,opencl,pyopencl,Python,Opencv,Opencl,Pyopencl,我的目标是将值为255的图像像素转换为0。i、 e.删除所有纯白色像素。以下是使用opencv和opencl的python代码: import os import glob import cv2 as cv import numpy as np import pyopencl as cl def filter_image( ): platforms = cl.get_platforms() devices = platforms[0].get_devices( cl.devi

我的目标是将值为255的图像像素转换为0。i、 e.删除所有纯白色像素。以下是使用opencv和opencl的python代码:

import os
import glob
import cv2 as cv
import numpy as np
import pyopencl as cl

def filter_image( ):

    platforms = cl.get_platforms()
    devices = platforms[0].get_devices( cl.device_type.ALL )
    context = cl.Context( [devices[0]] )
    cQ = cl.CommandQueue( context )
    kernel = """
        __kernel void filter( global uchar* a, global uchar* b ){
                int y = get_global_id(0);
                int x = get_global_id(1);

                int sizex = get_global_size(1);

                if( a[ y*sizex + x ] != 255 )
                        b[ y*sizex + x ] = a[ y*sizex + x ];
            }"""

    program = cl.Program( context, kernel ).build()

    for i in glob.glob("*.png"):

        image = cv.imread( i, 0 )        
        b = np.zeros_like( image, dtype = np.uint8 )
        rdBuf = cl.Buffer( 
                context,
                cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR,
                hostbuf = image
                          )

        wrtBuf = cl.Buffer( 
                context,
                cl.mem_flags.WRITE_ONLY,
                b.nbytes
                          )

        program.filter( cQ, image.shape, None, rdBuf, wrtBuf ).wait()
        cl.enqueue_copy( cQ, b, wrtBuf ).wait()
        cv.imshow( 'a', b )
        cv.waitKey( 0 )

def Filter( ):
    os.chdir('D:\image')
    filter_image( )
    cv.destroyAllWindows()
我面临的问题是,一旦我在上面的程序中使用循环,逻辑就只适用于第一个图像。i、 e.仅针对第一个图像移除白色像素,但在后续图像中看不到任何影响,即输出图像与输入图像相同,对值为255的像素没有任何影响。这应该很简单。我找不到任何解决办法

请帮我解决这个问题


谢谢。

在您的内核中,如果图像
a
中的像素为白色,则不会将图像
b
中的像素设置为任何值。您应该将其更改为以下内容:

b[y * sizex + x] = (a[y * sizex + x] == 255) ? 0 : a[y * sizex + x];

如果图像a中的像素为白色,则会将图像b中的像素设置为零,否则会复制不变的像素。也可以考虑这样的操作,这样只需要一个缓冲区。我会试试这个然后回来是的,它解决了我的问题。谢谢你提醒我三元运算符的存在。这个简单的事情解决了它。@Yash有趣的是,我不确定这就是问题所在。从中得到的重要寓意是OpenCL不会将缓冲区初始化为零,你需要自己做:)(如果缓冲区被初始化为零,你的旧内核就会工作)。是的,我意识到在你的方法为我工作之后。我在同样的假设下对内核进行了编程(缓冲区中的值将被初始化为0)。我应该更仔细地阅读说明书。谢谢你,伙计。。。。