Anjum Shrimali
Anjum Shrimali

Reputation: 346

Edge Smoothing and filling inner contours in opencv with iOS

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.

ScreenShot 1

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?

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,

Sharp tanned mask edge

Thanks in advance.

Upvotes: 2

Views: 6744

Answers (1)

Zaw Lin
Zaw Lin

Reputation: 5708

how about?

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

although the silhouette gets merged for the left hand

simple

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)));

long

Upvotes: 4

Related Questions