在openCV中删除图像的特定部分

时间:2017-06-07 05:37:45

标签: opencv image-processing

我正在进行一些图像处理,需要在images ::

中执行以下任务

图片

enter image description here

从这里开始,我想去除眼睛,眉毛,嘴唇等,使图像的平滑度不会丢失(例如,如果眼睛被移除,那么该区域应该用相邻颜色替换。)

我有覆盖需要展平的部分(眼睛等)的区域的细节(点)。下面显示::

enter image description here

2 个答案:

答案 0 :(得分:1)

如果您已经有想要替换的点或甚至更好的轮廓(如第二张图中以绿色绘制的那些),请查看inpainthttp://docs.opencv.org/3.1.0/d1/d0d/group__photo.html#gaedd30dfa0214fec4c88138b51d678085

我认为这正是您所寻找的!请参阅此处以获取示例:https://en.wikipedia.org/wiki/Inpainting

程序非常简单:

  1. 制作一个充满轮廓的面具(drawContours,厚度:CV_FILLED),以便在各自的环境中进行修复/替换
  2. inpaint戴着这个面具。
  3. 我应该提一下,这只适用于8位图像。

    以下(未经测试的)代码段应该这样做。

    Mat mask = Mat::zeros(img.size(), CV_8UC1);
    for (int i = 0; i < contours.size(); i++)
      drawContours(mask, contours, i, Scalar::all(255), CV_FILLED);
    Mat dst;
    double radius = 20;    
    inpaint(img, mask, dst, radius, INPAINT_NS);
    //inpaint(img, mask, dst, radius, INPAINT_TELEA);
    imshow("dst", dst);
    waitKey();
    

    编辑:制作几个点的轮廓: 轮廓只是点的矢量,打包到另一个矢量中。所以,解决方案应该是这样的,给定vector<Point> points

    vector<vector<Point> > contours;
    contours.push_back(points);
    drawContours(mask, contours, 0, Scalar::all(255), CV_FILLED);
    

答案 1 :(得分:1)

一个Python版本,使用简单的阈值来选择面部特征(因为我没有那些绿色轮廓),然后修复,如Phann的答案所述:

import cv2
import numpy as np

def get_inpainted(img):
    gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gs, 70, 1, cv2.THRESH_BINARY)
    mask_features = 1 - thresh #1 for the dark pixels, 0 everywhere else
    #enlarge the mask a little bit...
    mask_features = cv2.dilate(mask_features, np.ones((8, 8), np.uint8))
    return cv2.inpaint(img, mask_features, 8, cv2.INPAINT_NS)

img_source = cv2.imread("test_images/face.jpg")
img_dest = img_source[:]

#manually select two areas of interest
img_dest[158:276, 34:213] = get_inpainted(img_source[158:276, 34:213]) #eyebrows to nostrils
img_dest[278:343, 68:190] = get_inpainted(img_source[278:343, 68:190]) #mouth

cv2.imwrite("test_images/face_inp.jpg", img_dest)

所以我们把你的第一张照片(左)变成了一个不露面的可怕的家伙(右): enter image description here