1. 用到的API
功能 | 用到的API |
---|---|
读取图片 | gocv.IMRead() |
写入图片 | gocv.IMWrite() |
阈值分割 | gocv.Threshold() |
图像按位反色 | gocv.BitwiseNot() |
提取图像边缘 | gocv.Canny() |
详细的用法可以查看官方文档:https://pkg.go.dev/gocv.io/x/gocv#section-documentation
2. 效果展示
原图片:
阈值分割:
按位反色:
边缘提取:
3. 完整代码
package main
import (
"fmt"
"os"
"path/filepath"
"gocv.io/x/gocv"
)
func main() {
// 拼接图片路径,这里是原图片的路径
logoPath := filepath.Join("test.bmp")
// 读取图片对象
grayImg := gocv.IMRead(logoPath, gocv.IMReadGrayScale)
// 如果图片对象为空,输出错误信息
if grayImg.Empty() {
fmt.Printf("Failed to read image: %s\n", logoPath)
os.Exit(1)
}
// 创建一个新的图片对象
binLogo := gocv.NewMat()
// 阈值分割,阈值设置为80,高于80显示黑色,低于80显示白色
gocv.Threshold(grayImg, &binLogo, 80.0, 255.0, gocv.ThresholdBinary)
// 把图片的像素按位反色,得到黑白和原图相反的图片
binLogoInv := gocv.NewMat()
gocv.BitwiseNot(binLogo, &binLogoInv)
// 提取边缘的图片
logoEdge := gocv.NewMat()
gocv.Canny(binLogo, &logoEdge, 10, 200)
gocv.BitwiseNot(logoEdge, &logoEdge)
//
if ok := gocv.IMWrite("bin_logo.jpeg", binLogo); !ok {
fmt.Printf("Failed to write image\n")
os.Exit(1)
}
if ok := gocv.IMWrite("bin_logo_inv.jpeg", binLogoInv); !ok {
fmt.Printf("Failed to write image\n")
os.Exit(1)
}
if ok := gocv.IMWrite("logo_edge.jpeg", logoEdge); !ok {
fmt.Printf("Failed to write image\n")
os.Exit(1)
}
}