Skip to content

Commit d13b468

Browse files
Merge pull request #30 from observerly/feature/monochrome/ApplyNoiseReduction
feat: Added (m *MonochromeExposure) ApplyNoiseReduction() to the IRIS monochrome module.
2 parents 4bd9b2e + d37bfc1 commit d13b468

3 files changed

Lines changed: 191 additions & 76 deletions

File tree

coverage.txt

Lines changed: 83 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,33 @@
11
mode: atomic
2-
github.com/observerly/iris/pkg/iris/convolution.go:5.122,16.40 5 128
3-
github.com/observerly/iris/pkg/iris/convolution.go:21.2,21.21 1 128
4-
github.com/observerly/iris/pkg/iris/convolution.go:25.2,25.21 1 128
5-
github.com/observerly/iris/pkg/iris/convolution.go:29.2,34.12 5 128
6-
github.com/observerly/iris/pkg/iris/convolution.go:16.40,19.3 2 98
7-
github.com/observerly/iris/pkg/iris/convolution.go:21.21,23.3 1 112
8-
github.com/observerly/iris/pkg/iris/convolution.go:25.21,27.3 1 112
9-
github.com/observerly/iris/pkg/iris/convolution.go:37.126,54.19 8 128
10-
github.com/observerly/iris/pkg/iris/convolution.go:58.2,58.19 1 128
11-
github.com/observerly/iris/pkg/iris/convolution.go:62.2,66.21 3 128
12-
github.com/observerly/iris/pkg/iris/convolution.go:70.2,70.21 1 128
13-
github.com/observerly/iris/pkg/iris/convolution.go:74.2,79.14 5 128
14-
github.com/observerly/iris/pkg/iris/convolution.go:54.19,56.3 1 112
15-
github.com/observerly/iris/pkg/iris/convolution.go:58.19,60.3 1 112
16-
github.com/observerly/iris/pkg/iris/convolution.go:66.21,68.3 1 112
17-
github.com/observerly/iris/pkg/iris/convolution.go:70.21,72.3 1 112
18-
github.com/observerly/iris/pkg/iris/convolution.go:82.124,93.19 5 128
19-
github.com/observerly/iris/pkg/iris/convolution.go:97.2,97.19 1 128
20-
github.com/observerly/iris/pkg/iris/convolution.go:101.2,101.36 1 128
21-
github.com/observerly/iris/pkg/iris/convolution.go:106.2,111.13 5 128
22-
github.com/observerly/iris/pkg/iris/convolution.go:93.19,95.3 1 112
23-
github.com/observerly/iris/pkg/iris/convolution.go:97.19,99.3 1 112
24-
github.com/observerly/iris/pkg/iris/convolution.go:101.36,104.3 2 98
25-
github.com/observerly/iris/pkg/iris/monochrome.go:24.84,37.2 3 7
26-
github.com/observerly/iris/pkg/iris/monochrome.go:39.79,44.16 3 5
27-
github.com/observerly/iris/pkg/iris/monochrome.go:48.2,48.18 1 5
28-
github.com/observerly/iris/pkg/iris/monochrome.go:44.16,46.3 1 0
29-
github.com/observerly/iris/pkg/iris/monochrome.go:51.116,63.32 8 1
30-
github.com/observerly/iris/pkg/iris/monochrome.go:89.2,89.18 1 1
31-
github.com/observerly/iris/pkg/iris/monochrome.go:63.32,66.28 2 215
32-
github.com/observerly/iris/pkg/iris/monochrome.go:70.3,72.28 2 209
33-
github.com/observerly/iris/pkg/iris/monochrome.go:76.3,83.29 5 208
34-
github.com/observerly/iris/pkg/iris/monochrome.go:66.28,67.12 1 6
35-
github.com/observerly/iris/pkg/iris/monochrome.go:72.28,73.9 1 1
36-
github.com/observerly/iris/pkg/iris/monochrome.go:83.29,86.4 2 16
37-
github.com/observerly/iris/pkg/iris/monochrome.go:92.65,99.51 4 4
38-
github.com/observerly/iris/pkg/iris/monochrome.go:103.2,103.47 1 4
39-
github.com/observerly/iris/pkg/iris/monochrome.go:107.2,109.29 2 4
40-
github.com/observerly/iris/pkg/iris/monochrome.go:99.51,101.3 1 784
41-
github.com/observerly/iris/pkg/iris/monochrome.go:103.47,105.3 1 784
42-
github.com/observerly/iris/pkg/iris/monochrome.go:112.73,122.51 5 1
43-
github.com/observerly/iris/pkg/iris/monochrome.go:132.2,132.47 1 1
44-
github.com/observerly/iris/pkg/iris/monochrome.go:136.2,138.28 2 1
45-
github.com/observerly/iris/pkg/iris/monochrome.go:122.51,125.26 2 256
46-
github.com/observerly/iris/pkg/iris/monochrome.go:125.26,127.4 1 251
47-
github.com/observerly/iris/pkg/iris/monochrome.go:127.9,129.4 1 5
48-
github.com/observerly/iris/pkg/iris/monochrome.go:132.47,134.3 1 256
2+
github.com/observerly/iris/pkg/photometry/noise.go:12.77,17.29 2 2
3+
github.com/observerly/iris/pkg/photometry/noise.go:21.2,26.3 1 2
4+
github.com/observerly/iris/pkg/photometry/noise.go:17.29,19.3 1 32
5+
github.com/observerly/iris/pkg/photometry/noise.go:34.53,56.33 6 1
6+
github.com/observerly/iris/pkg/photometry/noise.go:81.2,83.19 2 1
7+
github.com/observerly/iris/pkg/photometry/noise.go:56.33,58.34 2 15
8+
github.com/observerly/iris/pkg/photometry/noise.go:77.3,77.15 1 15
9+
github.com/observerly/iris/pkg/photometry/noise.go:58.34,66.29 3 225
10+
github.com/observerly/iris/pkg/photometry/noise.go:73.4,73.25 1 225
11+
github.com/observerly/iris/pkg/photometry/noise.go:66.29,67.44 1 2025
12+
github.com/observerly/iris/pkg/photometry/noise.go:67.44,69.6 1 1978
13+
github.com/observerly/iris/pkg/photometry/stars.go:22.93,27.29 2 2
14+
github.com/observerly/iris/pkg/photometry/stars.go:31.2,40.3 2 2
15+
github.com/observerly/iris/pkg/photometry/stars.go:27.29,29.3 1 32
16+
github.com/observerly/iris/pkg/photometry/stars.go:43.51,46.34 2 1
17+
github.com/observerly/iris/pkg/photometry/stars.go:66.2,66.14 1 1
18+
github.com/observerly/iris/pkg/photometry/stars.go:46.34,48.35 1 256
19+
github.com/observerly/iris/pkg/photometry/stars.go:48.35,52.22 2 24
20+
github.com/observerly/iris/pkg/photometry/stars.go:62.4,62.29 1 24
21+
github.com/observerly/iris/pkg/photometry/stars.go:52.22,56.85 2 23
22+
github.com/observerly/iris/pkg/photometry/stars.go:56.85,58.6 1 5
23+
github.com/observerly/iris/pkg/fits/fits.go:17.33,28.2 1 2
24+
github.com/observerly/iris/pkg/fits/fits.go:47.32,52.2 1 1
25+
github.com/observerly/iris/pkg/fits/fits.go:56.72,59.31 2 1
26+
github.com/observerly/iris/pkg/fits/fits.go:63.2,63.17 1 1
27+
github.com/observerly/iris/pkg/fits/fits.go:67.2,78.3 1 1
28+
github.com/observerly/iris/pkg/fits/fits.go:59.31,61.3 1 2
29+
github.com/observerly/iris/pkg/fits/fits.go:63.17,65.3 1 1
30+
github.com/observerly/iris/pkg/fits/fits.go:83.55,98.2 2 1
4931
github.com/observerly/iris/pkg/iris/rggb.go:22.85,34.2 2 10
5032
github.com/observerly/iris/pkg/iris/rggb.go:39.85,40.46 1 7
5133
github.com/observerly/iris/pkg/iris/rggb.go:41.14,42.19 1 3
@@ -69,35 +51,60 @@ github.com/observerly/iris/pkg/iris/rggb.go:132.2,132.22 1 1
6951
github.com/observerly/iris/pkg/iris/rggb.go:115.16,117.3 1 0
7052
github.com/observerly/iris/pkg/iris/rggb.go:121.16,123.3 1 0
7153
github.com/observerly/iris/pkg/iris/rggb.go:128.16,130.3 1 0
72-
github.com/observerly/iris/pkg/fits/fits.go:17.33,28.2 1 2
73-
github.com/observerly/iris/pkg/fits/fits.go:47.32,52.2 1 1
74-
github.com/observerly/iris/pkg/fits/fits.go:56.72,59.31 2 1
75-
github.com/observerly/iris/pkg/fits/fits.go:63.2,63.17 1 1
76-
github.com/observerly/iris/pkg/fits/fits.go:67.2,78.3 1 1
77-
github.com/observerly/iris/pkg/fits/fits.go:59.31,61.3 1 2
78-
github.com/observerly/iris/pkg/fits/fits.go:63.17,65.3 1 1
79-
github.com/observerly/iris/pkg/fits/fits.go:83.55,98.2 2 1
54+
github.com/observerly/iris/pkg/iris/convolution.go:5.122,16.40 5 128
55+
github.com/observerly/iris/pkg/iris/convolution.go:21.2,21.21 1 128
56+
github.com/observerly/iris/pkg/iris/convolution.go:25.2,25.21 1 128
57+
github.com/observerly/iris/pkg/iris/convolution.go:29.2,34.12 5 128
58+
github.com/observerly/iris/pkg/iris/convolution.go:16.40,19.3 2 98
59+
github.com/observerly/iris/pkg/iris/convolution.go:21.21,23.3 1 112
60+
github.com/observerly/iris/pkg/iris/convolution.go:25.21,27.3 1 112
61+
github.com/observerly/iris/pkg/iris/convolution.go:37.126,54.19 8 128
62+
github.com/observerly/iris/pkg/iris/convolution.go:58.2,58.19 1 128
63+
github.com/observerly/iris/pkg/iris/convolution.go:62.2,66.21 3 128
64+
github.com/observerly/iris/pkg/iris/convolution.go:70.2,70.21 1 128
65+
github.com/observerly/iris/pkg/iris/convolution.go:74.2,79.14 5 128
66+
github.com/observerly/iris/pkg/iris/convolution.go:54.19,56.3 1 112
67+
github.com/observerly/iris/pkg/iris/convolution.go:58.19,60.3 1 112
68+
github.com/observerly/iris/pkg/iris/convolution.go:66.21,68.3 1 112
69+
github.com/observerly/iris/pkg/iris/convolution.go:70.21,72.3 1 112
70+
github.com/observerly/iris/pkg/iris/convolution.go:82.124,93.19 5 128
71+
github.com/observerly/iris/pkg/iris/convolution.go:97.2,97.19 1 128
72+
github.com/observerly/iris/pkg/iris/convolution.go:101.2,101.36 1 128
73+
github.com/observerly/iris/pkg/iris/convolution.go:106.2,111.13 5 128
74+
github.com/observerly/iris/pkg/iris/convolution.go:93.19,95.3 1 112
75+
github.com/observerly/iris/pkg/iris/convolution.go:97.19,99.3 1 112
76+
github.com/observerly/iris/pkg/iris/convolution.go:101.36,104.3 2 98
77+
github.com/observerly/iris/pkg/iris/monochrome.go:26.84,39.2 3 8
78+
github.com/observerly/iris/pkg/iris/monochrome.go:41.79,46.16 3 7
79+
github.com/observerly/iris/pkg/iris/monochrome.go:50.2,50.18 1 7
80+
github.com/observerly/iris/pkg/iris/monochrome.go:46.16,48.3 1 0
81+
github.com/observerly/iris/pkg/iris/monochrome.go:53.116,65.32 8 1
82+
github.com/observerly/iris/pkg/iris/monochrome.go:91.2,91.18 1 1
83+
github.com/observerly/iris/pkg/iris/monochrome.go:65.32,68.28 2 215
84+
github.com/observerly/iris/pkg/iris/monochrome.go:72.3,74.28 2 209
85+
github.com/observerly/iris/pkg/iris/monochrome.go:78.3,85.29 5 208
86+
github.com/observerly/iris/pkg/iris/monochrome.go:68.28,69.12 1 6
87+
github.com/observerly/iris/pkg/iris/monochrome.go:74.28,75.9 1 1
88+
github.com/observerly/iris/pkg/iris/monochrome.go:85.29,88.4 2 16
89+
github.com/observerly/iris/pkg/iris/monochrome.go:94.65,101.51 4 5
90+
github.com/observerly/iris/pkg/iris/monochrome.go:105.2,105.47 1 5
91+
github.com/observerly/iris/pkg/iris/monochrome.go:109.2,111.29 2 5
92+
github.com/observerly/iris/pkg/iris/monochrome.go:101.51,103.3 1 1040
93+
github.com/observerly/iris/pkg/iris/monochrome.go:105.47,107.3 1 1040
94+
github.com/observerly/iris/pkg/iris/monochrome.go:114.74,125.51 6 1
95+
github.com/observerly/iris/pkg/iris/monochrome.go:135.2,135.47 1 1
96+
github.com/observerly/iris/pkg/iris/monochrome.go:139.2,141.29 2 1
97+
github.com/observerly/iris/pkg/iris/monochrome.go:125.51,128.30 2 256
98+
github.com/observerly/iris/pkg/iris/monochrome.go:128.30,130.4 1 0
99+
github.com/observerly/iris/pkg/iris/monochrome.go:130.9,132.4 1 256
100+
github.com/observerly/iris/pkg/iris/monochrome.go:135.47,137.3 1 256
101+
github.com/observerly/iris/pkg/iris/monochrome.go:144.73,154.51 5 1
102+
github.com/observerly/iris/pkg/iris/monochrome.go:164.2,164.47 1 1
103+
github.com/observerly/iris/pkg/iris/monochrome.go:168.2,170.28 2 1
104+
github.com/observerly/iris/pkg/iris/monochrome.go:154.51,157.26 2 256
105+
github.com/observerly/iris/pkg/iris/monochrome.go:157.26,159.4 1 251
106+
github.com/observerly/iris/pkg/iris/monochrome.go:159.9,161.4 1 5
107+
github.com/observerly/iris/pkg/iris/monochrome.go:164.47,166.3 1 256
80108
github.com/observerly/iris/pkg/histogram/histogram.go:18.51,25.47 4 0
81109
github.com/observerly/iris/pkg/histogram/histogram.go:30.2,30.12 1 0
82110
github.com/observerly/iris/pkg/histogram/histogram.go:25.47,28.3 2 0
83-
github.com/observerly/iris/pkg/photometry/noise.go:12.77,17.29 2 2
84-
github.com/observerly/iris/pkg/photometry/noise.go:21.2,26.3 1 2
85-
github.com/observerly/iris/pkg/photometry/noise.go:17.29,19.3 1 32
86-
github.com/observerly/iris/pkg/photometry/noise.go:34.53,56.33 6 1
87-
github.com/observerly/iris/pkg/photometry/noise.go:81.2,83.19 2 1
88-
github.com/observerly/iris/pkg/photometry/noise.go:56.33,58.34 2 15
89-
github.com/observerly/iris/pkg/photometry/noise.go:77.3,77.15 1 15
90-
github.com/observerly/iris/pkg/photometry/noise.go:58.34,66.29 3 225
91-
github.com/observerly/iris/pkg/photometry/noise.go:73.4,73.25 1 225
92-
github.com/observerly/iris/pkg/photometry/noise.go:66.29,67.44 1 2025
93-
github.com/observerly/iris/pkg/photometry/noise.go:67.44,69.6 1 1978
94-
github.com/observerly/iris/pkg/photometry/stars.go:22.93,27.29 2 2
95-
github.com/observerly/iris/pkg/photometry/stars.go:31.2,40.3 2 2
96-
github.com/observerly/iris/pkg/photometry/stars.go:27.29,29.3 1 32
97-
github.com/observerly/iris/pkg/photometry/stars.go:43.51,46.34 2 1
98-
github.com/observerly/iris/pkg/photometry/stars.go:66.2,66.14 1 1
99-
github.com/observerly/iris/pkg/photometry/stars.go:46.34,48.35 1 256
100-
github.com/observerly/iris/pkg/photometry/stars.go:48.35,52.22 2 24
101-
github.com/observerly/iris/pkg/photometry/stars.go:62.4,62.29 1 24
102-
github.com/observerly/iris/pkg/photometry/stars.go:52.22,56.85 2 23
103-
github.com/observerly/iris/pkg/photometry/stars.go:56.85,58.6 1 5

pkg/iris/monochrome.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"image/jpeg"
88

99
"github.com/observerly/iris/pkg/histogram"
10+
"github.com/observerly/iris/pkg/photometry"
1011
"github.com/observerly/iris/pkg/utils"
1112
)
1213

@@ -17,6 +18,7 @@ type MonochromeExposure struct {
1718
Buffer bytes.Buffer
1819
Image *image.Gray
1920
Otsu *image.Gray
21+
Noise float64
2022
Threshold uint8
2123
Pixels int
2224
}
@@ -109,6 +111,36 @@ func (m *MonochromeExposure) Preprocess() (bytes.Buffer, error) {
109111
return m.GetBuffer(m.Image)
110112
}
111113

114+
func (m *MonochromeExposure) ApplyNoiseReduction() (bytes.Buffer, error) {
115+
bounds := m.Image.Bounds()
116+
117+
size := bounds.Size()
118+
119+
gray := image.NewGray(bounds)
120+
121+
noise := photometry.NewNoiseExtractor(m.Raw, m.Width, m.Height)
122+
123+
m.Noise = noise.GetGaussianNoise()
124+
125+
setPixel := func(gray *image.Gray, x int, y int) {
126+
pixel := m.Raw[x][y]
127+
128+
if pixel < uint32(m.Noise) {
129+
gray.SetGray(x, y, color.Gray{Y: 0})
130+
} else {
131+
gray.SetGray(x, y, color.Gray{uint8(pixel - uint32(m.Noise))})
132+
}
133+
}
134+
135+
utils.DeferForEachPixel(size, func(x, y int) {
136+
setPixel(gray, x, y)
137+
})
138+
139+
m.Image = gray
140+
141+
return m.GetBuffer(m.Image)
142+
}
143+
112144
func (m *MonochromeExposure) ApplyOtsuThreshold() (bytes.Buffer, error) {
113145
bounds := m.Image.Bounds()
114146

pkg/iris/monochrome_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,82 @@ func TestNewMonochromeExposureOtsuThreshold(t *testing.T) {
236236
}
237237
}
238238

239+
func TestNewMonochromeExposureNoiseReduction16x16(t *testing.T) {
240+
var ex = [][]uint32{
241+
{6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
242+
{6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6},
243+
{7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 8, 7},
244+
{6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 7, 6},
245+
{6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
246+
{6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6},
247+
{7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 8, 7},
248+
{6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 7, 6},
249+
{6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
250+
{6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6},
251+
{7, 8, 9, 7, 7, 7, 7, 7, 200, 200, 7, 7, 7, 9, 8, 7},
252+
{6, 7, 8, 6, 6, 6, 6, 6, 200, 200, 6, 6, 6, 8, 7, 6},
253+
{6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
254+
{6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6},
255+
{7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 8, 7},
256+
{6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 7, 6},
257+
}
258+
259+
mono := NewMonochromeExposure(ex, 16, 16)
260+
261+
var x int = mono.Width
262+
263+
var y int = mono.Height
264+
265+
if x != 16 {
266+
t.Errorf("got %q, wanted %q", x, 16)
267+
}
268+
269+
if y != 16 {
270+
t.Errorf("got %q, wanted %q", y, 16)
271+
}
272+
273+
mono.Preprocess()
274+
275+
buff, err := mono.ApplyNoiseReduction()
276+
277+
if err != nil {
278+
t.Errorf("Expected the buffer to be created successfully, but got %q", err)
279+
}
280+
281+
f, err := os.Create("16x16image.jpg")
282+
283+
if err != nil {
284+
panic(err)
285+
}
286+
287+
defer func() {
288+
if err := f.Close(); err != nil {
289+
t.Errorf("Expected the image buffer to be saved successfully, but got %q", err)
290+
}
291+
292+
// Clean up the file after we have finished with the test:
293+
os.Remove("16x16image.jpg")
294+
}()
295+
296+
n, err := f.Write(buff.Bytes())
297+
298+
if err != nil {
299+
t.Errorf("Expected the image buffer to be saved successfully, but got %q", err)
300+
}
301+
302+
if n >= 1086 {
303+
t.Errorf("Expected the number of bytes to be approximately less than 1086, but got %q", n)
304+
}
305+
306+
if mono.Noise <= 0.0 {
307+
t.Errorf("Noise is %f, expected > 0.0", mono.Noise)
308+
}
309+
310+
if mono.Noise > 255 {
311+
t.Errorf("Noise is %f, expected <= 255", mono.Noise)
312+
}
313+
}
314+
239315
func TestNewMonochromeExposureHistogramGray(t *testing.T) {
240316
var ex = [][]uint32{
241317
{1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6},

0 commit comments

Comments
 (0)