Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv_contrib
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv_contrib
Commits
b74c25da
Commit
b74c25da
authored
May 23, 2017
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1176 from vpisarev:anisodiff
parents
f78bb2c4
b885d28c
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
190 additions
and
0 deletions
+190
-0
ximgproc.hpp
modules/ximgproc/include/opencv2/ximgproc.hpp
+21
-0
filterdemo.cpp
modules/ximgproc/samples/filterdemo.cpp
+105
-0
anisodiff.cpp
modules/ximgproc/src/anisodiff.cpp
+0
-0
anisodiff.cl
modules/ximgproc/src/opencl/anisodiff.cl
+39
-0
test_anisodiff.cpp
modules/ximgproc/test/test_anisodiff.cpp
+25
-0
No files found.
modules/ximgproc/include/opencv2/ximgproc.hpp
View file @
b74c25da
...
...
@@ -122,6 +122,27 @@ The function transforms a binary blob image into a skeletized form using the tec
*/
CV_EXPORTS_W
void
thinning
(
InputArray
src
,
OutputArray
dst
,
int
thinningType
=
THINNING_ZHANGSUEN
);
/** @brief Performs anisotropic diffusian on an image.
The function applies Perona-Malik anisotropic diffusion to an image. This is the solution to the partial differential equation:
\f[{\frac {\partial I}{\partial t}}={\mathrm {div}}\left(c(x,y,t)\nabla I\right)=\nabla c\cdot \nabla I+c(x,y,t)\Delta I\f]
Suggested functions for c(x,y,t) are:
\f[c\left(\|\nabla I\|\right)=e^{{-\left(\|\nabla I\|/K\right)^{2}}}\f]
or
\f[ c\left(\|\nabla I\|\right)={\frac {1}{1+\left({\frac {\|\nabla I\|}{K}}\right)^{2}}} \f]
@param src Grayscale Source image.
@param dst Destination image of the same size and the same number of channels as src .
@param alpha The amount of time to step forward by on each iteration (normally, it's between 0 and 1).
@param K sensitivity to the edges
@param niters The number of iterations
*/
CV_EXPORTS_W
void
anisotropicDiffusion
(
InputArray
src
,
OutputArray
dst
,
float
alpha
,
float
K
,
int
niters
);
//! @}
...
...
modules/ximgproc/samples/filterdemo.cpp
0 → 100644
View file @
b74c25da
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2017, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/ximgproc.hpp"
#include <stdio.h>
using
namespace
cv
;
using
namespace
std
;
int
main
(
int
argc
,
const
char
**
argv
)
{
float
alpha
=
1.0
f
;
float
sigma
=
0.02
f
;
int
rows0
=
480
;
int
niters
=
10
;
Mat
frame
,
src
,
dst
;
const
char
*
window_name
=
"Anisodiff : Exponential Flux"
;
VideoCapture
cap
;
if
(
argc
>
1
)
cap
.
open
(
argv
[
1
]);
else
cap
.
open
(
0
);
if
(
!
cap
.
isOpened
())
{
printf
(
"Cannot initialize video capturing
\n
"
);
return
0
;
}
// Create a window
namedWindow
(
window_name
,
1
);
// create a toolbar
createTrackbar
(
"No. of time steps"
,
window_name
,
&
niters
,
30
,
0
);
for
(;;)
{
cap
>>
frame
;
if
(
frame
.
empty
()
)
break
;
if
(
frame
.
rows
<=
rows0
)
src
=
frame
;
else
resize
(
frame
,
src
,
Size
(
cvRound
(
480.
*
frame
.
cols
/
frame
.
rows
),
480
));
float
t
=
(
float
)
getTickCount
();
ximgproc
::
anisotropicDiffusion
(
src
,
dst
,
alpha
,
sigma
,
niters
);
t
=
(
float
)
getTickCount
()
-
t
;
printf
(
"time: %.1fms
\n
"
,
t
*
1000.
/
getTickFrequency
());
imshow
(
window_name
,
dst
);
// Wait for a key stroke; the same function arranges events processing
char
c
=
(
char
)
waitKey
(
30
);
if
(
c
>=
0
)
break
;
}
return
0
;
}
modules/ximgproc/src/anisodiff.cpp
0 → 100644
View file @
b74c25da
This diff is collapsed.
Click to expand it.
modules/ximgproc/src/opencl/anisodiff.cl
0 → 100644
View file @
b74c25da
__kernel
void
anisodiff
(
__global
const
uchar
*
srcptr,
int
srcstep,
int
srcoffset,
__global
uchar
*
dstptr,
int
dststep,
int
dstoffset,
int
rows,
int
cols,
__constant
float*
exptab,
float
alpha
)
{
int
x
=
get_global_id
(
0
)
;
int
y
=
get_global_id
(
1
)
;
if
(
x
<
cols
&&
y
<
rows
)
{
int
yofs
=
y*dststep
+
x*3
;
int
xofs
=
y*srcstep
+
x*3
;
float4
s
=
0.f
;
float4
c
=
(
float4
)(
srcptr[xofs],
srcptr[xofs+1],
srcptr[xofs+2],
0.f
)
;
float4
delta,
adelta
;
float
w
;
#
define
UPDATE_SUM
(
xofs1
)
\
delta
=
(
float4
)(
srcptr[xofs
+
xofs1],
srcptr[xofs
+
xofs1
+
1],
srcptr[xofs
+
xofs1
+
2],
0.f
)
-
c
; \
adelta
=
fabs
(
delta
)
; \
w
=
exptab[convert_int
(
adelta.x
+
adelta.y
+
adelta.z
)
]
; \
s
+=
delta*w
UPDATE_SUM
(
3
)
;
UPDATE_SUM
(
-3
)
;
UPDATE_SUM
(
-srcstep-3
)
;
UPDATE_SUM
(
-srcstep
)
;
UPDATE_SUM
(
-srcstep+3
)
;
UPDATE_SUM
(
srcstep-3
)
;
UPDATE_SUM
(
srcstep
)
;
UPDATE_SUM
(
srcstep+3
)
;
s
=
s*alpha
+
c
;
uchar4
d
=
convert_uchar4_sat
(
convert_int4_rte
(
s
))
;
dstptr[yofs]
=
d.x
;
dstptr[yofs+1]
=
d.y
;
dstptr[yofs+2]
=
d.z
;
}
}
modules/ximgproc/test/test_anisodiff.cpp
0 → 100644
View file @
b74c25da
#include "test_precomp.hpp"
using
namespace
cv
;
using
namespace
std
;
TEST
(
ximgproc_AnisotropicDiffusion
,
regression
)
{
string
folder
=
string
(
cvtest
::
TS
::
ptr
()
->
get_data_path
())
+
"cv/shared/"
;
string
original_path
=
folder
+
"fruits.png"
;
Mat
original
=
imread
(
original_path
,
IMREAD_COLOR
);
ASSERT_FALSE
(
original
.
empty
())
<<
"Could not load input image "
<<
original_path
;
ASSERT_EQ
(
3
,
original
.
channels
())
<<
"Load color input image "
<<
original_path
;
Mat
result
;
float
alpha
=
1.0
f
;
float
K
=
0.02
f
;
int
niters
=
10
;
ximgproc
::
anisotropicDiffusion
(
original
,
result
,
alpha
,
K
,
niters
);
double
adiff_psnr
=
cvtest
::
PSNR
(
original
,
result
);
//printf("psnr=%.2f\n", adiff_psnr);
ASSERT_GT
(
adiff_psnr
,
25.0
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment