繁体   English   中英

如何使用python和opencv互相减去两个图像?

[英]How do I subtract two images from each other using python and opencv?

这里的目的是从面部的原始图像中减去嘴巴。 现在,我知道了如何使用dlib和面部标志来修剪嘴巴(此脚本就是这样做的)。

问题是我如何修改原始图像,以便除了没有嘴巴外,其他图像都完全相同? 基本上我想把它剪掉。

predictor_path = "/home/victor/facial-landmarks/shape_predictor_68_face_landmarks.dat"
faces_folder_path = "/home/victor/TryImage/"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
i = 0
for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):
    print("Processing file: {}".format(f))
    img = cv2.imread(f)

    dets = detector(img, 1)
    print("Number of faces detected: {}".format(len(dets)))
    for k, d in enumerate(dets):
        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
            k, d.left(), d.top(), d.right(), d.bottom()))

    shape = predictor(img, d)
    i += 1

    xmouthpoints = [shape.part(x).x for x in range(48,68)]
    ymouthpoints = [shape.part(x).y for x in range(48,68)]
    maxx = max(xmouthpoints)
    minx = min(xmouthpoints)
    maxy = max(ymouthpoints)
    miny = min(ymouthpoints)

    pad = 10

    filename = os.path.splitext(os.path.basename(f))[0]

    crop_image = img[(miny-pad):(maxy+pad),(minx-pad):(maxx+pad)]
    img = cv2.subtract(img, crop_image)
    imshow(crop_image, 1)
    imshow(new_image, 1)

    cv2.imwrite(str(filename) + '.jpg',crop_image)

使用cv2.subtract会产生以下错误:错误:OpenCV(3.4.1)/io/opencv/modules/core/src/arithm.cpp:659:错误:(-209)该操作都不是'array op array'(其中数组具有相同的大小和相同的通道数),在函数arithm_op中也不是“ array op scalar”,也不是“ scalar op array”

我也考虑过使用图像减法,这可能吗?

即使它是黑色或白色的盒子或圆圈而不是嘴,也很完美。

注意:我会使用GIMP或Photoshop,但是我要处理成千上万的自拍照,因此这并不是一个选择。

谢谢 : )

我正在使用的图像附在此处。

我的自拍

如您的错误所述,OpenCV减去期望2个具有相同形状的图像。 在您的情况下,您给出一个较大的图像而较小的图像,OpenCV将如何知道要减去的较大图像部分?

再说一次,好像您要移开嘴巴,它的位置只有黑色像素。 您可以使用以下方法实现相同的结果:

cv2.rectangle(img, ((minx-pad), (miny-pad)), ((maxx-pad), (maxy-pad)), (0,0,0), -1)

甚至直接用numpy:

img[(miny-pad):(maxy+pad),(minx-pad):(maxx+pad)] = 0

或者如果您真的想使用减法:

crop_image = img[(miny-pad):(maxy+pad),(minx-pad):(maxx+pad)]
img[(miny-pad):(maxy+pad),(minx-pad):(maxx+pad)] = cv2.subtract(img[(miny-pad):(maxy+pad),(minx-pad):(maxx+pad)], crop_image)

在这最后一个中,您要告诉减法:完成后要减去图像的哪一部分以及将结果放在何处。 我会建议直接使用numpy的选项2。

如有疑问,请给我留言

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM