1. 简介
图像处理是人机交互领域中的一个重要领域,图像处理技术可以使得图像更加美观,给用户带来更好的视觉享受。本文将介绍如何使用Golang添加滤镜效果,让图片更具有艺术感。
2. 基础知识
2.1 图像处理原理
图像处理涉及到很多数学原理和算法,本文不做详细讲解。简单来说,图像处理基于两个原则:
像素级别的操作
色彩空间转换
像素级操作是指我们可以直接对每一个像素进行修改,比如调整亮度,对比度,或者添加滤镜。
色彩空间转换是指将图像从一种色彩空间转换到另一种色彩空间。色彩空间转换常用的有RGB、CMYK、HSV、HSL等。
2.2 Golang中的图像处理库
Golang作为一门强大的编程语言,当然也能处理图像。Golang标准库中提供了image包,可以进行图像处理,支持的文件格式有jpg、jpeg、gif、png等。
package main
import (
"image"
"image/color"
"image/jpeg"
"os"
)
func main() {
file, err := os.Open("input.jpg")
if err != nil {
panic(err)
}
defer file.Close()
img, err := jpeg.Decode(file)
if err != nil {
panic(err)
}
bounds := img.Bounds()
w, h := bounds.Max.X, bounds.Max.Y
newImg := image.NewRGBA(image.Rect(0, 0, w, h))
for x := 0; x < w; x++ {
for y := 0; y < h; y++ {
r, g, b, a := img.At(x, y).RGBA()
c := color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)}
newImg.Set(x, y, c)
}
}
out, err := os.Create("output.jpg")
if err != nil {
panic(err)
}
defer out.Close()
jpeg.Encode(out, newImg, &jpeg.Options{Quality: 100})
}
上面的代码中,我们使用image包中的jpeg.Decode函数来解码图像,使用image.NewRGBA函数创建一个新的RGBA类型图像,使用img.At函数获取像素颜色值,然后使用newImg.Set函数来设置新图像的像素颜色值。最后调用jpeg.Encode函数将修改后的图像保存到文件中。
3. 添加滤镜
下面我们来介绍如何添加滤镜效果。本文将展示两种滤镜效果:怀旧滤镜和模糊滤镜。
3.1 怀旧滤镜
怀旧滤镜可以使得图片色调变得古旧复古,给人一种复古的感觉。最常见的怀旧滤镜就是将图片的红色和绿色通道做减淡处理,蓝色通道做加深处理。
package main
import (
"image"
"image/color"
"image/jpeg"
"os"
)
func main() {
file, err := os.Open("input.jpg")
if err != nil {
panic(err)
}
defer file.Close()
img, err := jpeg.Decode(file)
if err != nil {
panic(err)
}
bounds := img.Bounds()
w, h := bounds.Max.X, bounds.Max.Y
newImg := image.NewRGBA(image.Rect(0, 0, w, h))
for x := 0; x < w; x++ {
for y := 0; y < h; y++ {
r, g, b, a := img.At(x, y).RGBA()
rr := uint8((float64(r)*0.393 + float64(g)*0.769 + float64(b)*0.189) / 3)
gg := uint8((float64(r)*0.349 + float64(g)*0.686 + float64(b)*0.168) / 3)
bb := uint8((float64(r)*0.272 + float64(g)*0.534 + float64(b)*0.131) / 3)
c := color.RGBA{rr, gg, bb, uint8(a)}
newImg.Set(x, y, c)
}
}
out, err := os.Create("output.jpg")
if err != nil {
panic(err)
}
defer out.Close()
jpeg.Encode(out, newImg, &jpeg.Options{Quality: 100})
}
上面的代码中,我们使用float64类型来存储颜色值,计算每一个像素的RGB值,使用newImg.Set函数来设置新图像的像素颜色值。最终调用jpeg.Encode函数将修改后的图像保存到文件中。
3.2 模糊滤镜
模糊滤镜可以使得图像变得模糊,最常见的模糊滤镜就是高斯模糊滤镜。高斯模糊是指按照高斯分布函数加权的模糊处理,它可以有效地消除噪点,使图像变得更加平滑。
高斯模糊的公式如下:
G(x,y) = 1 / (2*pi*sigma^2) * exp(-(x^2+y^2)/(2*sigma^2))
在Golang中,我们可以使用gocv提供的高斯滤波器来实现高斯模糊效果。
package main
import (
"gocv.io/x/gocv"
)
func main() {
img := gocv.IMRead("input.jpg", gocv.IMReadColor)
if img.Empty() {
panic("Error reading image")
}
newImg := gocv.NewMat()
defer newImg.Close()
gocv.GaussianBlur(img, &newImg, image.Point{7, 7}, 0, 0, gocv.BorderDefault)
gocv.IMWrite("output.jpg", newImg)
}
上面的代码中,我们使用gocv.IMRead函数读取输入图片,使用gocv.NewMat函数创建一个新的Mat类型图像,使用gocv.GaussianBlur函数将输入图片进行高斯模糊处理,最终调用gocv.IMWrite函数将修改后的图像保存到文件中。
4. 结论
本文介绍了如何使用Golang添加滤镜效果。我们使用标准库image包和第三方库gocv进行图像处理,并且实现了怀旧滤镜和模糊滤镜效果。图像处理是一个非常有意义的领域,同时也是一个非常复杂的技术。本文只是一个入门级别的教程,希望能够为读者提供一些参考。