Edge Smoothing and filling inner contours in openc

2019-03-22 07:16发布

问题:

I am trying to tan human skin with different intensity with help of opencv. I have already identified human skin and changing color tone of those pixels. But it is not smooth.

Top left - original image Top right - saturation channel of original image Bottom left - Gray scale mask identifying locations of skin on original image Bottom right - result image with color tone changed of pixels located in mask.

Now my problem is that, in mask image some gap is left because of variation on color tone or brightness in original image. And that is why those portion is missed in result image. Can anyone tell me how can I fill the small gaps in mask image?

Another if someone can help me out for smoothing only edges of my tanned mask will help me a lot. See the reference image below,

Thanks in advance.

回答1:

how about?

morphologyEx(grey,grey,MORPH_CLOSE,getStructuringElement( MORPH_ELLIPSE,Size(7,7)));

although the silhouette gets merged for the left hand

edit:slightly more involved

Mat tmp=grey.clone();
morphologyEx(tmp,tmp,MORPH_GRADIENT,getStructuringElement(MORPH_ELLIPSE,Size(3,3)));
bitwise_not(tmp,tmp);
Mat smallholes=Mat::zeros(tmp.size(), CV_8UC1);
vector<vector<Point>> contours;
findContours(tmp,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for(int i = 0; i < contours.size(); i++)
{       
    double area = contourArea(Mat(contours[i]));
    if(area<100)
        drawContours(smallholes, contours, i, 255, -1);
}
Mat done;
bitwise_or(grey,smallholes,done);
morphologyEx(done,done,MORPH_CLOSE,getStructuringElement(MORPH_ELLIPSE,Size(3,3)));