Есть ли правильный способ для сегментации скал? - PullRequest
0 голосов
/ 29 мая 2019

Я работаю с Сегментацией горных пород и использую алгоритм сегментации изображений с помощью водораздела из Opencv (https://opencv -python-tutroals.readthedocs.io / en / latest / py_tutorials / py_imgproc / py_watershed / py_watershed).html ).

В качестве некоторого фона на моем входе я получаю изображение глубины в качестве входного изображения и должен выполнить его сегментацию.

Я попытался изменить ядра длялапласиан.Я сделал несколько изменений в коде.cv :: adaptivethreshhold, кажется, показывает лучше, чем cv :: threshold в моем случае.Даже смена ядер не улучшает результат.Следовательно, я оставил ядра без изменений.Я также сослался на вопросы, относящиеся к моей проблеме: -> Повышение резкости изображения с использованием фильтра Лапласа -> Как выполнить сегментацию на сложных изображениях, таких как камни (на с ++)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...