Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Image 如何批处理色度键照片(屏蔽绿色屏幕) 目标_Image_Image Processing_Imagemagick_Batch Processing_Chromakey - Fatal编程技术网

Image 如何批处理色度键照片(屏蔽绿色屏幕) 目标

Image 如何批处理色度键照片(屏蔽绿色屏幕) 目标,image,image-processing,imagemagick,batch-processing,chromakey,Image,Image Processing,Imagemagick,Batch Processing,Chromakey,我这里有数百张图片,看起来都和这张相似: 我只想使用绿色屏幕为每个看起来像这里的图像创建一个遮罩(边界最好平滑一点): 如果要进行测试,请查看原始图像: 我试过的 我找到了用户使用Imagemagick实现色度键控的帖子 for i in *; do convert $i -colorspace HSV -separate +channel \ \( -clone 0 -background none -fuzz 3% +transparent grey43 \) \ \( -cl

我这里有数百张图片,看起来都和这张相似:

我只想使用绿色屏幕为每个看起来像这里的图像创建一个遮罩(边界最好平滑一点):

如果要进行测试,请查看原始图像:


我试过的 我找到了用户使用Imagemagick实现色度键控的帖子

for i in *; do convert $i -colorspace HSV -separate +channel \
  \( -clone 0 -background none -fuzz 3% +transparent grey43 \) \
  \( -clone 1 -background none -fuzz 10% -transparent grey100 \) \
  -delete 0,1 -alpha extract -compose Multiply -composite \
  -negate mask_$i; done;
但无论我如何调整数字,结果都不是完美的:


我觉得自己很笨,自己找不到解决这么简单问题的办法。还要注意,我使用的是Linux。所以没有Photoshop或后期效果!:)

但我相信这个问题必须有一个解决办法

更新1 我刚刚通过运行
/greenscreen infire.jpg outfile.png
尝试使用by,我对结果相当满意。 但是处理一张图像大约需要40秒,这导致我的所有图像总共需要8小时(尽管我有一个相当强大的工作站,请参见下面的规格) 也许这与处理过程中出现的错误有关:

convert-im6.q16: width or height exceeds limit `black' @ error/cache.c/OpenPixelCache/3911.
convert-im6.q16: ImageSequenceRequired `-composite' @ error/mogrify.c/MogrifyImageList/7995.
convert-im6.q16: no images defined `./GREENSCREEN.6799/lut.png' @ error/convert.c/ConvertImageCommand/3258.
convert-im6.q16: unable to open image `./GREENSCREEN.6799/lut.png': No such file or directory @ error/blob.c/OpenBlob/2874.
convert-im6.q16: ImageSequenceRequired `-clut' @ error/mogrify.c/MogrifyImageList/7870.
convert-im6.q16: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `mask.png' @ warning/png.c/MagickPNGWarningHandler/1667.
工作站规格
  • 内存:125,8吉比特
  • 处理器:AMD®Ryzen 9 3900x 12核处理器×24
  • 图形:GeForce GTX 970/PCIe/SSE2(其中两个)

如果在类似Unix的系统上,您可以尝试我的绿屏脚本,该脚本调用ImageMagick并用Bash Unix编写。例如:

输入:

结果(绿色变为透明):

结果的大小减少了50%,这样StackOverflow就不会反对原始结果太大。但是,StackOverflow已将图像从透明PNG更改为白色背景JPG


请注意,其他图像可能需要默认值以外的参数值。你可以在网站上找到我的剧本。请注意,对于商业用途,您需要与我联系以获得许可。

我们知道背景是绿色的,可以通过颜色与对象区分开来,因此我建议使用颜色阈值。为此,我编写了一个简单的OpenCV Python代码来演示结果

首先,我们需要安装OpenCV

sudo apt update
pip3 install opencv-python
# verify installation
python3 -c "import cv2; print(cv2.__version__)"
然后,我们在与图像相同的目录中创建一个名为
skull.py
的脚本

导入cv2
将numpy作为np导入
def显示结果(winname、img、等待时间):
比例=0.2
disp_img=cv2.调整大小(img,无,fx=scale,fy=scale)
cv2.imshow(winname、disp\u img)
cv2.等待键(等待时间)
img=cv2.imread('skull.jpg')
hsv=cv2.CVT颜色(img,cv2.COLOR\U BGR2HSV)
#定义HSV中绿色的范围
下_green=np.数组([70200100])
上_green=np.array([90255])
#对HSV图像设置阈值以提取绿色
遮罩=cv2.inRange(hsv,下绿色,上绿色)
掩码=cv2。按位\u非(掩码)
#cv2.imwrite('mask.png',mask)
显示结果('mask',mask,0)
cv2.destroyAllWindows()
您可以很容易地找到有关使用OpenCV进行HSV颜色操作的教程。我将不讨论这里使用的函数,但有一部分很重要。图像操作通常在RGB颜色空间中完成,该空间包含红色、绿色和蓝色分量。然而,HSV更像是人类视觉系统,包含色调、饱和度和价值成分。你可以找到那个。由于我们根据自己的感知来区分颜色,HSV更适合这项任务

关键是要选择合适的阈值。我通过检查选择了80左右的色调(最大值为180),200和100以上的饱和度和值(最大值为255)。可以通过以下行打印特定像素的值:

行、列、通道=hsv.shape
打印(hsv[行,列])
请注意,原点位于左上角

结果如下:

可能需要两件事。一种是对一组图像执行操作,这对于循环来说很简单。另一个是,如果您不喜欢结果的某些部分,您可能需要知道像素位置并相应地更改阈值。这可以使用鼠标事件实现

范围(1100)内的i的
:
img=imread(str(i)+'.jpg')
def mouse_回调(事件、x、y、标志、参数):
如果event==cv2.event\u LBUTTONDOWN:
行=y
列=x
打印(行、列)
winname='img'
cv2.namedWindow(winname)
cv2.setMouseCallback(winname,鼠标回调)
请记住,
show_result
函数按比例因子调整图像大小

如果您不想处理像素位置,而是想要平滑的结果,可以应用。特别是打开和关闭将完成工作

kernel=np.one((11,11),np.uint8)
opened=cv2.morphologyEx(掩码,cv2.MORPH_OPEN,内核)
closed=cv2.morphologyEx(掩码,cv2.MORPH\u CLOSE,内核)

打开后的结果(kernel=11x11):

我真的无法将此放在评论中,所以我把它作为一个答案。如果你想使用Fred的
绿屏
脚本,你可以使用GNU Parallel来加速

假设您使用以下命令:

mkdir out
greenscreen image.png out/image.png
要处理一个映像,而您有数千个映像,您可以执行以下操作,使所有CPU内核并行忙碌,直到它们全部处理完毕:

mkdir out
parallel greenscreen {} out/{} ::: *.png

你试过这个吗?如果这是一个商业项目,你将需要支付使用它虽然。是的,它工作得很好,但它需要太长的时间来处理图像(见我更新的问题)关于你的错误消息从我的脚本,你的ImageMagick版本是什么?这真的很好!但不幸的是,这对我来说是不可行的,因为处理一张图像需要40秒,这意味着对所有图像执行此操作大约需要8小时(尽管我有一个相当强大的工作站)。也许这与处理过程中出现的错误有关?(请参阅我更新的问题)您的ImageMagick版本是什么
mkdir out
parallel greenscreen {} out/{} ::: *.png