Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan Golang untuk menyamakan kecerahan dan menyahwarna imej

Cara menggunakan Golang untuk menyamakan kecerahan dan menyahwarna imej

王林
王林asal
2023-08-18 17:01:131387semak imbas

. Penyamaan kecerahan merujuk kepada melaraskan kecerahan imej kepada julat yang sesuai untuk meningkatkan kesan visual imej. Proses penyahwarnaan mengalih keluar maklumat warna imej dan mengekalkan hanya maklumat skala kelabu, yang digunakan untuk beberapa senario aplikasi khas.

Cara menggunakan Golang untuk menyamakan kecerahan dan menyahwarna imejArtikel ini akan memperkenalkan cara menggunakan bahasa pengaturcaraan Golang untuk mencapai penyamaan kecerahan dan penyahwarnaan imej.

2. Keseimbangan Kecerahan

Matlamat keseimbangan kecerahan adalah untuk melaraskan julat kecerahan imej daripada ekstrem yang lebih gelap atau lebih terang kepada julat yang sesuai. Algoritma penyamaan kecerahan biasa ialah penyamaan histogram.

Berikut ialah contoh kod yang menunjukkan cara menggunakan Golang untuk melaksanakan algoritma penyamaan histogram:

package main

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

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

    // 解码图片
    img, err := jpeg.Decode(file)
    if err != nil {
        log.Fatal(err)
    }

    // 创建一个新的灰度图像
    bounds := img.Bounds()
    gray := image.NewGray(bounds)

    // 计算每个灰度级的像素个数
    count := make([]int, 256)
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            grayColor := color.GrayModel.Convert(img.At(x, y)).(color.Gray)
            count[grayColor.Y]++
        }
    }

    // 计算累积分布函数
    cdf := make([]int, 256)
    cdf[0] = count[0]
    for i := 1; i < 256; i++ {
        cdf[i] = cdf[i-1] + count[i]
    }

    // 将累积分布函数映射到[0, 255]的范围
    for i := 0; i < 256; i++ {
        cdf[i] = cdf[i] * 255 / (bounds.Dx() * bounds.Dy())
    }

    // 对每个像素进行亮度均衡化处理
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            grayColor := color.GrayModel.Convert(img.At(x, y)).(color.Gray)
            grayColor.Y = uint8(cdf[grayColor.Y])
            gray.Set(x, y, grayColor)
        }
    }

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

    err = jpeg.Encode(outputFile, gray, nil)
    if err != nil {
        log.Fatal(err)
    }
}

Dalam kod di atas, kami mula-mula membuka fail imej dan kemudian menyahkodnya menjadi objek imej. Seterusnya, kami mencipta objek imej skala kelabu baharu dan mengira bilangan piksel untuk setiap tahap skala kelabu dalam imej asal. Seterusnya, kami mengira fungsi pengedaran kumulatif dan memetakannya ke julat [0, 255]. Akhir sekali, kami melakukan penyamaan kecerahan pada setiap piksel dan menyimpan imej yang diproses.

3. Penyahwarnaan

Penyahwarnaan membuang maklumat warna imej dan hanya mengekalkan maklumat skala kelabu. Berikut ialah contoh kod yang menunjukkan cara menggunakan Golang untuk melaksanakan penyahwarnaan:

package main

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

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

    // 解码图片
    img, err := jpeg.Decode(file)
    if err != nil {
        log.Fatal(err)
    }

    // 创建一个新的灰度图像
    bounds := img.Bounds()
    gray := image.NewGray(bounds)

    // 对每个像素进行去色处理
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            grayColor := color.GrayModel.Convert(img.At(x, y)).(color.Gray)
            grayColor.Y = uint8(grayColor.Y)
            gray.Set(x, y, grayColor)
        }
    }

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

    err = jpeg.Encode(outputFile, gray, nil)
    if err != nil {
        log.Fatal(err)
    }
}

Dalam kod di atas, kami menggunakan kaedah yang sama untuk membuka dan menyahkod fail imej dan mencipta objek imej skala kelabu baharu. Kemudian, kami menyahwarna setiap piksel, iaitu, menetapkan maklumat warna piksel kepada maklumat skala kelabu piksel. Akhirnya, kami menyimpan imej yang diproses.

4. Ringkasan

Artikel ini memperkenalkan cara menggunakan Golang untuk mencapai penyamaan kecerahan dan penyahwarnaan imej. Melalui algoritma penyamaan histogram dan algoritma pemprosesan penyahwarnaan, kami boleh melaraskan kecerahan imej dengan berkesan dan mengeluarkan maklumat warna imej. Menggunakan Golang untuk melaksanakan fungsi pemprosesan imej boleh memproses sejumlah besar data imej dengan pantas dan cekap untuk memenuhi keperluan pelbagai senario aplikasi praktikal. Saya harap artikel ini dapat membantu pembaca memahami dan menggunakan algoritma pemprosesan imej.

Atas ialah kandungan terperinci Cara menggunakan Golang untuk menyamakan kecerahan dan menyahwarna imej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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