返回顶部
首页 > 资讯 > 精选 >高斯模糊实现会产生奇怪的输出
  • 337
分享到

高斯模糊实现会产生奇怪的输出

overflow 2024-02-11 08:02:12 337人浏览 独家记忆
摘要

PHP小编鱼仔指出,高斯模糊是一种常用的图像处理技术,可以使图像变得模糊,常用于美化照片或实现特效。然而,如果不正确地实现高斯模糊算法,可能会产生奇怪的输出。这可能包括图像失真、边缘模

PHP小编鱼仔指出,高斯模糊是一种常用的图像处理技术,可以使图像变得模糊,常用于美化照片或实现特效。然而,如果不正确地实现高斯模糊算法,可能会产生奇怪的输出。这可能包括图像失真、边缘模糊或色彩偏移等问题。因此,在使用高斯模糊技术时,必须注意算法的正确实现,以确保获得预期的输出效果。

问题内容

我正在尝试在 golang image.image 对象上实现高斯模糊。对于以下图像:

生成的输出图像为:

正如人们所看到的,输出图像包含一些未处理的边界,这些边界对应于当前不处理边缘的实现决策,这让我认为我可能在某种程度上搞砸了计算(我的意思是,这部分实现的工作原理,因此我可以在迭代图像像素时丢弃差一错误)。我已经多次检查了这段代码,但我找不到我的错误。我非常感谢有关实施的一些帮助和考虑,这可以帮助我解决问题。代码包含在下面。如果需要任何编辑或澄清,请告诉我!

package main

import (
    "image"
    "image/color"
    "image/draw"
    "image/jpeg"
    "math"
    "os"
)

func main() {
    f, err := os.Open("dog.jpeg")
    if err != nil {
        panic(err)
    }

    img, err := jpeg.Decode(f)
    if err != nil {
        panic(err)
    }

    newImg := gaussianBlur(img, 3)

    out, err := os.Create("dog-blurred.jpeg")
    if err != nil {
        panic(err)
    }

    err = jpeg.Encode(out, newImg, nil)
    if err != nil {
        panic(err)
    }
}

func applyGaussianFunction(x, y, stdDev float64) float64 {
    // eFactor := 1 / (2 * math.Pi * stdDev*stdDev);
    ePowNominator := -(x*x + y*y);
    ePowDenominator := 2 * stdDev*stdDev;

    return math.Pow(math.E, (ePowNominator/ePowDenominator));
}

func generateKernel(radius int) [][]float64 {
    size := 1 + (radius * 2);
    kernel := make([][]float64, size);
    stdDev := math.Max(float64(radius / 2), 1);

    sum := float64(0);

    for i := 0; i < size; i++ {
        kernel[i] = make([]float64, size);
    }

    for i := -radius; i < radius + 1; i++ {
        for j := -radius; j < radius + 1; j++ {
            val := applyGaussianFunction(float64(j), float64(i), stdDev);
            kernel[i + radius][j + radius] = val;
            sum += val;
        }
    }

    for i := 0; i < size; i++ {
        for j := 0; j < size; j++ {
            kernel[i][j] /= sum;
        }
    }

    return kernel;
}

func makeImageRGBA(src image.Image) *image.RGBA {
    b := src.Bounds().Size();
    rgba := image.NewRGBA(image.Rect(0, 0, b.X, b.Y));
    draw.Draw(rgba, rgba.Bounds(), src, image.Pt(0, 0), draw.Src);

    return rgba;
}

func gaussianBlur(img image.Image, radius int) image.Image {
    size := img.Bounds().Size();
    rgbaImg := image.NewRGBA(image.Rect(0, 0, size.X, size.Y));

    kernel := generateKernel(radius);

    for y := radius; y < size.Y - radius; y++ {
        for x := radius; x < size.X - radius; x++ {
            var nr, ng, nb, na float64 = 0, 0, 0, 0;

            for i := -radius; i < radius + 1; i++ {
                for j := -radius; j < radius + 1; j++ {
                    // NEW: Get pixels from original Image
                    pr, pg, pb, pa := img.At(x - j, y - i).RGBA();

                    nr += float64(pr) * kernel[i + radius][j + radius];
                    ng += float64(pg) * kernel[i + radius][j + radius];
                    nb += float64(pb) * kernel[i + radius][j + radius];
                    na += float64(pa) * kernel[i + radius][j + radius];
                }
            }

            // Handle overflow by using 64-bit alphapremultiplied values
            rgbaImg.Set(x, y, color.RGBA64{uint16(nr), uint16(ng), uint16(nb), uint16(na)});
        }
    }

    return rgbaImg;
}

编辑

  • 我修改了代码,以便从原始图像中读取像素,而不是从 rgbaimg
  • 我还从 applygaussianfunction 函数注释了 efactor,因为我已经使用 sum 变量规范化内核
  • 修改了 .set 方法以使用 64 位 rgba 结构

这是新生成的图像

那些黑色边框很容易解决,我已经在解决它们了。这不再是问题的一部分。

解决方法

您正在从正在写入的同一图像中读取内容。您应该从原始图像中读取:

pr, pg, pb, pa := img.at(x+j, y+i).rgba()

编辑: 此外, image.at 返回 color.rgba,而 func (color.rgba) rgba 返回0 到 0xffff 范围。然而 color.rgba 构造函数期望它们在 0 到 255 范围内。在写入结果时,您可能需要使用 color.rgba64

rgbaImg.Set(x, y, color.RGBA64{uint16(nr), uint16(ng), uint16(nb), uint16(na)});

以上就是高斯模糊实现会产生奇怪的输出的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 高斯模糊实现会产生奇怪的输出

本文链接: https://lsjlt.com/news/563399.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 高斯模糊实现会产生奇怪的输出
    php小编鱼仔指出,高斯模糊是一种常用的图像处理技术,可以使图像变得模糊,常用于美化照片或实现特效。然而,如果不正确地实现高斯模糊算法,可能会产生奇怪的输出。这可能包括图像失真、边缘模...
    99+
    2024-02-11
    overflow
  • AndroidFlutter图片处理之高斯模糊的实现
    目录ImageFilter横向模糊垂直模糊xy轴同时模糊用法BackdropFilterImageFiltered区别ImageFilter 在Flutter中,使图片模糊有2种方式...
    99+
    2022-11-13
    Android Flutter高斯模糊 Android 高斯模糊 Flutter 高斯模糊
  • Android实现图片的高斯模糊(两种方式)
    在市面上很多的APP都使用了对图片作模糊化处理后作为背景的效果,来使得整个页面更具有整体感。如下就是网易云音乐的音乐播放页面: 很明显这个页面的背景是由中间的小图片模糊化后而...
    99+
    2022-06-06
    图片 高斯 高斯模糊 Android
  • Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法
    在前几天写过一个使用glide-transformations的方法实现高斯模糊的方法,今天偶然间有发现一个大神写的另一个方法,感觉挺不错的,分享一下: 效果图: 原文链接:...
    99+
    2022-06-06
    方法 图片 高斯 高斯模糊 毛玻璃 Android
  • 怎么用css3实现图片的高斯模糊效果
    小编给大家分享一下怎么用css3实现图片的高斯模糊效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!    ...
    99+
    2024-04-02
  • OpenCV实现灰度、高斯模糊、边缘检测的示例
    一、彩色图像转灰度 Opencv提供了一个方法,可以使彩色图像变为灰度图像。 函数名:cvtColor(src,dest,way); src表示初始的mat对象; dest表示转换...
    99+
    2024-04-02
  • 如何进行图片JNI C++\Java高斯模糊的实现
    这篇文章将为大家详细讲解有关如何进行图片JNI C++\Java高斯模糊的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。开工吧说明:其中代码大部分来源于网络,不过都是开源的。最原始的代码...
    99+
    2023-06-19
  • Java怎样实现高斯模糊和图像的空间卷积
    这期内容当中小编将会给大家带来有关Java怎样实现高斯模糊和图像的空间卷积,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe ...
    99+
    2023-06-17
  • Java如何实现高斯模糊和图像的空间卷积
    这篇文章主要介绍Java如何实现高斯模糊和图像的空间卷积,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以...
    99+
    2023-05-30
    java
  • OpenCV利用高斯模糊实现简单的磨皮美颜效果
    目录1.高斯模糊1.什么是高斯模糊2.opencv提供的API2.双边模糊1.什么是双边模糊2.opencv的API3.磨皮美颜效果的实现1.实现过程2.主要代码3.效果1.高斯模糊...
    99+
    2024-04-02
  • C语言实现输出平均成绩最高学生的信息
    目录列: 有n个结构体变量,内含学生的学号,学号,和三门成绩。要求输出平均成绩最高学生的信息(包括学号、姓名、三门课程成绩和平均成绩) 解题思路: 将n个学生的数据表示为结构体...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作