This project shows a possible way of finding contour lines on maps. These properties of the contour lines are considered here:

- contour lines are closed or they end at the edges of the map,
- in some sections more neighbor contour lines are nearly parallel,
- they are mainly slightly curved only (the lines do not have large angles like roads or buildings).

The algorithm uses the *OpenCV* library.

**Functions used**: cv::medianBlur, cv::Sobel, cv::magnitude

## The process

- Image preprocessing – using median blur
cv::Mat bl; cv::medianBlur(input, bl, params_.medianBlurKSize);

- Detecting lines and their directions – using Sobel filter (magnitudes are obtained using the magnitude function and directions are computed using atan2 from horizontal and vertical gradients)
cv::Mat_<double> grad_x; cv::Sobel(beforeSobel, grad_x, CV_64F, 1, 0, params_.sobelKSize); cv::Sobel(beforeSobel, grad_y, CV_64F, 0, 1, params_.sobelKSize);

- Finding some contour line seeds – points at lines with approximately equal directions.
cv::Mat_<double> magnitude; cv::magnitude(grad_x, grad_y, magnitude);

- Tracing lines beginning at the seeds – we are going from each seed to both directions to find the line while checking if the curves do not exceed a threshold (the more curved lines are probably not the contour lines).
- Filtering of the traced lines – only the lines having both ends at the image boundaries or the closed lines are considered as the map contour lines.

The result image shows a map with some contour lines detected. The seeds and line points are marked as follows:

*yellow*– seed points*red*– closed line points*green*– points of the first part of a line ending at the image edge*blue*– points of the second part of a line ending at the image edge

## Problems and possible improvements

These algorithm properties cause problems and need to be considered in the algorithm improvements:

- line intersections are not being detected – one line from each pair of the intersecting lines should always be removed,
- the algorithm uses a global magnitude threshold (the threshold determines if a point belongs to a line), but the line intensities change in most images,
- the algorithm has too many parameters which were not generalized to match more possible images,
- some contour lines are not continuous (they are splitted by labels) and thus not being detected by the algorithm.