Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
51195645
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
51195645
编写于
8月 12, 2014
作者:
V
Vadim Pisarevsky
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3033 from nathanjackson:clahe_datatypes
上级
da806cc3
563200fb
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
42 addition
and
30 deletion
+42
-30
modules/imgproc/src/clahe.cpp
modules/imgproc/src/clahe.cpp
+42
-30
未找到文件。
modules/imgproc/src/clahe.cpp
浏览文件 @
51195645
...
...
@@ -126,10 +126,11 @@ namespace clahe
namespace
{
template
<
class
T
,
int
histSize
,
int
shift
>
class
CLAHE_CalcLut_Body
:
public
cv
::
ParallelLoopBody
{
public:
CLAHE_CalcLut_Body
(
const
cv
::
Mat
&
src
,
c
v
::
Mat
&
lut
,
cv
::
Size
tileSize
,
int
tilesX
,
int
clipLimit
,
float
lutScale
)
:
CLAHE_CalcLut_Body
(
const
cv
::
Mat
&
src
,
c
onst
cv
::
Mat
&
lut
,
const
cv
::
Size
&
tileSize
,
const
int
&
tilesX
,
const
int
&
clipLimit
,
const
float
&
lutScale
)
:
src_
(
src
),
lut_
(
lut
),
tileSize_
(
tileSize
),
tilesX_
(
tilesX
),
clipLimit_
(
clipLimit
),
lutScale_
(
lutScale
)
{
}
...
...
@@ -146,12 +147,11 @@ namespace
float
lutScale_
;
};
void
CLAHE_CalcLut_Body
::
operator
()(
const
cv
::
Range
&
range
)
const
template
<
class
T
,
int
histSize
,
int
shift
>
void
CLAHE_CalcLut_Body
<
T
,
histSize
,
shift
>::
operator
()(
const
cv
::
Range
&
range
)
const
{
const
int
histSize
=
256
;
uchar
*
tileLut
=
lut_
.
ptr
(
range
.
start
);
const
size_t
lut_step
=
lut_
.
step
;
T
*
tileLut
=
lut_
.
ptr
<
T
>
(
range
.
start
);
const
size_t
lut_step
=
lut_
.
step
/
sizeof
(
T
);
for
(
int
k
=
range
.
start
;
k
<
range
.
end
;
++
k
,
tileLut
+=
lut_step
)
{
...
...
@@ -173,20 +173,20 @@ namespace
int
tileHist
[
histSize
]
=
{
0
,
};
int
height
=
tileROI
.
height
;
const
size_t
sstep
=
tile
.
step
;
for
(
const
uchar
*
ptr
=
tile
.
ptr
<
uchar
>
(
0
);
height
--
;
ptr
+=
sstep
)
const
size_t
sstep
=
src_
.
step
/
sizeof
(
T
)
;
for
(
const
T
*
ptr
=
tile
.
ptr
<
T
>
(
0
);
height
--
;
ptr
+=
sstep
)
{
int
x
=
0
;
for
(;
x
<=
tileROI
.
width
-
4
;
x
+=
4
)
{
int
t0
=
ptr
[
x
],
t1
=
ptr
[
x
+
1
];
tileHist
[
t0
]
++
;
tileHist
[
t1
]
++
;
tileHist
[
t0
>>
shift
]
++
;
tileHist
[
t1
>>
shift
]
++
;
t0
=
ptr
[
x
+
2
];
t1
=
ptr
[
x
+
3
];
tileHist
[
t0
]
++
;
tileHist
[
t1
]
++
;
tileHist
[
t0
>>
shift
]
++
;
tileHist
[
t1
>>
shift
]
++
;
}
for
(;
x
<
tileROI
.
width
;
++
x
)
tileHist
[
ptr
[
x
]]
++
;
tileHist
[
ptr
[
x
]
>>
shift
]
++
;
}
// clip histogram
...
...
@@ -221,15 +221,16 @@ namespace
for
(
int
i
=
0
;
i
<
histSize
;
++
i
)
{
sum
+=
tileHist
[
i
];
tileLut
[
i
]
=
cv
::
saturate_cast
<
uchar
>
(
sum
*
lutScale_
);
tileLut
[
i
]
=
cv
::
saturate_cast
<
T
>
(
sum
*
lutScale_
);
}
}
}
template
<
class
T
>
class
CLAHE_Interpolation_Body
:
public
cv
::
ParallelLoopBody
{
public:
CLAHE_Interpolation_Body
(
const
cv
::
Mat
&
src
,
c
v
::
Mat
&
dst
,
const
cv
::
Mat
&
lut
,
cv
::
Size
tileSize
,
int
tilesX
,
int
tilesY
)
:
CLAHE_Interpolation_Body
(
const
cv
::
Mat
&
src
,
c
onst
cv
::
Mat
&
dst
,
const
cv
::
Mat
&
lut
,
const
cv
::
Size
&
tileSize
,
const
int
&
tilesX
,
const
int
&
tilesY
)
:
src_
(
src
),
dst_
(
dst
),
lut_
(
lut
),
tileSize_
(
tileSize
),
tilesX_
(
tilesX
),
tilesY_
(
tilesY
)
{
}
...
...
@@ -246,14 +247,15 @@ namespace
int
tilesY_
;
};
void
CLAHE_Interpolation_Body
::
operator
()(
const
cv
::
Range
&
range
)
const
template
<
class
T
>
void
CLAHE_Interpolation_Body
<
T
>::
operator
()(
const
cv
::
Range
&
range
)
const
{
const
size_t
lut_step
=
lut_
.
step
;
const
size_t
lut_step
=
lut_
.
step
/
sizeof
(
T
)
;
for
(
int
y
=
range
.
start
;
y
<
range
.
end
;
++
y
)
{
const
uchar
*
srcRow
=
src_
.
ptr
<
uchar
>
(
y
);
uchar
*
dstRow
=
dst_
.
ptr
<
uchar
>
(
y
);
const
T
*
srcRow
=
src_
.
ptr
<
T
>
(
y
);
T
*
dstRow
=
dst_
.
ptr
<
T
>
(
y
);
const
float
tyf
=
(
static_cast
<
float
>
(
y
)
/
tileSize_
.
height
)
-
0.5
f
;
...
...
@@ -265,8 +267,8 @@ namespace
ty1
=
std
::
max
(
ty1
,
0
);
ty2
=
std
::
min
(
ty2
,
tilesY_
-
1
);
const
uchar
*
lutPlane1
=
lut_
.
ptr
(
ty1
*
tilesX_
);
const
uchar
*
lutPlane2
=
lut_
.
ptr
(
ty2
*
tilesX_
);
const
T
*
lutPlane1
=
lut_
.
ptr
<
T
>
(
ty1
*
tilesX_
);
const
T
*
lutPlane2
=
lut_
.
ptr
<
T
>
(
ty2
*
tilesX_
);
for
(
int
x
=
0
;
x
<
src_
.
cols
;
++
x
)
{
...
...
@@ -292,7 +294,7 @@ namespace
res
+=
lutPlane2
[
ind1
]
*
((
1.0
f
-
xa
)
*
(
ya
));
res
+=
lutPlane2
[
ind2
]
*
((
xa
)
*
(
ya
));
dstRow
[
x
]
=
cv
::
saturate_cast
<
uchar
>
(
res
);
dstRow
[
x
]
=
cv
::
saturate_cast
<
T
>
(
res
);
}
}
}
...
...
@@ -340,13 +342,13 @@ namespace
void
CLAHE_Impl
::
apply
(
cv
::
InputArray
_src
,
cv
::
OutputArray
_dst
)
{
CV_Assert
(
_src
.
type
()
==
CV_8UC1
);
CV_Assert
(
_src
.
type
()
==
CV_8UC1
||
_src
.
type
()
==
CV_16UC1
);
#ifdef HAVE_OPENCL
bool
useOpenCL
=
cv
::
ocl
::
useOpenCL
()
&&
_src
.
isUMat
()
&&
_src
.
dims
()
<=
2
;
bool
useOpenCL
=
cv
::
ocl
::
useOpenCL
()
&&
_src
.
isUMat
()
&&
_src
.
dims
()
<=
2
&&
_src
.
type
()
==
CV_8UC1
;
#endif
const
int
histSize
=
25
6
;
int
histSize
=
_src
.
type
()
==
CV_8UC1
?
256
:
409
6
;
cv
::
Size
tileSize
;
cv
::
_InputArray
_srcForLut
;
...
...
@@ -394,13 +396,23 @@ namespace
_dst
.
create
(
src
.
size
(),
src
.
type
()
);
cv
::
Mat
dst
=
_dst
.
getMat
();
cv
::
Mat
srcForLut
=
_srcForLut
.
getMat
();
lut_
.
create
(
tilesX_
*
tilesY_
,
histSize
,
CV_8UC1
);
CLAHE_CalcLut_Body
calcLutBody
(
srcForLut
,
lut_
,
tileSize
,
tilesX_
,
clipLimit
,
lutScale
);
cv
::
parallel_for_
(
cv
::
Range
(
0
,
tilesX_
*
tilesY_
),
calcLutBody
);
CLAHE_Interpolation_Body
interpolationBody
(
src
,
dst
,
lut_
,
tileSize
,
tilesX_
,
tilesY_
);
cv
::
parallel_for_
(
cv
::
Range
(
0
,
src
.
rows
),
interpolationBody
);
lut_
.
create
(
tilesX_
*
tilesY_
,
histSize
,
_src
.
type
());
cv
::
Ptr
<
cv
::
ParallelLoopBody
>
calcLutBody
;
if
(
_src
.
type
()
==
CV_8UC1
)
calcLutBody
=
cv
::
makePtr
<
CLAHE_CalcLut_Body
<
uchar
,
256
,
0
>
>
(
srcForLut
,
lut_
,
tileSize
,
tilesX_
,
clipLimit
,
lutScale
);
else
if
(
_src
.
type
()
==
CV_16UC1
)
calcLutBody
=
cv
::
makePtr
<
CLAHE_CalcLut_Body
<
ushort
,
4096
,
4
>
>
(
srcForLut
,
lut_
,
tileSize
,
tilesX_
,
clipLimit
,
lutScale
);
CV_Assert
(
!
calcLutBody
.
empty
());
cv
::
parallel_for_
(
cv
::
Range
(
0
,
tilesX_
*
tilesY_
),
*
calcLutBody
);
cv
::
Ptr
<
cv
::
ParallelLoopBody
>
interpolationBody
;
if
(
_src
.
type
()
==
CV_8UC1
)
interpolationBody
=
cv
::
makePtr
<
CLAHE_Interpolation_Body
<
uchar
>
>
(
src
,
dst
,
lut_
,
tileSize
,
tilesX_
,
tilesY_
);
else
if
(
_src
.
type
()
==
CV_16UC1
)
interpolationBody
=
cv
::
makePtr
<
CLAHE_Interpolation_Body
<
ushort
>
>
(
src
,
dst
,
lut_
,
tileSize
,
tilesX_
,
tilesY_
);
CV_Assert
(
!
interpolationBody
.
empty
());
cv
::
parallel_for_
(
cv
::
Range
(
0
,
src
.
rows
),
*
interpolationBody
);
}
void
CLAHE_Impl
::
setClipLimit
(
double
clipLimit
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录