有没有适当的方法来进行岩石分割?

时间:2019-05-29 10:07:33

标签: opencv

我处理岩石分割,并一直使用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);

感谢您提出任何有价值的建议,以便对结果进行更好的细分。

Result for above code

0 个答案:

没有答案