Golang图像处理:学习如何添加滤镜效果

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进行图像处理,并且实现了怀旧滤镜和模糊滤镜效果。图像处理是一个非常有意义的领域,同时也是一个非常复杂的技术。本文只是一个入门级别的教程,希望能够为读者提供一些参考。

后端开发标签