我的目标是将value = 255的图像像素转换为0。例如,删除所有的纯白色像素。下面是使用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()
我面临的问题是,一旦我在上面的程序中使用循环,逻辑只适用于第一个图像。也就是说,白色像素只在第一张图像中被移除,但在随后的图像中没有看到任何效果,即输出图像与输入图像相同,对值= 255的像素没有任何影响。这应该很简单。我找不到任何解决办法。
请帮助我解决这个问题。
谢谢。
在内核中,如果图像a
中的像素为白色,则不将图像b
中的像素设置为任何值。您应该将其更改为如下内容:
b[y * sizex + x] = (a[y * sizex + x] == 255) ? 0 : a[y * sizex + x];
如果图像a中的像素为白色,则将图像b中的像素设置为零,否则不加修改地复制该像素。还可以考虑就地执行这种操作,这样只需要一个缓冲区。