DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

Go: เปลี่ยนสีรูปเป็น Gray scale

#go

Alt Text

มีงานที่ต้อง process รูปก่อนไปทำ OCR เพื่อให้ program ทำ OCR นั้นแยกแยะตัวอักษรได้ง่ายๆ เลยต้องทำการเปลี่ยนสีรูปให้อยู่ในแบบ Gray Scale ก่อน

ซึ่งสำหรับ Go นั้นทำได้ง่ายๆด้วย Standard library

  • image
  • image/jpeg (เนื่องจาก source เป็น JPEG)
  • image/png (output ออกเป็น PNG)

นี่คือโค้ดที่ทำการแปลง โดย gopher.jpg คือไฟล์รูปที่จะแปลง และ gray_gopher.png คือไฟล์ที่แปลงเรียบร้อยแล้ว

package main

import (
    "image"
    _ "image/jpeg"
    "image/png"
    "log"
    "os"
)

func main() {
    f, err := os.Open("gopher.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    m, _, err := image.Decode(f)
    if err != nil {
        log.Fatal(err)
    }
    bounds := m.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++ {
            grayImg.Set(x, y, m.At(x, y))
        }
    }
    grayFile, err := os.Create("gray_gopher.png")
    if err != nil {
        log.Fatal(err)
    }
    defer grayFile.Close()
    if err := png.Encode(grayFile, grayImg); err != nil {
        log.Fatal(err)
    }
}
Enter fullscreen mode Exit fullscreen mode

โค้ดที่ทำมี 3 steps คือ

1) โหลด source ไฟล์แล้วก็ decode ให้มาเป็น image.Image type

    f, err := os.Open("gopher.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    m, _, err := image.Decode(f)
    if err != nil {
        log.Fatal(err)
    }
Enter fullscreen mode Exit fullscreen mode

2) สร้าง Image ใหม่ให้เป็นแบบ gray scale ด้วย Image.NewGray โดยใช้ขนาดรูปจากรูปต้นฉบับ จากนั้นวนลูปเพื่อดึงค่าสีตามแกน x, y ทีละค่าไปกำหนดให้รูปที่เป็น gray scale เดี๋ยวมันจะแปลงสีให้เอง

    bounds := m.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++ {
            grayImg.Set(x, y, m.At(x, y))
        }
    }

Enter fullscreen mode Exit fullscreen mode

3) สุดท้ายเราก็เขียนไฟล์รูป grayImg ลงไปโดยใช้ png.Encode เพื่อให้แปลงจาก image.Image เป็นไฟล์ png

    grayFile, err := os.Create("gray_gopher.png")
    if err != nil {
        log.Fatal(err)
    }
    defer grayFile.Close()
    if err := png.Encode(grayFile, grayImg); err != nil {
        log.Fatal(err)
    }
Enter fullscreen mode Exit fullscreen mode

เพียงเท่านี้ก็ได้แล้ว ลองเอาไปประยุกต์ใช้กันดูครับ

ขอฝาก Buy Me a Coffee

สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ

Buy Me A Coffee

ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth

Top comments (2)

Collapse
 
jonrandy profile image
Jon Randy 🎖️
import (
    "image"
    _ "image/jpeg"
    "image/png"
    "log"
    "os"
)
Enter fullscreen mode Exit fullscreen mode

What is the purpose of the named, unused image/jpeg import? Maybe just to make sure some JPEG related stuff is initialised?

Collapse
 
iporsut profile image
Weerasak Chongnguluam

Yes, just import for registering image format for image.Decode function.