Golang 二值化图片,并读取某个色块的坐标

package main

import (
"fmt"
"github.com/Comdex/imgo"
"os"
"strings"
)

func main() {
if len(os.Args) <= 1 {
fmt.Println(`需要指定一个本地的图片文件`)
return
}

img := imgo.MustRead(os.Args[1])
text := ""

for i := 0; i < len(img); i++ {
w := img[i]
for ii := 0; ii < len(w); ii++ {
//根据色块的 RGBA 色值,进行灰度二值化
//纯绿色块是我们要标记的值
r := "0"
if w[ii][0] > 125 {
r = "1"
}

text += r
}

text += "\n"
}

//过滤杂色
text = strings.Replace(text, "10", "11", -1)
text = strings.Replace(text, "01", "11", -1)

if len(os.Args) >= 3 {
fmt.Println(text)
}

x := 50
y := 50
result := "fail"

newImg := strings.Split(text, "\n")
for i := 0; i < len(newImg); i++ {
//读取绿色块的连续值
//如果做得严格一点,需要做转置
l := len(newImg[i])
if l > 0 && strings.Count(newImg[i], "0")*4 >= len(newImg[i]) {
//不能位于边界
if i+6 > l {
y = i + 3
} else {
y = i + 6 //字符高度不变,就写死增加两个像素的偏移
}

//查找连续色块
block := "00000000"

s := strings.IndexAny(newImg[i], block)
e := strings.LastIndexAny(newImg[i], block)

x = s + (e-s+4)/2

result = "ok"
break
}
}

fmt.Printf(`{"result":"%s", "x":"%d", "y":"%d"}`, result, x, y)
fmt.Println()
}

发表评论

电子邮件地址不会被公开。