/
CLAHE.cs
154 lines (138 loc) · 4.05 KB
/
CLAHE.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using OpenCvSharp.Internal;
// ReSharper disable InconsistentNaming
// ReSharper disable IdentifierTypo
// ReSharper disable CommentTypo
namespace OpenCvSharp;
/// <summary>
/// Contrast Limited Adaptive Histogram Equalization
/// </summary>
public sealed class CLAHE : Algorithm
{
/// <summary>
/// cv::Ptr<CLAHE>
/// </summary>
private Ptr? ptrObj;
/// <summary>
///
/// </summary>
private CLAHE(IntPtr p)
{
ptrObj = new Ptr(p);
ptr = ptrObj.Get();
}
/// <summary>
/// Creates a predefined CLAHE object
/// </summary>
/// <param name="clipLimit"></param>
/// <param name="tileGridSize"></param>
/// <returns></returns>
public static CLAHE Create(double clipLimit = 40.0, Size? tileGridSize = null)
{
var tileGridSizeValue = tileGridSize.GetValueOrDefault(new Size(8, 8));
NativeMethods.HandleException(
NativeMethods.imgproc_createCLAHE(
clipLimit, tileGridSizeValue, out var ptr));
return new CLAHE(ptr);
}
/// <summary>
/// Releases managed resources
/// </summary>
protected override void DisposeManaged()
{
ptrObj?.Dispose();
ptrObj = null;
base.DisposeManaged();
}
/// <summary>
/// Equalizes the histogram of a grayscale image using Contrast Limited Adaptive Histogram Equalization.
/// </summary>
/// <param name="src">Source image of type CV_8UC1 or CV_16UC1.</param>
/// <param name="dst">Destination image.</param>
public void Apply(InputArray src, OutputArray dst)
{
ThrowIfDisposed();
if (src is null)
throw new ArgumentNullException(nameof(src));
if (dst is null)
throw new ArgumentNullException(nameof(dst));
src.ThrowIfDisposed();
dst.ThrowIfNotReady();
NativeMethods.HandleException(
NativeMethods.imgproc_CLAHE_apply(ptr, src.CvPtr, dst.CvPtr));
dst.Fix();
GC.KeepAlive(this);
GC.KeepAlive(src);
GC.KeepAlive(dst);
}
/// <summary>
/// Gets or sets threshold for contrast limiting.
/// </summary>
public double ClipLimit
{
get
{
ThrowIfDisposed();
NativeMethods.HandleException(
NativeMethods.imgproc_CLAHE_getClipLimit(ptr, out var ret));
GC.KeepAlive(this);
return ret;
}
set
{
ThrowIfDisposed();
NativeMethods.HandleException(
NativeMethods.imgproc_CLAHE_setClipLimit(ptr, value));
GC.KeepAlive(this);
}
}
/// <summary>
/// Gets or sets size of grid for histogram equalization. Input image will be divided into equally sized rectangular tiles.
/// </summary>
public Size TilesGridSize
{
get
{
ThrowIfDisposed();
NativeMethods.HandleException(
NativeMethods.imgproc_CLAHE_getTilesGridSize(ptr, out var ret));
GC.KeepAlive(this);
return ret;
}
set
{
ThrowIfDisposed();
NativeMethods.HandleException(
NativeMethods.imgproc_CLAHE_setTilesGridSize(ptr, value));
GC.KeepAlive(this);
}
}
/// <summary>
///
/// </summary>
public void CollectGarbage()
{
ThrowIfDisposed();
NativeMethods.HandleException(
NativeMethods.imgproc_CLAHE_collectGarbage(ptr));
GC.KeepAlive(this);
}
internal class Ptr : OpenCvSharp.Ptr
{
public Ptr(IntPtr ptr) : base(ptr)
{
}
public override IntPtr Get()
{
NativeMethods.HandleException(
NativeMethods.imgproc_Ptr_CLAHE_get(ptr, out var ret));
GC.KeepAlive(this);
return ret;
}
protected override void DisposeUnmanaged()
{
NativeMethods.HandleException(
NativeMethods.imgproc_Ptr_CLAHE_delete(ptr));
base.DisposeUnmanaged();
}
}
}