我处理岩石分割,并一直使用Opencv(https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_watershed/py_watershed.html)的带分水岭算法的图像分割。
作为输入的某些背景,我获得了深度图作为输入图,并且需要对其进行分割。
我试图为Laplacian更改内核。 我对代码做了一些调整。在我的情况下,cv :: adaptivethreshhold似乎比cv :: threshold更好。 即使更改内核也不能改善结果。因此,我保持内核不变。 我还提到了有关我的探针的问题: -> Image Sharpening Using Laplacian Filter -> How to perform segmentation on complex images like rocks (in c++)
const cv::Mat image = rrlib::coviroa::AccessImageAsMat(*in_depth_img);
cv::Mat depth_img_opencv;
cv::extractChannel(image, depth_img_opencv,0);
cv::Mat dst;
cv::resize(depth_img_opencv,dst, cv::Size(image.cols*3,image.rows*3));
cv::imshow("Depth Image", dst);
cv::waitKey(200);
cv::Mat src;
cv::cvtColor(depth_img_opencv, src,cv::COLOR_GRAY2BGR);
cv:: Mat dst1;
cv::resize(src, dst1, cv::Size(image.cols*3,image.rows*3));
cv::imshow("Color Image", dst1);
cv::waitKey(200);
cv::Mat kernel = (cv::Mat_<float>(3,3) <<
1, 1, 1,
1, -8, 1,
1, 1, 1);
cv::Mat imgLaplacian;
cv::Mat sharp = src;
cv::filter2D(sharp, imgLaplacian, CV_32F, kernel);
src.convertTo(sharp, CV_32F);
cv::Mat imgResult = sharp - imgLaplacian;
imgResult.convertTo(imgResult, CV_8UC3);
src = imgResult;
cv:: Mat dst2;
cv::resize(src, dst2, cv::Size(image.cols*3,image.rows*3));
cv::imshow("Sharpened Image", dst2);
cv::waitKey(200);
cv::Mat bw;
cv::cvtColor(src, bw, CV_BGR2GRAY);
cv::imshow("BGR2GRAY", bw);
cv::waitKey(200);
cv::adaptiveThreshold(bw, bw, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C , CV_THRESH_BINARY, 7, 0);
cv:: Mat dst3;
cv::resize(bw, dst3, cv::Size(image.cols*3,image.rows*3));
cv::imshow("Binary Image", dst3);
cv::waitKey(200);
cv::Mat dist;
cv::distanceTransform(bw, dist, CV_DIST_L2, 3);
cv::normalize(dist, dist, 0, 1., cv::NORM_MINMAX);
cv:: Mat dst4;
cv::resize(dist, dst4, cv::Size(image.cols*3,image.rows*3));
cv::imshow("Distance Transform", dst4);
cv::waitKey(200);
// Threshold to obtain the peaks
dist.convertTo(dist, CV_8UC1);
cv::adaptiveThreshold(dist, dist, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 0);
// Dilate a bit the dist image
cv::Mat kernel1 = cv::Mat::ones(3, 3, CV_8UC1);
// Thickens obects in an image
cv::dilate(dist, dist, kernel1);
cv:: Mat dst5;
cv::resize(dist, dst5, cv::Size(image.cols*3,image.rows*3));
cv::imshow("Peaks", dst5);
cv::waitKey(200);
感谢您提出任何有价值的建议,以便对结果进行更好的细分。