summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/image_transforms/edge_detector.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/image_transforms/edge_detector.h')
-rw-r--r--ml/dlib/dlib/image_transforms/edge_detector.h302
1 files changed, 0 insertions, 302 deletions
diff --git a/ml/dlib/dlib/image_transforms/edge_detector.h b/ml/dlib/dlib/image_transforms/edge_detector.h
deleted file mode 100644
index 2fa898fed..000000000
--- a/ml/dlib/dlib/image_transforms/edge_detector.h
+++ /dev/null
@@ -1,302 +0,0 @@
-// Copyright (C) 2008 Davis E. King (davis@dlib.net)
-// License: Boost Software License See LICENSE.txt for the full license.
-#ifndef DLIB_EDGE_DETECTOr_
-#define DLIB_EDGE_DETECTOr_
-
-#include "edge_detector_abstract.h"
-#include "../pixel.h"
-#include "../array2d.h"
-
-namespace dlib
-{
-
-// ----------------------------------------------------------------------------------------
-
- template <
- typename T
- >
- inline char edge_orientation (
- const T& x_,
- const T& y_
- )
- {
-
- // if this is a perfectly horizontal gradient then return right away
- if (x_ == 0)
- {
- return '|';
- }
- else if (y_ == 0) // if this is a perfectly vertical gradient then return right away
- {
- return '-';
- }
-
- // Promote x so that when we multiply by 128 later we know overflow won't happen.
- typedef typename promote<T>::type type;
- type x = x_;
- type y = y_;
-
- if (x < 0)
- {
- x = -x;
- if (y < 0)
- {
- y = -y;
- x *= 128;
- const type temp = x/y;
- if (temp > 309)
- return '-';
- else if (temp > 53)
- return '/';
- else
- return '|';
- }
- else
- {
- x *= 128;
- const type temp = x/y;
- if (temp > 309)
- return '-';
- else if (temp > 53)
- return '\\';
- else
- return '|';
- }
- }
- else
- {
- if (y < 0)
- {
- y = -y;
- x *= 128;
-
- const type temp = x/y;
- if (temp > 309)
- return '-';
- else if (temp > 53)
- return '\\';
- else
- return '|';
- }
- else
- {
- x *= 128;
-
- const type temp = x/y;
- if (temp > 309)
- return '-';
- else if (temp > 53)
- return '/';
- else
- return '|';
- }
- }
-
- }
-
-// ----------------------------------------------------------------------------------------
-
- template <
- typename in_image_type,
- typename out_image_type
- >
- void sobel_edge_detector (
- const in_image_type& in_img_,
- out_image_type& horz_,
- out_image_type& vert_
- )
- {
- typedef typename image_traits<out_image_type>::pixel_type pixel_type;
- COMPILE_TIME_ASSERT(pixel_traits<pixel_type>::is_unsigned == false);
- DLIB_ASSERT( !is_same_object(in_img_,horz_) && !is_same_object(in_img_,vert_) &&
- !is_same_object(horz_,vert_),
- "\tvoid sobel_edge_detector(in_img_, horz_, vert_)"
- << "\n\t You can't give the same image as more than one argument"
- << "\n\t is_same_object(in_img_,horz_): " << is_same_object(in_img_,horz_)
- << "\n\t is_same_object(in_img_,vert_): " << is_same_object(in_img_,vert_)
- << "\n\t is_same_object(horz_,vert_): " << is_same_object(horz_,vert_)
- );
-
-
- const int vert_filter[3][3] = {{-1,-2,-1},
- {0,0,0},
- {1,2,1}};
- const int horz_filter[3][3] = { {-1,0,1},
- {-2,0,2},
- {-1,0,1}};
-
- const long M = 3;
- const long N = 3;
-
-
- const_image_view<in_image_type> in_img(in_img_);
- image_view<out_image_type> horz(horz_);
- image_view<out_image_type> vert(vert_);
-
- horz.set_size(in_img.nr(),in_img.nc());
- vert.set_size(in_img.nr(),in_img.nc());
-
- assign_border_pixels(horz,1,1,0);
- assign_border_pixels(vert,1,1,0);
-
- // figure out the range that we should apply the filter to
- const long first_row = M/2;
- const long first_col = N/2;
- const long last_row = in_img.nr() - M/2;
- const long last_col = in_img.nc() - N/2;
-
-
- // apply the filter to the image
- for (long r = first_row; r < last_row; ++r)
- {
- for (long c = first_col; c < last_col; ++c)
- {
- typedef typename pixel_traits<typename image_traits<in_image_type>::pixel_type>::basic_pixel_type bp_type;
-
- typename promote<bp_type>::type p, horz_temp, vert_temp;
- horz_temp = 0;
- vert_temp = 0;
- for (long m = 0; m < M; ++m)
- {
- for (long n = 0; n < N; ++n)
- {
- // pull out the current pixel and put it into p
- p = get_pixel_intensity(in_img[r-M/2+m][c-N/2+n]);
-
- horz_temp += p*horz_filter[m][n];
- vert_temp += p*vert_filter[m][n];
- }
- }
-
- assign_pixel(horz[r][c] , horz_temp);
- assign_pixel(vert[r][c] , vert_temp);
-
- }
- }
- }
-
-// ----------------------------------------------------------------------------------------
-
- namespace impl
- {
- template <typename T>
- typename promote<T>::type square (const T& a)
- {
- return static_cast<T>(a)*static_cast<T>(a);
- }
- }
-
- template <
- typename in_image_type,
- typename out_image_type
- >
- void suppress_non_maximum_edges (
- const in_image_type& horz_,
- const in_image_type& vert_,
- out_image_type& out_img_
- )
- {
- const_image_view<in_image_type> horz(horz_);
- const_image_view<in_image_type> vert(vert_);
- image_view<out_image_type> out_img(out_img_);
-
- COMPILE_TIME_ASSERT(is_signed_type<typename image_traits<in_image_type>::pixel_type>::value);
- DLIB_ASSERT( horz.nr() == vert.nr() && horz.nc() == vert.nc(),
- "\tvoid suppress_non_maximum_edges(horz, vert, out_img)"
- << "\n\tYou have to give horz and vert gradient images that are the same size"
- << "\n\thorz.nr(): " << horz.nr()
- << "\n\thorz.nc(): " << horz.nc()
- << "\n\tvert.nr(): " << vert.nr()
- << "\n\tvert.nc(): " << vert.nc()
- );
- DLIB_ASSERT( !is_same_object(out_img_,horz_) && !is_same_object(out_img_,vert_),
- "\tvoid suppress_non_maximum_edges(horz_, vert_, out_img_)"
- << "\n\t out_img can't be the same as one of the input images."
- << "\n\t is_same_object(out_img_,horz_): " << is_same_object(out_img_,horz_)
- << "\n\t is_same_object(out_img_,vert_): " << is_same_object(out_img_,vert_)
- );
-
- using std::min;
- using std::abs;
-
-
- // if there isn't any input image then don't do anything
- if (horz.size() == 0)
- {
- out_img.clear();
- return;
- }
-
- out_img.set_size(horz.nr(),horz.nc());
-
- zero_border_pixels(out_img,1,1);
-
- // now do non maximum suppression while we copy the
- const long M = 3;
- const long N = 3;
-
- // figure out the range that we should apply the filter to
- const long first_row = M/2;
- const long first_col = N/2;
- const long last_row = horz.nr() - M/2;
- const long last_col = horz.nc() - N/2;
-
-
- // apply the filter to the image
- for (long r = first_row; r < last_row; ++r)
- {
- for (long c = first_col; c < last_col; ++c)
- {
- typedef typename promote<typename image_traits<in_image_type>::pixel_type>::type T;
- const T y = horz[r][c];
- const T x = vert[r][c];
-
- using impl::square;
-
- const T val = square(horz[r][c]) + square(vert[r][c]);
-
- const char ori = edge_orientation(x,y);
- const unsigned char zero = 0;
- switch (ori)
- {
- case '-':
- if (square(horz[r-1][c])+square(vert[r-1][c]) > val || square(horz[r+1][c]) + square(vert[r+1][c]) > val)
- assign_pixel(out_img[r][c] , zero);
- else
- assign_pixel(out_img[r][c] , std::sqrt((double)val));
- break;
-
- case '|':
- if (square(horz[r][c-1]) + square(vert[r][c-1]) > val || square(horz[r][c+1]) + square(vert[r][c+1]) > val)
- assign_pixel(out_img[r][c] , zero);
- else
- assign_pixel(out_img[r][c] , std::sqrt((double)val));
- break;
-
- case '/':
- if (square(horz[r-1][c-1]) + square(vert[r-1][c-1]) > val || square(horz[r+1][c+1]) + square(vert[r+1][c+1]) > val)
- assign_pixel(out_img[r][c] , zero);
- else
- assign_pixel(out_img[r][c] , std::sqrt((double)val));
- break;
-
- case '\\':
- if (square(horz[r+1][c-1]) + square(vert[r+1][c-1]) > val || square(horz[r-1][c+1]) + square(vert[r-1][c+1]) > val)
- assign_pixel(out_img[r][c] , zero);
- else
- assign_pixel(out_img[r][c] , std::sqrt((double)val));
- break;
-
- }
- }
- }
- }
-
-// ----------------------------------------------------------------------------------------
-
-}
-
-#endif // DLIB_EDGE_DETECTOr_
-
-
-