mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 23:33:05 +04:00
Merge pull request #24234 from dkurt:distanceTransform_max_dist
Change max distance at distanceTransform #24234 ### Pull Request Readiness Checklist resolves https://github.com/opencv/opencv/issues/23895 related: https://github.com/opencv/opencv/pull/12278 * DIST_MASK_3 and DIST_MASK_5 maximal distance increased from 8192 to 65533 +/- 1 * Fix squares processing at DIST_MASK_PRECISE * - [ ] TODO: Check with IPP ```cpp cv::Mat gray = cv::imread("opencv/samples/data/stuff.jpg", cv::ImreadModes::IMREAD_GRAYSCALE); cv::Mat gray_resize; cv::resize(gray, gray_resize, cv::Size(70000,70000), 0.0, 0.0, cv::INTER_LINEAR); gray_resize = gray_resize >= 100; cv::Mat dist; cv::distanceTransform(gray_resize, dist, cv::DIST_L2, cv::DIST_MASK_5, CV_32F); double minVal, maxVal; minMaxLoc(dist, &minVal, &maxVal); dist = 255 * (dist - minVal) / (maxVal - minVal); std::cout << minVal << " " << maxVal << std::endl; cv::Mat dist_resize; cv::resize(dist, dist_resize, cv::Size(1024,1024), 0.0, 0.0, cv::INTER_LINEAR); cv::String outfilePath = "test_mask_5.png"; cv::imwrite(outfilePath, dist_resize); ``` mask | 4.x | PR | ----------|--------------|-------------- DIST_MASK_3 | <img src="https://github.com/opencv/opencv/assets/25801568/23e5de76-a8ba-4eb8-ab03-fa55672834be" width="128"> | <img src="https://github.com/opencv/opencv/assets/25801568/e1149f6a-49d6-47bd-a2a8-20bb7e4dafa4" width="128"> | DIST_MASK_5 | <img src="https://github.com/opencv/opencv/assets/25801568/98aba29b-8865-4b9a-8066-669b16d175c9" width="128"> | <img src="https://github.com/opencv/opencv/assets/25801568/54f62ed2-9ef6-485f-bd63-48cc96accd7d" width="128"> | DIST_MASK_PRECISE | <img src="https://github.com/opencv/opencv/assets/25801568/c4d79451-fd7a-461f-98fc-13060c63f473" width="128"> | <img src="https://github.com/opencv/opencv/assets/25801568/b5bfcaf5-bc48-40ba-b8e3-d000e5ab48db" width="128">| See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [x] The feature is well documented and sample code can be built with the project CMake
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include <numeric>
|
||||
|
||||
namespace opencv_test { namespace {
|
||||
|
||||
@@ -368,4 +369,51 @@ BIGDATA_TEST(Imgproc_DistanceTransform, issue_23895_5x5_labels)
|
||||
EXPECT_EQ(nz, 0);
|
||||
}
|
||||
|
||||
TEST(Imgproc_DistanceTransform, max_distance_3x3)
|
||||
{
|
||||
Mat src = Mat::ones(1, 70000, CV_8U), dist;
|
||||
src.at<uint8_t>(0, 0) = 0;
|
||||
distanceTransform(src, dist, DIST_L2, DIST_MASK_3);
|
||||
|
||||
double minVal, maxVal;
|
||||
minMaxLoc(dist, &minVal, &maxVal);
|
||||
EXPECT_GE(maxVal, 65533);
|
||||
}
|
||||
|
||||
TEST(Imgproc_DistanceTransform, max_distance_5x5)
|
||||
{
|
||||
Mat src = Mat::ones(1, 70000, CV_8U), dist;
|
||||
src.at<uint8_t>(0, 0) = 0;
|
||||
distanceTransform(src, dist, DIST_L2, DIST_MASK_5);
|
||||
|
||||
double minVal, maxVal;
|
||||
minMaxLoc(dist, &minVal, &maxVal);
|
||||
EXPECT_GE(maxVal, 65533);
|
||||
}
|
||||
|
||||
TEST(Imgproc_DistanceTransform, max_distance_5x5_labels)
|
||||
{
|
||||
Mat src = Mat::ones(1, 70000, CV_8U), dist, labels;
|
||||
src.at<uint8_t>(0, 0) = 0;
|
||||
distanceTransform(src, dist, labels, DIST_L2, DIST_MASK_5);
|
||||
|
||||
double minVal, maxVal;
|
||||
minMaxLoc(dist, &minVal, &maxVal);
|
||||
EXPECT_GE(maxVal, 65533);
|
||||
}
|
||||
|
||||
TEST(Imgproc_DistanceTransform, precise_long_dist)
|
||||
{
|
||||
static const int maxDist = 1 << 16;
|
||||
Mat src = Mat::ones(1, 70000, CV_8U), dist;
|
||||
src.at<uint8_t>(0, 0) = 0;
|
||||
distanceTransform(src, dist, DIST_L2, DIST_MASK_PRECISE, CV_32F);
|
||||
|
||||
Mat expected(src.size(), CV_32F);
|
||||
std::iota(expected.begin<float>(), expected.end<float>(), 0.f);
|
||||
expected.colRange(maxDist, expected.cols).setTo(maxDist);
|
||||
|
||||
EXPECT_EQ(cv::norm(expected, dist, NORM_INF), 0);
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
|
||||
Reference in New Issue
Block a user