Golang图片操作:如何调整亮度和对比度

介绍

在图像处理中,亮度和对比度是两个较为重要的概念,调整好亮度和对比度可以使图像更加清晰和鲜明。在Golang中,我们可以使用image包来进行图片操作。本文将介绍如何使用Golang调整图片的亮度和对比度。

调整亮度

图片的亮度是指图片中亮部分的明亮程度,我们可以通过调整亮度来增强图像的整体色调,使其更加明亮或者暗淡。

获取原图片

在进行图片处理之前,我们首先需要获取原始图片。下面的代码展示了如何通过image包读取一张图片:

file, err := os.Open("image.jpg")

if err != nil {

log.Fatal(err)

}

defer file.Close()

img, _, err := image.Decode(file)

if err != nil {

log.Fatal(err)

}

这里我们使用了os包中的Open函数来打开图片文件,然后通过image包中的Decode函数将图片文件解码为一张图片。img变量就是我们想要处理的图片。

调整亮度的函数

接下来,我们需要实现一个调整亮度的函数。下面的代码展示了如何实现:

func brightness(img image.Image, value float64) image.Image {

b := img.Bounds()

width, height := b.Max.X, b.Max.Y

newImg := image.NewRGBA(b)

for x := 0; x < width; x++ {

for y := 0; y < height; y++ {

r, g, b, a := img.At(x, y).RGBA()

newR := uint8(float64(r>>8) * value)

newG := uint8(float64(g>>8) * value)

newB := uint8(float64(b>>8) * value)

newA := uint8(a >> 8)

pixel := color.RGBA{newR, newG, newB, newA}

newImg.Set(x, y, pixel)

}

}

return newImg.SubImage(image.Rect(0, 0, width, height))

}

这个函数接受两个参数,第一个参数是我们需要进行亮度调整的图片,第二个参数是亮度调整的值。value的范围为0到1之间的浮点数,例如0.5表示减小50%的亮度,1.5表示增加50%的亮度。

我们首先获取图片的宽度和高度,然后创建一张新的图片newImg。对于图片中的每一个像素点,我们分别获取其RGBA值,并将其乘以value,得到新的RGB值。最后将新的RGB值转化为一个颜色值pixel,然后通过newImg的Set方法将其设置到新的图片中。最后将新的图片裁剪到与原始图片相同大小的范围内,然后将其返回。

调用亮度调整函数

现在我们已经实现了一个亮度调整函数,接下来我们需要实际调用该函数。下面的代码展示了如何调用亮度调整函数,并将结果保存在一张新的图片中:

brightImg := brightness(img, 0.5)

outFile, err := os.Create("brightened.jpg")

if err != nil {

log.Fatal(err)

}

defer outFile.Close()

jpeg.Encode(outFile, brightImg, nil)

这个代码将原始图片img传递给brightness函数,并将亮度调整值设置为0.5。然后将调整后的图片保存在brightened.jpg文件中。

调整对比度

图片的对比度是指图像中亮部分与暗部分之间的差异程度。与亮度不同的是,对比度的调整通常需要同时修改图片中的亮部分和暗部分,使其之间的差异更加明显。

调整对比度的函数

下面的代码展示了如何实现一个调整图片对比度的函数:

func contrast(img image.Image, value float64) image.Image {

b := img.Bounds()

width, height := b.Max.X, b.Max.Y

newImg := image.NewRGBA(b)

for x := 0; x < width; x++ {

for y := 0; y < height; y++ {

r, g, b, a := img.At(x, y).RGBA()

newR := uint8((float64(r>>8)/255.0 - 0.5) * value * 255.0 + 0.5)

newG := uint8((float64(g>>8)/255.0 - 0.5) * value * 255.0 + 0.5)

newB := uint8((float64(b>>8)/255.0 - 0.5) * value * 255.0 + 0.5)

newA := uint8(a >> 8)

pixel := color.RGBA{newR, newG, newB, newA}

newImg.Set(x, y, pixel)

}

}

return newImg.SubImage(image.Rect(0, 0, width, height))

}

这个函数同样接受两个参数,第一个参数是需要进行对比度调整的图片,第二个参数是对比度调整的值。value的范围为0到任意大的浮点数,例如0.5表示减小50%的对比度,2.0表示增加100%的对比度。

函数实现与亮度调整函数类似,我们首先获取图片宽度和高度,然后创建一张新的图片newImg。对于图片中的每一个像素点,我们分别获取其RGBA值,并将其通过下面这个公式计算出新的RGB值:

newRGB = (oldRGB / 255.0 - 0.5) * value * 255.0 + 0.5

运用这个公式,我们可以同时调整图片中亮部分和暗部分的对比度,达到整体调整对比度的效果。最后将新的RGB值转化为颜色值pixel,然后通过newImg的Set方法将其设置到新的图片中。最后将新的图片裁剪到与原始图片相同大小的范围内,然后将其返回。

调用对比度调整函数

最后,我们需要实际调用对比度调整函数,并将其结果保存在一张新的图片中。下面的代码展示了如何实现:

contrastImg := contrast(img, 1.5)

outFile, err := os.Create("contrasted.jpg")

if err != nil {

log.Fatal(err)

}

defer outFile.Close()

jpeg.Encode(outFile, contrastImg, nil)

这个代码将原始图片img传递给contrast函数,并将对比度调整值设置为1.5。然后将调整后的图片保存在contrasted.jpg文件中。

总结

本文介绍了使用Golang调整图片亮度和对比度的方法。通过实现一个亮度调整函数和一个对比度调整函数,我们可以非常方便地对一张图片进行亮度和对比度的调整。这对于图像处理和图像识别等任务非常有用。

后端开发标签