มีงานที่ต้อง 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)
}
}
โค้ดที่ทำมี 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)
}
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))
}
}
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)
}
เพียงเท่านี้ก็ได้แล้ว ลองเอาไปประยุกต์ใช้กันดูครับ
ขอฝาก Buy Me a Coffee
สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ
ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth
Top comments (2)
What is the purpose of the named, unused
image/jpeg
import? Maybe just to make sure some JPEG related stuff is initialised?Yes, just import for registering image format for image.Decode function.