首页 > 其他分享 >图像处理的实现与应用(Go 版)

图像处理的实现与应用(Go 版)

时间:2024-10-26 21:46:24浏览次数:5  
标签:Gray img ++ Max image bounds 图像处理 应用 Go

图像处理在计算机视觉和图形设计中扮演着重要角色。本文将使用 Go 语言实现一些基本的图像处理操作,包括灰度转换、去除边框、提取有效区域和图像分割。

环境准备
确保你的 Go 环境已安装好。在项目中无需额外依赖,因为我们将使用 Go 的标准库。

加载图像
使用 Go 的 image 和 image/jpeg 包可以轻松加载图像文件。以下是加载图像的代码:

go

package main

import (
"image"
"image/jpeg"
"os"
)

func loadImage(path string) (image.Image, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
img, err := jpeg.Decode(file)
if err != nil {
return nil, err
}
return img, nil
}
灰度转换
将图像转换为灰度是图像处理中常见的操作。以下是实现这一功能的代码:

go

package main

import (
"image"
"image/color"
)

func convertToGray(img image.Image) *image.Gray {
bounds := img.Bounds()
grayImg := image.NewGray(bounds)

for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		c := img.At(x, y)
		r, g, b, _ := c.RGBA()
		gray := (r*299 + g*587 + b*114) / 1000
		grayColor := color.Gray{uint8(gray >> 8)} // 转换为 uint8
		grayImg.Set(x, y, grayColor)
	}
}
return grayImg

}
去除图像边框
去除图像边框可以通过将边框区域的颜色设置为白色来实现:

go

func clearBorders(img *image.Gray, borderWidth int) {
bounds := img.Bounds()
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
for x := bounds.Min.X; x < bounds.Max.X; x++ {
if x < borderWidth || y < borderWidth ||
x >= bounds.Max.X-borderWidth || y >= bounds.Max.Y-borderWidth {
img.Set(x, y, color.Gray{255}) // 设置为白色
}
}
}
}
提取有效区域
提取有效区域是通过遍历图像找到主要内容区域,以下是相应代码:

func getValidRegion(img *image.Gray, threshold uint8) *image.Gray {
bounds := img.Bounds()
minX, minY, maxX, maxY := bounds.Max.X, bounds.Max.Y, bounds.Min.X, bounds.Min.Y

for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		grayColor, _, _, _ := img.At(x, y).RGBA()
		if uint8(grayColor>>8) < threshold {
			if x < minX {
				minX = x
			}
			if y < minY {
				minY = y
			}
			if x > maxX {
				maxX = x
			}
			if y > maxY {
				maxY = y
			}
		}
	}
}
validBounds := image.Rect(minX, minY, maxX+1, maxY+1)
validImg := image.NewGray(validBounds)
for y := minY; y <= maxY; y++ {
	for x := minX; x <= maxX; x++ {
		validImg.Set(x, y, img.At(x, y))
	}
}
return validImg

}
图像分割
图像分割将图像按行列切分为多个小块,以下代码实现这一功能:

go

func splitImage(img image.Gray, rows, cols int) []image.Gray {
pieceWidth := img.Bounds().Dx() / cols
pieceHeight := img.Bounds().Dy() / rows
pieces := make([]image.Gray, rowscols)

for row := 0; row < rows; row++ {
	for col := 0; col < cols; col++ {
		x0 := col * pieceWidth
		y0 := row * pieceHeight
		pieces[row*cols+col] = img.SubImage(image.Rect(x0, y0, x0+pieceWidth, y0+pieceHeight)).(*image.Gray)
	}
}
return pieces

}
生成二进制编码
最后,可以生成图像的二进制编码,将图像的灰度值转换为二进制表示:

go

func generateBinaryCode(img *image.Gray, threshold uint8) string {
var binaryCode string
for y := 0; y < img.Bounds().Dy(); y++ {
for x := 0; x < img.Bounds().Dx(); x++ {
grayColor, _, _, _ := img.At(x, y).RGBA()
if uint8(grayColor>>8) < threshold {
binaryCode += "1"
} else {
binaryCode += "0"
}
}
}
return binaryCode
}

标签:Gray,img,++,Max,image,bounds,图像处理,应用,Go
From: https://www.cnblogs.com/ocr1/p/18504571

相关文章

  • 图像处理的实现与应用(Crystal 版)
    图像处理在计算机视觉、图形设计和数据分析中都有广泛的应用。本文将使用Crystal语言和MiniMagick库实现一些基本的图像处理操作,包括灰度转换、去除边框、提取有效区域和图像分割。环境准备确保你的Crystal环境已安装好,并安装MiniMagick库。在shard.yml文件中添加以下......
  • 了解React Native应用中的createNativeStackNavigator 组件
    createNativeStackNavigator是ReactNavigation库中的一个组件,专门用于在ReactNative应用中创建原生的堆栈导航器(StackNavigator)。这个组件允许你在应用中实现页面之间的导航,如从主页面跳转到详情页面,然后再返回主页面。与传统的JavaScript堆栈导航器相比,createNat......
  • (2024最新毕设合集)基于Django的房价分析平台-65434|可做计算机毕业设计JAVA、PHP、爬虫
    摘要本论文主要论述了如何基于Django框架开发一个房价分析平台,本系统将严格按照软件开发流程进行各个阶段的工作,通过爬虫技术对贵州省的房价数据进行爬取,面向对象编程思想进行项目开发。在引言中,作者将论述房价分析平台的当前背景以及系统开发的目的,后续章节将严格按照软件......
  • 实验3 c语言函数应用编程
    实验任务1task1.c1#include<stdio.h>23charscore_to_grade(intscore);//函数声明45intmain(){6intscore;7chargrade;89while(scanf("%d",&score)!=EOF){10grade=score_to_grade(score);//......
  • 订购 Claude AI 的第二天 它独自完成 文字换语音 flask应用
    图二里,删除几个无关的 chats全程我做的工作:向AI提要求,copy/paste代码,在venv验证运行,向 AI反馈,总共用了3个chats.(图中的只有一个Chat,删掉的另外两个:Python库安装排错用的,docker部署时遇到各自问题chat)曾经废弃的项目:text2speech目录结构your_project/├......
  • 【嵌入式原理设计】实验一:软硬件环境搭建&数字端口应用
    目录一、实验目的 二、实验环境三、实验内容四、实验记录及处理五、实验小结六、成果文件提取链接一、实验目的         配置ESPArduino开发平台,熟悉实验的软硬件工作环境和基本的工作方式二、实验环境        Win10+ESP32实验开发板三、实......
  • 2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组 wordsContainer 和 wordsQu
    2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组wordsContainer和wordsQuery,要对每个wordsQuery[i]找到一个与其有最长公共后缀的字符串。如果有多个字符串与wordsQuery[i]有相同的最长公共后缀,则返回在wordsContainer中最早出现的那个。最后,返回一个整数数组a......
  • (开题报告)django+vue社区二手物品交易论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景随着互联网的普及,社区二手物品交易逐渐成为一种重要的资源再利用方式。关于社区二手物品交易系统的研究,现有研究主要以大型商业二手交......
  • Go Zero 用户服务代码结构解析与深度使用指南
    目录GoZero用户服务代码结构解析与深度使用指南一、代码结构解析(一)整体结构概述(二)各部分详细解析(三)user.go文件二、GoZero使用指南(一).api文件和.proto文件的生成(二)服务开发流程在当今快速发展的软件开发领域,选择合适的框架来构建高效、可靠的服务至关重要。Go......
  • 简单谈谈Google TPUv6
    简单谈谈GoogleTPUv6根据GoogleTPU第六代的数据做了一些性能数据的对比,需要注意的是TPUv6当前应该是一个用于训推一体的单Die的版本,用于训练的V6p双Die版本应该会后期再发布.需要注意的是在国内外都开始卷大模型推理价格的时候,TPU这样的东西对于提高ROI非常有帮助。快速浏......