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()
}

发表评论