>  기사  >  백엔드 개발  >  Golang 이미지 조작: 히스토그램 평준화 및 이미지의 전역 임계값 지정을 수행하는 방법 알아보기

Golang 이미지 조작: 히스토그램 평준화 및 이미지의 전역 임계값 지정을 수행하는 방법 알아보기

王林
王林원래의
2023-08-18 14:49:52649검색

Golang 이미지 조작: 히스토그램 평준화 및 이미지의 전역 임계값 지정을 수행하는 방법 알아보기

Golang 이미지 작업: 이미지의 히스토그램 평준화 및 전역 임계값 지정을 수행하는 방법을 알아보세요.

소개:
이미지 처리는 컴퓨터 비전 및 이미지 처리 분야에서 중요한 작업 중 하나입니다. 실제 응용 프로그램에서는 이미지 품질을 향상하거나 이미지의 특정 특징을 강조하기 위해 일부 이미지 향상 작업을 수행해야 하는 경우가 많습니다. 이 기사에서는 Golang을 사용하여 이미지 향상을 달성하기 위해 이미지에 대한 히스토그램 균등화 및 전역 임계값 작업을 수행하는 방법을 소개합니다.

1. 히스토그램 평준화
히스토그램 평준화는 일반적으로 사용되는 이미지 향상 방법으로 이미지 픽셀의 회색조 분포를 조정하여 이미지의 대비를 향상시킵니다. 이 방법에서는 먼저 이미지의 누적 히스토그램을 계산한 후, 누적 히스토그램을 기반으로 이미지의 픽셀 값을 조정합니다.

다음은 이미지의 히스토그램 평준화를 구현하기 위한 간단한 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
    }

    // 计算直方图
    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
}

위 코드에서는 먼저 image 패키지의 Decode를 전달합니다. 입력 이미지 파일을 image.Image 유형의 객체로 디코딩합니다. 그런 다음 histogram 함수를 호출하여 이미지의 히스토그램을 계산하고 cumulativeHistogram 함수를 호출하여 이미지의 누적 히스토그램을 계산합니다. 마지막으로 누적 히스토그램을 기반으로 이미지의 픽셀 값을 조정하고 jpeg 패키지의 Encode 기능을 사용하여 처리된 이미지를 파일로 저장합니다. 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
}

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

2. 전역 임계값

전역 임계값은 간단하지만 효과적인 이미지 이진화 방법입니다. 이는 이미지의 픽셀 값을 겹치지 않는 두 개의 부드러운 영역으로 나누어 각각 대상 개체와 배경을 나타냅니다. 이 방법은 일반적으로 전경과 배경의 차이가 뚜렷한 이미지에 적용됩니다.

다음은 이미지의 전역 임계값 지정을 위한 간단한 Golang 코드 예입니다. 🎜rrreee🎜위 코드에서는 먼저 image 패키지의 Decode 함수를 전달합니다. 이미지 파일을 image.Image 유형의 객체에 입력합니다. 그런 다음 calculateThreshold 함수를 호출하여 이미지의 전역 임계값을 계산합니다. 마지막으로 전역 임계값에 따라 이미지를 이진화하고 jpeg 패키지의 Encode 기능을 사용하여 처리된 이미지를 파일에 저장합니다. 🎜🎜요약: 🎜이 기사에서는 Golang을 사용하여 이미지에 대한 히스토그램 균등화 및 전역 임계값 연산을 수행하는 방법을 소개했습니다. 히스토그램 균등화를 사용하면 이미지의 대비를 개선하여 이미지를 더 명확하고 뚜렷하게 만들 수 있습니다. 전역 임계값을 사용하면 이미지를 이진 이미지로 변환하여 이미지의 대상 개체를 강조할 수 있습니다. 이 두 가지 방법을 유연하게 사용함으로써 다양한 애플리케이션 요구 사항을 충족하는 이미지 향상 및 특징 추출을 달성할 수 있습니다. 실제 응용 분야에서는 다른 이미지 처리 알고리즘을 결합하여 이미지 처리의 효과와 품질을 더욱 향상시킬 수 있습니다. 🎜

위 내용은 Golang 이미지 조작: 히스토그램 평준화 및 이미지의 전역 임계값 지정을 수행하는 방법 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.