


Pemprosesan Imej Golang: Ketahui cara menajam dan mengesan imej tepi
. Melalui operasi mengasah, kami boleh meningkatkan butiran dan tepi dalam gambar, menjadikan imej lebih jelas. Pengesanan tepi boleh membantu kami menangkap maklumat tepi dalam imej, yang berguna untuk analisis dan pengenalan imej. Artikel ini akan memperkenalkan cara menggunakan Golang untuk menajam dan mengesan imej, serta melampirkan contoh kod untuk rujukan anda.
Metajamkan imej
package main import ( "image" "image/jpeg" "log" "os" ) func main() { // 打开图片文件 file, err := os.Open("input.jpg") if err != nil { log.Fatal(err) } defer file.Close() // 解码为image.Image对象 img, err := jpeg.Decode(file) if err != nil { log.Fatal(err) } // 对图像进行锐化处理 sharpened := sharpenImage(img) // 将处理后的图像保存到文件 output, err := os.Create("output_sharpened.jpg") if err != nil { log.Fatal(err) } defer output.Close() // 将处理后的图像编码为jpeg格式并保存 err = jpeg.Encode(output, sharpened, nil) if err != nil { log.Fatal(err) } } // 锐化图像 func sharpenImage(img image.Image) image.Image { bounds := img.Bounds() width, height := bounds.Max.X, bounds.Max.Y // 创建一个RGBA图像,用于存储处理后的图像 sharpened := image.NewRGBA(bounds) // 遍历图像的像素点,对每个像素点进行锐化处理 for x := 1; x < width-1; x++ { for y := 1; y < height-1; y++ { // 获取周围的像素点 pixel00 := img.At(x-1, y-1) pixel01 := img.At(x-1, y) pixel02 := img.At(x-1, y+1) pixel10 := img.At(x, y-1) pixel11 := img.At(x, y) pixel12 := img.At(x, y+1) pixel20 := img.At(x+1, y-1) pixel21 := img.At(x+1, y) pixel22 := img.At(x+1, y+1) // 对当前像素点进行锐化计算,可以使用Sobel算子等 // 这里简化处理,使用当前像素点与周围像素点的平均值作为新的像素值 r00, g00, b00, _ := pixel00.RGBA() r01, g01, b01, _ := pixel01.RGBA() r02, g02, b02, _ := pixel02.RGBA() r10, g10, b10, _ := pixel10.RGBA() r11, g11, b11, _ := pixel11.RGBA() r12, g12, b12, _ := pixel12.RGBA() r20, g20, b20, _ := pixel20.RGBA() r21, g21, b21, _ := pixel21.RGBA() r22, g22, b22, _ := pixel22.RGBA() avgR := uint8((r00 + r01 + r02 + r10 + r11 + r12 + r20 + r21 + r22) / 9) avgG := uint8((g00 + g01 + g02 + g10 + g11 + g12 + g20 + g21 + g22) / 9) avgB := uint8((b00 + b01 + b02 + b10 + b11 + b12 + b20 + b21 + b22) / 9) newPixel := color.RGBA{avgR, avgG, avgB, 255} // 设置锐化后的像素点 sharpened.Set(x, y, newPixel) } } return sharpened }
Fungsi sharpenImage dalam kod melaksanakan penajaman imej. Untuk setiap piksel, kami boleh menggunakan piksel sekeliling (anda boleh menggunakan operator Sobel, operator Laplacian, dll.) untuk mengira dan mendapatkan nilai piksel baharu. Dalam kod contoh, kami hanya mengambil purata piksel sekeliling sebagai nilai piksel baharu.
Selepas menjalankan kod, anda akan mendapat imej yang diasah. Bergantung pada keperluan anda, anda boleh menggunakan algoritma yang lebih kompleks untuk mencapai kesan penajaman kualiti yang lebih tinggi.
Di bawah ini kita akan belajar cara melakukan pengesanan tepi pada imej. Begitu juga, kita boleh menggunakan pakej imej dan pakej lukisan untuk mencapai ini.
package main import ( "fmt" "image" "image/color" "image/jpeg" "log" "math" "os" ) func main() { // 打开图片文件 file, err := os.Open("input.jpg") if err != nil { log.Fatal(err) } defer file.Close() // 解码为image.Image对象 img, err := jpeg.Decode(file) if err != nil { log.Fatal(err) } // 对图像进行边缘检测 edges := detectEdges(img) // 将处理后的图像保存到文件 output, err := os.Create("output_edges.jpg") if err != nil { log.Fatal(err) } defer output.Close() // 将处理后的图像编码为jpeg格式并保存 err = jpeg.Encode(output, edges, nil) if err != nil { log.Fatal(err) } } // 边缘检测 func detectEdges(img image.Image) image.Image { bounds := img.Bounds() width, height := bounds.Max.X, bounds.Max.Y // 创建一个灰度图像,用于存储处理后的图像 gray := image.NewGray(bounds) // 将图像转为灰度图像 draw.Draw(gray, bounds, img, image.Point{}, draw.Src) // 创建一个RGBA图像,用于存储边缘检测结果 edges := image.NewRGBA(bounds) // 设置边缘检测的阈值 threshold := uint32(10000) for x := 1; x < width-1; x++ { for y := 1; y < height-1; y++ { // 获取周围的像素点 pixel00 := gray.At(x-1, y-1) pixel01 := gray.At(x-1, y) pixel02 := gray.At(x-1, y+1) pixel10 := gray.At(x, y-1) pixel11 := gray.At(x, y) pixel12 := gray.At(x, y+1) pixel20 := gray.At(x+1, y-1) pixel21 := gray.At(x+1, y) pixel22 := gray.At(x+1, y+1) // 对当前像素点进行边缘检测计算 g00 := luminance(pixel00) g01 := luminance(pixel01) g02 := luminance(pixel02) g10 := luminance(pixel10) g11 := luminance(pixel11) g12 := luminance(pixel12) g20 := luminance(pixel20) g21 := luminance(pixel21) g22 := luminance(pixel22) dx := -(g00 + 2*g10 + g20) + (g02 + 2*g12 + g22) dy := -(g00 + 2*g01 + g02) + (g20 + 2*g21 + g22) magnitude := math.Sqrt(float64(dx*dx + dy*dy)) if magnitude > threshold { edges.Set(x, y, color.White) } else { edges.Set(x, y, color.Black) } } } return edges } // 计算像素的灰度值 func luminance(c color.Color) uint32 { r, g, b, _ := c.RGBA() return uint32(0.299*float64(r) + 0.587*float64(g) + 0.114*float64(b)) }
Dalam kod sampel, kita mula-mula menukar imej berwarna kepada imej skala kelabu, kemudian menggunakan operator Sobel untuk mengira nilai kecerunan piksel dan menggunakan nilai kecerunan untuk menentukan sama ada piksel itu tergolong dalam tepi. Apabila nilai kecerunan lebih besar daripada ambang yang ditetapkan, kami menetapkan piksel kepada putih, jika tidak, tetapkannya kepada hitam.
Selepas menjalankan kod, anda akan mendapat imej selepas pengesanan tepi. Anda boleh melaraskan parameter seperti ambang untuk mendapatkan hasil pengesanan tepi yang lebih baik.
Ringkasan
Artikel ini memperkenalkan cara menggunakan Golang untuk melaksanakan operasi penajaman imej dan pengesanan tepi. Dengan memahami dan melaksanakan algoritma penajaman dan pengesanan tepi, kami boleh memproses dan menganalisis imej dengan lebih baik. Saya harap artikel ini dapat memberi anda sedikit pengetahuan dan bantuan, dan juga menggalakkan anda untuk meneroka lebih banyak teknologi dan aplikasi pemprosesan imej secara praktikal.
Atas ialah kandungan terperinci Pemprosesan Imej Golang: Ketahui cara menajam dan mengesan imej tepi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Artikel ini menunjukkan penciptaan dan stub di GO untuk ujian unit. Ia menekankan penggunaan antara muka, menyediakan contoh pelaksanaan mengejek, dan membincangkan amalan terbaik seperti menjaga mocks fokus dan menggunakan perpustakaan penegasan. Articl

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Artikel ini meneroka kekangan jenis adat Go untuk generik. Ia memperincikan bagaimana antara muka menentukan keperluan jenis minimum untuk fungsi generik, meningkatkan keselamatan jenis dan kebolehgunaan semula kod. Artikel ini juga membincangkan batasan dan amalan terbaik

Artikel ini meneroka menggunakan alat pengesanan untuk menganalisis aliran pelaksanaan aplikasi GO. Ia membincangkan teknik instrumentasi manual dan automatik, membandingkan alat seperti Jaeger, Zipkin, dan OpenTelemetry, dan menonjolkan visualisasi data yang berkesan

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Artikel ini membincangkan pakej GO's Reflect, yang digunakan untuk manipulasi kod runtime, bermanfaat untuk siri, pengaturcaraan generik, dan banyak lagi. Ia memberi amaran tentang kos prestasi seperti pelaksanaan yang lebih perlahan dan penggunaan memori yang lebih tinggi, menasihati penggunaan yang bijak dan terbaik

Artikel ini membincangkan menggunakan ujian yang didorong oleh jadual di GO, satu kaedah yang menggunakan jadual kes ujian untuk menguji fungsi dengan pelbagai input dan hasil. Ia menyoroti faedah seperti kebolehbacaan yang lebih baik, penurunan duplikasi, skalabiliti, konsistensi, dan a

Artikel ini menerangkan cara menggunakan Sync.WaitGroup dalam GO untuk menguruskan operasi serentak, memperincikan permulaan, penggunaan, perangkap biasa, dan amalan terbaik.
