日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL高斯模糊

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL高斯模糊 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

高斯模糊

  • 簡介
    • 描述
    • 高斯分布
    • 高斯函數(shù)
      • 模糊半徑
      • 卷積運算
        • 卷積核
        • 原圖像
        • 卷積結(jié)果
        • 細節(jié)
      • 高斯函數(shù)卷積核
  • 實現(xiàn)
    • Python計算卷積核
    • OpenGL卷積核實現(xiàn)
    • OpenGL高斯模糊優(yōu)化

簡介

描述

高斯模糊:使用高斯函數(shù)求出的值來作為卷積核進行圖像的卷積運算。

卷積核總結(jié)

  • 對圖像進行降維以及特征提取,一般用于人工智能。
  • 行數(shù)和列數(shù)均為奇數(shù)的矩陣。
  • 卷積核元素的總和體現(xiàn)出輸出的亮度。
  • 高斯分布


    f(x)=12πσ2e?(x?μ)22σ2f(x)=\frac{1}{\sqrt{2\pi\sigma^2}} {e^{-\frac{(x-\mu)^2}{2\sigma^2}}} f(x)=2πσ2?1?e?2σ2(x?μ)2?

    高斯函數(shù)

    G(r)=12πσ2Ne?r22σ2G(r)=\frac{1}{\sqrt{2\pi\sigma^2}^{N}} {e^{-\frac{r^2}{2\sigma^2}}} G(r)=2πσ2?N1?e?2σ2r2?
    σ\sigmaσ是正態(tài)函數(shù)的標準差, rrr代表模板中元素到模板中心的距離,又稱為模糊半徑NNN代表處于NNN維空間。

    模糊半徑

    定義:歐式距離(N維向量的模)

    歐幾里得度量(euclidean metric)也稱歐氏距離,是一個通常采用的距離定義,指在m維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。

    卷積運算

    卷積核

    原圖像

    卷積結(jié)果

    從原圖像中提取與卷積同等大小的矩陣卷積核進行矩陣相乘運算。
    6=(0?2+0)+(?2+20?8)+(0?2+0)6=(0-2+0)+(-2+20-8)+(0-2+0) 6=(0?2+0)+(?2+20?8)+(0?2+0)

    細節(jié)

    卷積處理后,圖像的每條邊少了一個像素

    解決:將已有的點拷貝到另一面的對應(yīng)位置,也就是填充邊。

    高斯函數(shù)卷積核

    假設(shè)σ=1.5\sigma=1.5σ=1.5,高斯卷積核如下。

    實現(xiàn)

    Python計算卷積核

    import mathpi = 3.1415926 sigma = 1.5 e = 2.7182804def G(r):return (1 / pow(math.sqrt(2 * pi * pow(sigma, 2)), 2)) * pow(e, -((r*r) / (2 * pow(sigma, 2))))print("G(2) = %.7f" % G(2)) # G(2) = 0.0290803 print("G(1) = %.7f" % G(1)) # G(1) = 0.0566406 print("G(0) = %.7f" % G(0)) # G(0) = 0.0707355

    OpenGL卷積核實現(xiàn)

    #iChannel0 "file://images/img.jpg" // 與shader腳本文件在同級目錄下// 高斯函數(shù)用到的常量 const float pi = 3.1415926; const float sigma = 1.5; const float e = 2.7182804;// 高斯函數(shù), r為歐式距離 float G(float r) {return (1.0 / pow(sqrt(2.0 * pi * pow(sigma, 2.0)), 2.0)) * pow(e, -((r*r) / (2.0 * pow(sigma, 2.0)))); }// 主函數(shù) void mainImage(out vec4 fragColor, in vec2 fragCoord) {// 計算uv, iResolution.xy是screen大小vec2 uv = fragCoord.xy / iResolution.xy;// 模擬像素vec2 pixed = 2.0 / iResolution.xy;// 相鄰像素的uvvec2 texcoords[9];texcoords[0] = uv + vec2(-1.0, -1.0) * pixed;texcoords[1] = uv + vec2(0.0, -1.0) * pixed;texcoords[2] = uv + vec2(1.0, -1.0) * pixed;texcoords[3] = uv + vec2(-1.0, 0.0) * pixed;texcoords[4] = uv + vec2(0.0, 0.0) * pixed;texcoords[5] = uv + vec2(1.0, 0.0) * pixed;texcoords[6] = uv + vec2(-1.0, 1.0) * pixed;texcoords[7] = uv + vec2(0.0, 1.0) * pixed;texcoords[8] = uv + vec2(1.0, 1.0) * pixed;// 相鄰像素對應(yīng)的權(quán)重, 卷積核float w[9];w[0] = w[2] = w[6] = w[8] = G(2.0);w[1] = w[3] = w[5] = w[7] = G(1.0);w[4] = G(0.0);// 權(quán)重總和, 用來歸一化卷積核float totalWeight = w[0] * 4.0 + w[1] * 4.0 + w[4];// 卷積運算vec4 gaussColor = vec4(0.0);for (int i = 0; i < 9; i++) {gaussColor += texture2D(iChannel0, texcoords[i]) * w[i] / totalWeight;}// 原圖vec4 originalColor = texture2D(iChannel0, uv);// sin + time動態(tài)變化float normalTime = abs(sin(iTime));// mix輸出顏色fragColor = mix(originalColor, gaussColor, normalTime); }

    OpenGL高斯模糊優(yōu)化

    優(yōu)化點

    • 在片元著色器會重復計算卷積核,比較耗時;可以放在CPU計算,傳給shader。
    • 3×33 \times 33×3卷積就需要在片元中紋理采樣9次,可以降低為6次。
    • 先進行橫向模糊,采樣3次,存儲橫向結(jié)果texture。
    • 橫向結(jié)果texture再進行縱向模糊,采樣3次。

    總結(jié)

    以上是生活随笔為你收集整理的OpenGL高斯模糊的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。