gpt4 book ai didi

image - 如何批量处理色度关键照片(屏蔽绿屏)

转载 作者:行者123 更新时间:2023-12-04 15:46:16 25 4
gpt4 key购买 nike

目标

我有数百张图片,它们看起来都与此处的这张图片相似:

Source photo
我只是想使用绿色屏幕为每个看起来像这里的图像创建一个蒙版(最好将边框稍微平滑一点):

mask

如果您想进行测试,这里是原始图像:https://mega.nz/#!0YJnzAJR!GRYI4oNWcsKztHGoK7e4uIv_GvXBjMvyry7cPmyRpRA

我试过的

我找到了 this用户使用 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;

但无论我如何调整数字,结果都不完美:
result

我觉得自己很傻,这么简单的问题我自己都找不到解决办法。另请注意,我使用的是 Linux。所以没有Photoshop或After Effects! :)

但我确信必须有一个解决方案来解决这个问题。

更新 1

我刚刚尝试使用 this greenscreen script来自 fmw42通过运行 ./greenscreen infile.jpg outfile.png我对结果相当满意。
但是处理一张图像大约需要 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 GiB
  • 处理器 : AMD® Ryzen 9 3900x 12 核处理器 × 24
  • 图形 :GeForce GTX 970/PCIe/SSE2(其中两个)
  • 最佳答案

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

    首先,我们需要安装 OpenCV。

    sudo apt update
    pip3 install opencv-python
    # verify installation
    python3 -c "import cv2; print(cv2.__version__)"

    然后,我们创建一个名为 skull.py 的脚本。在与图像相同的目录中。

    import cv2
    import numpy as np

    def show_result(winname, img, wait_time):
    scale = 0.2
    disp_img = cv2.resize(img, None, fx=scale, fy=scale)
    cv2.imshow(winname, disp_img)
    cv2.waitKey(wait_time)

    img = cv2.imread('skull.jpg')
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # define range of green color in HSV
    lower_green = np.array([70, 200, 100])
    upper_green = np.array([90, 255, 255])
    # Threshold the HSV image to extract green color
    mask = cv2.inRange(hsv, lower_green, upper_green)
    mask = cv2.bitwise_not(mask)

    #cv2.imwrite('mask.png', mask)
    show_result('mask', mask, 0)
    cv2.destroyAllWindows()

    您可以轻松找到有关使用 OpenCV 进行 HSV 颜色操作的教程。我不会详细介绍这里使用的功能,但有一部分很重要。图像操作一般在 RGB 颜色空间中完成,其中包含红色、绿色和蓝色分量。然而,HSV 更像是人类视觉系统,它包含色调、饱和度和值分量。您可以找到 conversion here .由于我们根据感知来分离颜色,因此 HSV 更适合此任务。

    关键部分是适本地选择阈值。我通过检查选择了大约 80 的色调(最大 180),以及高于 200 和 100 的饱和度和值(最大 255)。您可以通过以下几行打印特定像素的值:

    rows,cols,channels = hsv.shape
    print(hsv[row, column])

    请注意,原点是左上角。

    结果如下: mask.png

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

    for i in range(1, 100):
    img = imread(str(i) + '.jpg')

    def mouse_callback(event, x, y, flags, params):
    if event == cv2.EVENT_LBUTTONDOWN:
    row = y
    column = x
    print(row, column)

    winname = 'img'
    cv2.namedWindow(winname)
    cv2.setMouseCallback(winname, mouse_callback)

    请记住, show_result函数按比例因子调整图像大小。

    如果你不想处理像素位置,而是想要平滑的结果,你可以申请 morphological transformations .特别是打开和关闭将完成工作。

    kernel = np.ones((11,11), np.uint8)
    opened = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    closed = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    开放结果(内核=11x11): opened.png

    关于image - 如何批量处理色度关键照片(屏蔽绿屏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60491901/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com