42 lines
915 B
Go
42 lines
915 B
Go
package filter
|
|
|
|
import (
|
|
"image"
|
|
"image/color"
|
|
)
|
|
|
|
func Stretch(src *image.Gray, black, white float64) *image.Gray {
|
|
b := src.Bounds()
|
|
min, max := uint8(255), uint8(0)
|
|
|
|
for y := b.Min.Y; y < b.Max.Y; y++ {
|
|
for x := b.Min.X; x < b.Max.X; x++ {
|
|
v := src.GrayAt(x, y).Y
|
|
if v < min {
|
|
min = v
|
|
}
|
|
if v > max {
|
|
max = v
|
|
}
|
|
}
|
|
}
|
|
|
|
minF := float64(min) + float64(max-min)*black
|
|
maxF := float64(min) + float64(max-min)*white
|
|
rng := maxF - minF
|
|
if rng == 0 {
|
|
return src
|
|
}
|
|
|
|
out := image.NewGray(b)
|
|
for y := b.Min.Y; y < b.Max.Y; y++ {
|
|
for x := b.Min.X; x < b.Max.X; x++ {
|
|
v := float64(src.GrayAt(x, y).Y)
|
|
out.SetGray(x, y, color.Gray{
|
|
Y: clamp((v - minF) / rng * 255),
|
|
})
|
|
}
|
|
}
|
|
return out
|
|
}
|