首页 > 其他分享 >使用Go语言实现基本图像识别

使用Go语言实现基本图像识别

时间:2024-11-23 17:00:14浏览次数:7  
标签:err 图像识别 语言 img image height width 图像 Go

Go语言(又叫Golang)是一种由Google开发的编程语言,以简洁、效率和并发为特点。以下是使用Go语言实现Sobel边缘检测的代码示例。

代码实现
以下代码使用Go语言结合image, image/color, image/draw库来处理图像。

go
更多内容访问ttocr.com或联系1436423940
package main

import (
"fmt"
"image"
"image/color"
"image/draw"
"image/jpeg"
"os"
"math"
)

// Sobel算子
var sobelX = [9]int{-1, 0, 1, -2, 0, 2, -1, 0, 1}
var sobelY = [9]int{-1, -2, -1, 0, 0, 0, 1, 2, 1}

// 加载图像
func loadImage(filename string) (image.Image, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
img, _, err := image.Decode(file)
return img, err
}

// 保存图像
func saveImage(filename string, img image.Image) error {
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
return jpeg.Encode(file, img, nil)
}

// 灰度化处理
func toGray(img image.Image) *image.Gray {
bounds := img.Bounds()
width, height := bounds.Max.X, bounds.Max.Y
gray := image.NewGray(image.Rect(0, 0, width, height))
for y := 0; y < height; y++ {
for x := 0; x < width; x++ {
r, g, b, _ := img.At(x, y).RGBA()
gray.Set(x, y, color.Gray{Y: uint8((r + g + b) / 3 >> 8)})
}
}
return gray
}

// 卷积操作
func convolve(img *image.Gray, kernel [9]int) [][]float64 {
bounds := img.Bounds()
width, height := bounds.Max.X, bounds.Max.Y
result := make([][]float64, height)
for i := range result {
result[i] = make([]float64, width)
}

for y := 1; y < height-1; y++ {
	for x := 1; x < width-1; x++ {
		sum := 0
		for ky := -1; ky <= 1; ky++ {
			for kx := -1; kx <= 1; kx++ {
				grayVal := float64(img.GrayAt(x+kx, y+ky).Y)
				kernelVal := float64(kernel[(ky+1)*3+kx+1])
				sum += int(grayVal * kernelVal)
			}
		}
		result[y][x] = float64(sum)
	}
}
return result

}

// 计算梯度强度
func calculateGradient(gradX, gradY [][]float64) *image.Gray {
bounds := gradX[0]
width, height := len(gradX[0]), len(gradX)
gradient := image.NewGray(image.Rect(0, 0, width, height))
for y := 1; y < height-1; y++ {
for x := 1; x < width-1; x++ {
magnitude := math.Sqrt(math.Pow(gradX[y][x], 2) + math.Pow(gradY[y][x], 2))
grayValue := uint8(magnitude)
gradient.Set(x, y, color.Gray{Y: grayValue})
}
}
return gradient
}

func main() {
// 加载图像
img, err := loadImage("input_image.jpg")
if err != nil {
fmt.Println("Error loading image:", err)
return
}

// 灰度化图像
grayImg := toGray(img)

// 执行卷积
gradX := convolve(grayImg, sobelX)
gradY := convolve(grayImg, sobelY)

// 计算梯度强度
gradient := calculateGradient(gradX, gradY)

// 保存输出图像
err = saveImage("output_image.jpg", gradient)
if err != nil {
	fmt.Println("Error saving image:", err)
}
fmt.Println("边缘检测完成,输出保存为 output_image.jpg")

}
步骤解析
加载图像
loadImage函数使用image.Decode解码JPEG图像文件,并返回一个image.Image对象。

灰度化图像
toGray函数将彩色图像转化为灰度图像。通过计算每个像素的RGB平均值来实现灰度化。

卷积计算
convolve函数对图像应用Sobel滤波器,在水平和垂直方向上分别进行卷积计算,生成X和Y方向的梯度。

计算梯度强度
calculateGradient通过计算X和Y梯度的平方和的平方根来得到每个像素的边缘强度。

保存输出图像
saveImage将计算得到的边缘检测图像保存为JPEG格式。

示例输出
假设输入图像为灰度图,程序运行后将生成一个高对比度的边缘图像 output_image.jpg。

运行方式
安装Go语言环境。
将代码保存为 edge_detection.go 文件。
运行命令:
bash

go run edge_detection.go
Go语言的简洁和高效性使其在图像处理等计算密集型任务中表现出色。通过标准库的图像处理功能,Go能够非常高效地进行图像边缘检测等操作。

标签:err,图像识别,语言,img,image,height,width,图像,Go
From: https://www.cnblogs.com/ocr12/p/18564794

相关文章

  • SQL语言_多表查询和TOP限制结果集_PAGE3
    多表查询--01.内连接SElECT*FROMStudent INNERJOINSCONStudent.Sid=SC.Sid--Student与SC连接起来SElECTSname,Cid,GradeFROMStudentS--为表取别名,AS可以省略 JOINSCONS.Sid=SC.Sid--INNER可以省略SELECTSname,Cname,Grade FROMStudentS JOINSCONS......
  • C语言_数据类型及运算符_PAGE3
    顺序程序设计例题华氏度转化为摄氏度#include<stdio.h>intmain() { floatf,c;//定义f和c为单精度浮点型变量 f=64.0; c=(5.0/9)*(f-32); printf("f=%f\n",f,c); return0; }计算存款利息#include<stdio.h>intmain() { floatp0=1000,r1=0.0036,r2=0.022......
  • c语言程序块中初始化变量对同名变量作用域的影响
     001、[root@PC1test1]#lstest1.ctest2.c[root@PC1test1]#cattest1.c#include<stdio.h>intmain(void){inti;intx=10000;for(i=0;i<4;i++){intx=i*5;printf(......
  • 34.6K Star!Go语言开发的 AI 驱动照片管理神器!
    PhotoPrism是一款去中心化网络的AI驱动照片应用程序,旨在帮助开发者轻松组织和搜索照片,无论选择在家中、私人服务器还是云端运行。它强调用户隐私保护,支持在本地或私人服务器上运行,不依赖云服务,同时提供了强大的智能照片分类和搜索功能。同时采用Go语言开发,响应极快......
  • 为什么Python是最好的网络爬虫语言?
    网络爬虫作为一种自动化程序,能够从互联网上收集和提取数据,在信息收集、数据分析、市场调研等领域发挥着重要作用。而Python语言在爬虫开发领域独占鳌头,这是为什么呢?一、网络爬虫开发的本质难度网络爬虫开发并非易事,其面临着诸多挑战:1.动态内容的处理现代网站普遍采用Ja......
  • 机器学习(ML)和大型语言模型(LLMs)学习路线图
    学生应该在微积分、统计学、计量经济学、基本经济理论和任何高级语言(最好是Python)的编程经验方面有扎实的基础。微积分有助于理解优化问题,这是许多机器学习算法的核心,特别是在梯度下降和神经网络。统计对于理解概率分布、假设检验和推理至关重要,这些是大多数机器学习模型的......
  • AI大佬强推的大语言模型入门书籍:《大模型时代》开启人工智能狂潮!
    《大模型时代》是最近正在读的一本非常有趣的书,这本书可以说是一本GPT科普读物,以拟人化的手法,在趣味中讲述了ChatGPT的原理。这本书在通俗性和专业性上并存,严谨性和趣味性同在,作者很会玩儿梗,使得科普读物不再乏味无趣。书名:《大模型时代》作者:龙志勇,黄雯出版年份:2023年出......
  • golang: 给二进制文件增加版本信息
    一,代码:packagemainimport( "embed" "flag" "github.com/gofiber/template/html/v2" "net/http" "fmt" "runtime" "industry/config" "industry/routes")//构建版本信息var( V......
  • C语言数据结构与算法--简单实现栈的出栈与入栈
     目录(一)栈的基本概念(二)栈的的表现形式1.栈的表示和实现2.栈的链式表示(三)栈的链式表示时元素压入、弹出 算法实现思路1.栈的线性链表的压入算法2.栈的线性链表的弹出算法(四)算法的实现(一)栈的基本概念        栈(Stack)是限定仅在表尾进行插入和删除操作的线......
  • golang 嵌入式ARM7(交叉编译)
    开发板信息编译环境安装go环境sudoapt-getinstallgolang安装交叉编译工具链sudoapt-getinstallgcc-arm-linux-gnueabihfgoversionarm-linux-gnueabihf-gcc-v 编译脚本(build.sh)#!/bin/bash#设置交叉编译环境变量exportGOARCH=armexportGOARM=7......