Rumah pembangunan bahagian belakang Golang Manipulasi imej Golang: Ketahui cara melakukan penyamaan histogram dan ambang global imej

Manipulasi imej Golang: Ketahui cara melakukan penyamaan histogram dan ambang global imej

Aug 18, 2023 pm 02:49 PM
Manipulasi gambar golang (go) Penyamaan histogram

Manipulasi imej Golang: Ketahui cara melakukan penyamaan histogram dan ambang global imej

Operasi Imej Golang: Ketahui cara melakukan penyamaan histogram dan ambang global imej

Pengenalan:
Pemprosesan imej adalah salah satu tugas penting dalam bidang penglihatan komputer dan pemprosesan imej. Dalam aplikasi praktikal, kita selalunya perlu melakukan beberapa operasi peningkatan imej untuk meningkatkan kualiti imej atau menyerlahkan ciri tertentu dalam imej. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan penyamaan histogram dan operasi ambang global pada imej untuk mencapai peningkatan imej.

1. Penyamaan histogram
Penyamaan histogram ialah kaedah peningkatan imej yang biasa digunakan Ia meningkatkan kontras imej dengan melaraskan taburan skala kelabu piksel imej. Dalam kaedah ini, kita mula-mula mengira histogram kumulatif imej, dan kemudian melaraskan nilai piksel imej berdasarkan histogram terkumpul.

Berikut ialah contoh kod Golang mudah untuk melaksanakan penyamaan histogram imej:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/jpeg"
    "os"
)

func main() {
    // 打开图片文件
    file, err := os.Open("input.jpg")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()

    // 解码图片
    img, _, err := image.Decode(file)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 计算直方图
    hist := histogram(img)

    // 计算累积直方图
    cumHist := cumulativeHistogram(hist)

    // 根据累积直方图对图像进行像素值调整
    newImg := adjustPixels(img, cumHist)

    // 保存处理后的图像
    outFile, err := os.Create("output.jpg")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer outFile.Close()

    // 编码图像
    err = jpeg.Encode(outFile, newImg, &jpeg.Options{Quality: 100})
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println("图像处理完成!")
}

// 计算直方图
func histogram(img image.Image) []int {
    bounds := img.Bounds()
    w, h := bounds.Max.X, bounds.Max.Y
    hist := make([]int, 256)

    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            r, _, _, _ := img.At(x, y).RGBA()
            gray := color.Gray{uint8(r / 256)}
            hist[gray.Y]++
        }
    }

    return hist
}

// 计算累积直方图
func cumulativeHistogram(hist []int) []int {
    cumHist := make([]int, len(hist))
    cumHist[0] = hist[0]

    for i := 1; i < len(hist); i++ {
        cumHist[i] = cumHist[i-1] + hist[i]
    }

    return cumHist
}

// 根据累积直方图调整像素值
func adjustPixels(img image.Image, cumHist []int) image.Image {
    bounds := img.Bounds()
    w, h := bounds.Max.X, bounds.Max.Y
    newImg := image.NewRGBA(bounds)

    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            r, g, b, a := img.At(x, y).RGBA()

            gray := color.Gray{uint8(r / 256)}
            val := uint8(float64(cumHist[gray.Y]) / float64(w*h) * 255)

            newImg.Set(x, y, color.RGBA{val, val, val, uint8(a / 256)})
        }
    }

    return newImg
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula lulus Decode pakej image Fungsi menyahkod fail imej input kepada objek jenis image.Image. Kemudian, kami memanggil fungsi histogram untuk mengira histogram imej dan fungsi kumulatifHistogram untuk mengira histogram kumulatif imej. Akhir sekali, kami melaraskan nilai piksel imej berdasarkan histogram terkumpul dan menyimpan imej yang diproses ke fail menggunakan fungsi Encode pakej jpeg. image包的Decode函数将输入图像文件解码为image.Image类型的对象。然后,我们分别调用histogram函数计算图像的直方图,cumulativeHistogram函数计算图像的累积直方图。最后,我们根据累积直方图调整图像的像素值,并使用jpeg包的Encode函数将处理后的图像保存到文件中。

二、全局阈值化
全局阈值化是一种简单但有效的图像二值化方法,它将图像的像素值分为两个互不重叠的光滑区域,分别代表目标物体和背景。这种方法通常应用于具有明显的前景和背景差异的图像。

下面是一个简单的Golang代码示例,用于实现图像的全局阈值化:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/jpeg"
    "os"
)

func main() {
    // 打开图片文件
    file, err := os.Open("input.jpg")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()

    // 解码图片
    img, _, err := image.Decode(file)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 根据全局阈值对图像进行二值化处理
    newImg := binarize(img)

    // 保存处理后的图像
    outFile, err := os.Create("output.jpg")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer outFile.Close()

    // 编码图像
    err = jpeg.Encode(outFile, newImg, &jpeg.Options{Quality: 100})
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println("图像处理完成!")
}

// 根据全局阈值对图像进行二值化处理
func binarize(img image.Image) image.Image {
    bounds := img.Bounds()
    w, h := bounds.Max.X, bounds.Max.Y
    newImg := image.NewRGBA(bounds)

    threshold := calculateThreshold(img)

    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            r, g, b, a := img.At(x, y).RGBA()

            gray := color.Gray{uint8(r / 256)}
            var val uint8
            if gray.Y > threshold {
                val = 255
            } else {
                val = 0
            }

            newImg.Set(x, y, color.RGBA{val, val, val, uint8(a / 256)})
        }
    }

    return newImg
}

// 根据图像的直方图计算全局阈值
func calculateThreshold(img image.Image) uint8 {
    hist := histogram(img)
    totalPixels := img.Bounds().Max.X * img.Bounds().Max.Y

    // 计算背景像素值的总和
    var bgSum, bgCount, fgSum, fgCount int
    for i := 0; i < len(hist); i++ {
        if i <= 128 {
            bgSum += i * hist[i]
            bgCount += hist[i]
        } else {
            fgSum += i * hist[i]
            fgCount += hist[i]
        }
    }

    // 计算背景和前景的平均灰度值
    bgMean := bgSum / bgCount
    fgMean := fgSum / fgCount

    // 根据背景和前景的平均灰度值计算阈值
    return uint8((bgMean + fgMean) / 2)
}

// 计算直方图
func histogram(img image.Image) []int {
    bounds := img.Bounds()
    w, h := bounds.Max.X, bounds.Max.Y
    hist := make([]int, 256)

    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            r, _, _, _ := img.At(x, y).RGBA()
            gray := color.Gray{uint8(r / 256)}
            hist[gray.Y]++
        }
    }

    return hist
}
Salin selepas log masuk

在上述代码中,我们首先通过image包的Decode函数将输入图像文件解码为image.Image类型的对象。然后,我们调用calculateThreshold函数计算图像的全局阈值。最后,我们根据全局阈值将图像进行二值化处理,并使用jpeg包的Encode

2. Ambang global

Ambang global ialah kaedah perduaan imej yang mudah tetapi berkesan Ia membahagikan nilai piksel imej kepada dua kawasan licin tidak bertindih, masing-masing mewakili objek sasaran dan latar belakang. Kaedah ini biasanya digunakan pada imej dengan perbezaan latar depan dan latar belakang yang jelas.

Berikut ialah contoh kod Golang mudah untuk ambang global imej: 🎜rrreee🎜Dalam kod di atas, kami mula-mula lulus fungsi Decode pakej image Decode the masukkan fail imej ke dalam objek jenis image.Image. Kemudian, kami memanggil fungsi calculateThreshold untuk mengira ambang global imej. Akhir sekali, kami menduakan imej mengikut ambang global dan menyimpan imej yang diproses ke fail menggunakan fungsi Encode bagi pakej jpeg. 🎜🎜Ringkasan: 🎜Dalam artikel ini kami memperkenalkan cara menggunakan Golang untuk melaksanakan penyamaan histogram dan operasi ambang global pada imej. Penyamaan histogram boleh digunakan untuk meningkatkan kontras imej, menjadikan imej lebih jelas dan lebih jelas ambang global boleh digunakan untuk menukar imej kepada imej binari untuk menyerlahkan objek sasaran dalam imej. Dengan menggunakan kedua-dua kaedah ini secara fleksibel, kami boleh mencapai peningkatan imej dan pengekstrakan ciri untuk memenuhi pelbagai keperluan aplikasi. Dalam aplikasi praktikal, kami boleh menggabungkan dengan algoritma pemprosesan imej lain untuk meningkatkan lagi kesan dan kualiti pemprosesan imej. 🎜

Atas ialah kandungan terperinci Manipulasi imej Golang: Ketahui cara melakukan penyamaan histogram dan ambang global imej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Mengapa Golang sesuai untuk pembangunan AI? Mengapa Golang sesuai untuk pembangunan AI? Sep 08, 2023 pm 01:54 PM

Mengapa Golang sesuai untuk pembangunan AI?

Manipulasi imej Golang: bagaimana untuk mencerminkan, memutar dan membalikkan imej Manipulasi imej Golang: bagaimana untuk mencerminkan, memutar dan membalikkan imej Aug 25, 2023 pm 10:31 PM

Manipulasi imej Golang: bagaimana untuk mencerminkan, memutar dan membalikkan imej

Operasi imej PHP: bagaimana untuk mendapatkan saiz dan saiz fail imej Operasi imej PHP: bagaimana untuk mendapatkan saiz dan saiz fail imej Aug 26, 2023 am 08:55 AM

Operasi imej PHP: bagaimana untuk mendapatkan saiz dan saiz fail imej

Manipulasi imej Golang: Cara melakukan pemetaan kecerunan dan tekstur imej Manipulasi imej Golang: Cara melakukan pemetaan kecerunan dan tekstur imej Aug 22, 2023 pm 12:33 PM

Manipulasi imej Golang: Cara melakukan pemetaan kecerunan dan tekstur imej

Pembangunan Golang: membina sistem storan fail teragih Pembangunan Golang: membina sistem storan fail teragih Sep 22, 2023 am 08:00 AM

Pembangunan Golang: membina sistem storan fail teragih

Manipulasi imej Golang: cara melaraskan kecerahan dan kontras Manipulasi imej Golang: cara melaraskan kecerahan dan kontras Aug 19, 2023 pm 04:53 PM

Manipulasi imej Golang: cara melaraskan kecerahan dan kontras

Manipulasi imej Golang: Cara melakukan keseimbangan warna dan penukaran warna pada imej Manipulasi imej Golang: Cara melakukan keseimbangan warna dan penukaran warna pada imej Aug 19, 2023 am 09:21 AM

Manipulasi imej Golang: Cara melakukan keseimbangan warna dan penukaran warna pada imej

Analisis senario aplikasi Goroutines dalam amalan pengaturcaraan serentak Golang Analisis senario aplikasi Goroutines dalam amalan pengaturcaraan serentak Golang Jul 18, 2023 pm 05:21 PM

Analisis senario aplikasi Goroutines dalam amalan pengaturcaraan serentak Golang

See all articles