Я работаю с Сегментацией горных пород и использую алгоритм сегментации изображений с помощью водораздела из 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);
Любое ценное предложение оценивается для лучшей сегментации результата.