介绍
在图像处理中,亮度和对比度是两个较为重要的概念,调整好亮度和对比度可以使图像更加清晰和鲜明。在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调整图片亮度和对比度的方法。通过实现一个亮度调整函数和一个对比度调整函数,我们可以非常方便地对一张图片进行亮度和对比度的调整。这对于图像处理和图像识别等任务非常有用。