这是我想出的方法:
cv::Mat im; //Already loaded
cv::Mat grey;
cv::cvtColor(im, grey, CV_BGR2GRAY);
cv::Mat binary;
cv::threshold(grey, binary, 0, 255, cv::THRESH_OTSU);
//Create a mask of the hand region
cv::Mat mask;
cv::Mat kern = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(20,20)); //Large kernel to remove all interior detail
cv::morphologyEx(binary, mask, cv::MORPH_OPEN, kern);
cv::threshold(mask, mask, 128, 255, cv::THRESH_BINARY_INV); //Invert colors
cv::imshow("", mask);
//Remove thin lines
cv::Mat blurred;
cv::GaussianBlur(grey, blurred, cv::Size(9,9), 0);
cv::threshold(blurred, binary, 0, 255, cv::THRESH_OTSU);
cv::morphologyEx(binary, binary, cv::MORPH_OPEN, cv::noArray());
cv::Mat result;
binary.copyTo(result, mask);
结果如下:
蒙版边缘存在一些伪影,可以通过使用更复杂的蒙版方法进行补救。模糊和形态学操作的内核大小显然可以针对不同的细节级别进行修改。