我正在进行一些图像处理,需要在images ::
中执行以下任务图片
从这里开始,我想去除眼睛,眉毛,嘴唇等,使图像的平滑度不会丢失(例如,如果眼睛被移除,那么该区域应该用相邻颜色替换。)
我有覆盖需要展平的部分(眼睛等)的区域的细节(点)。下面显示::
答案 0 :(得分:1)
如果您已经有想要替换的点或甚至更好的轮廓(如第二张图中以绿色绘制的那些),请查看inpaint
:http://docs.opencv.org/3.1.0/d1/d0d/group__photo.html#gaedd30dfa0214fec4c88138b51d678085
我认为这正是您所寻找的!请参阅此处以获取示例:https://en.wikipedia.org/wiki/Inpainting
程序非常简单:
drawContours
,厚度:CV_FILLED
),以便在各自的环境中进行修复/替换inpaint
戴着这个面具。我应该提一下,这只适用于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)