summaryrefslogtreecommitdiff
path: root/dmagick/c/morphology.d
blob: fa6ffd3c0d06a8c3ac85dfda6ec1be89aa609e6a (plain)
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
module dmagick.c.morphology;

import core.sys.posix.sys.types;

import dmagick.c.exception;
import dmagick.c.geometry;
import dmagick.c.image;
import dmagick.c.magickType;

extern(C)
{
	enum KernelInfoType
	{
		UndefinedKernel,    /* equivelent to UnityKernel */
		UnityKernel,        /* The no-op or 'original image' kernel */
		GaussianKernel,     /* Convolution Kernels, Gaussian Based */
		DoGKernel,
		LoGKernel,
		BlurKernel,
		CometKernel,
		LaplacianKernel,    /* Convolution Kernels, by Name */
		SobelKernel,
		FreiChenKernel,
		RobertsKernel,
		PrewittKernel,
		CompassKernel,
		KirschKernel,
		DiamondKernel,      /* Shape Kernels */
		SquareKernel,
		RectangleKernel,
		OctagonKernel,
		DiskKernel,
		PlusKernel,
		CrossKernel,
		RingKernel,
		PeaksKernel,        /* Hit And Miss Kernels */
		EdgesKernel,
		CornersKernel,
		ThinDiagonalsKernel,
		LineEndsKernel,
		LineJunctionsKernel,
		RidgesKernel,
		ConvexHullKernel,
		SkeletonKernel,
		ChebyshevKernel,    /* Distance Measuring Kernels */
		ManhattanKernel,
		EuclideanKernel,
		UserDefinedKernel   /* User Specified Kernel Array */
	}

	enum MorphologyMethod
	{
		UndefinedMorphology,

		/* Convolve / Correlate weighted sums */
		ConvolveMorphology,          /* Weighted Sum with reflected kernel */
		CorrelateMorphology,         /* Weighted Sum using a sliding window */

		/* Low-level Morphology methods */
		ErodeMorphology,             /* Minimum Value in Neighbourhood */
		DilateMorphology,            /* Maximum Value in Neighbourhood */
		ErodeIntensityMorphology,    /* Pixel Pick using GreyScale Erode */
		DilateIntensityMorphology,   /* Pixel Pick using GreyScale Dialate */
		DistanceMorphology,          /* Add Kernel Value, take Minimum */

		/* Second-level Morphology methods */
		OpenMorphology,              /* Dilate then Erode */
		CloseMorphology,             /* Erode then Dilate */
		OpenIntensityMorphology,     /* Pixel Pick using GreyScale Open */
		CloseIntensityMorphology,    /* Pixel Pick using GreyScale Close */
		SmoothMorphology,            /* Open then Close */

		/* Difference Morphology methods */
		EdgeInMorphology,            /* Dilate difference from Original */
		EdgeOutMorphology,           /* Erode difference from Original */
		EdgeMorphology,              /* Dilate difference with Erode */
		TopHatMorphology,            /* Close difference from Original */
		BottomHatMorphology,         /* Open difference from Original */

		/* Recursive Morphology methods */
		HitAndMissMorphology,        /* Foreground/Background pattern matching */
		ThinningMorphology,          /* Remove matching pixels from image */
		ThickenMorphology,           /* Add matching pixels from image */

		/* Experimental Morphology methods */
		VoronoiMorphology
	}

	struct KernelInfo
	{
		KernelInfoType
			type;

		size_t
			width,
			height;

		ssize_t
			x,
			y;

		double* values;

		double
			minimum,
			maximum,
			negative_range,
			positive_range,
			angle;

		KernelInfo*
			next;

		size_t
			signature;
	}


	KernelInfo* AcquireKernelInfo(const(char)*);
	KernelInfo* AcquireKernelBuiltIn(const KernelInfoType, const(GeometryInfo)*);
	KernelInfo* CloneKernelInfo(const(KernelInfo)*);
	KernelInfo* DestroyKernelInfo(KernelInfo*);

	Image* MorphologyImage(const(Image)*, const MorphologyMethod, const ssize_t, const(KernelInfo)*, ExceptionInfo*);
	Image* MorphologyImageChannel(const(Image)*, const ChannelType, const MorphologyMethod, const ssize_t, const(KernelInfo)*, ExceptionInfo*);

	void ScaleGeometryKernelInfo(KernelInfo*, const(char)*);
	void ShowKernelInfo(const(KernelInfo)*);
}