Leetcode Note: Go - Image Smoother

Image Smoother - LeetCode
https://leetcode.com/problems/image-smoother/

  • Go 言語で取り組んだメモ

所感

  • 3 x 3 サイズのフィルターで、対象セルと周囲の 8 マスの平均値を切り捨てて、画像の各マスに適用を行う
    • 端を対象とする場合は、存在するマスでの平均とする
  • 画像のグレースケールを表す m x n 行列 img を指定すると、その各マスにスムーザーを適用した後の画像となる行列を return する

回答

Image Smoother - LeetCode
https://leetcode.com/problems/image-smoother/solution/

Go 44ms 100% solution - LeetCode Discuss
https://leetcode.com/problems/image-smoother/discuss/507195/Go-44ms-100-solution

func imageSmoother(M [][]int) [][]int {
    processedImage := make([][]int, len(M))
    for i := range processedImage {
        processedImage[i] = make([]int, len(M[0]))
    }
    for i := range processedImage {
        for j := range processedImage[i] {
            processedImage[i][j] = average(M, i, j)
        }
    }
    return processedImage
}

func average(M [][]int, i, j int) int {
    count, summary := 0, 0
    for m := i-1; m <= i+1; m++ {
        for n := j-1; n <= j+1; n++ {
            if v, exist := gray(M, m, n); exist {
                count++
                summary += v
            }
        }
    }
    return summary / count
}

func gray(M [][]int, i, j int) (int, bool) {
    if i < 0 || i >= len(M) || j < 0 || j >= len(M[0]) {
        return 0, false
    }
    return M[i][j], true
}