1. 程式人生 > >OpenCV—Python 導向濾波

OpenCV—Python 導向濾波

一、導向濾波原理

導向濾波是使用導向影象作為濾波內容影象,在導向影象上實現區域性線性函式表達,實現各種不同的線性變換,輸出變形之後的導向濾波影象。根據需要,導向影象可以跟輸入影象不同或者一致。

公式及推導

假設 II 是導向影象、pp 是輸入影象、qq 是導向濾波輸出影象;導向濾波是作為區域性線性模型描述 導向影象 II輸出影象 qq 之間的關係。

對於任意畫素 I\rm I 來說,ωk\omega_k視窗下的線性變換可以表述如下:
qi=akIi+bkq_i = a_k I_i + b_k 其中 (ak,bk)(a_k,b_k)

k)是視窗 ωk\omega_k 範圍內的引數常量。
為了尋找線性相關性,視窗 ωk\omega_k 定義的損失函式為:
E(ak,bk)=iωk((akIi+bkpi)2+ϵak2)E(a_k,b_k) = \sum_{i \in \omega_k} ((a_k I_i + b_k-p_i)^2+\epsilon a_k^2)
其中:
ωk\omega_k是對 aka_k 值過大時侯的正則化補償。
εak2\varepsilon a_k^2 是抑制 aka_k 值過大的。
ε\varepsilon 是調整圖的模糊程度與邊緣檢測精度的引數。
如果導向圖 I\rm I 沒有邊緣資訊,輸出均值模糊結果;
如果導向圖 I\rm I 包含邊緣資訊,邊緣資訊則遷移到輸出影象中實現邊緣保留濾波;
上述的損失函式可以被看成一個線性迴歸問題,其中兩個引數的求解如下:

  • ak=1ωkiωkIiPiμkpˉkσk2+ϵa_k = \frac{\frac{1}{\omega_k}\sum_{i \in \omega_k} I_iP_i-\mu_k \bar{p}_k}{\sigma_k^2 + \epsilon}

    iPiμkpˉk

  • bk=pˉkakμkb_k = \bar{p}_k - a_k\mu_k

  • μk\mu_kσk2\sigma_k^2 是導向圖在 ωk\omega_k 視窗大小均值與方差

  • ω|\omega|表示視窗內畫素總數

  • pˉk=1ωiωkpi\bar{p}_k = \frac{1}{|\omega|}\sum_{i \in \omega_k}p_iωk\omega_k 視窗內輸入影象畫素均值

使用線性相關引數 (ak,bk)(a_k,b_k),濾波輸出影象就可以通過qi=akIi+bkq_i = a_k I_i + b_k 線性模型得到。
針對不同的視窗大小我們就會得到不同的 qiq_i 值,所以通過它的均值作為最終的輸出結果
qi=1ωkiωk(akIi+bk)=aˉiIi+bˉiq_i = \frac{1}{\omega_k}\sum_{i \in \omega_k}(a_k I_i + b_k) = \bar{a}_iI_i+\bar{b}_i

最終導向濾波公式為:
aˉbˉi\bar{a}_,\bar{b}_i 是所有畫素點 ii 上重疊視窗相關因子的均值。

導向濾波演算法實現的一般步驟為:

  1. 讀取導向影象 I\rm I 與 輸入影象 P\rm P
  2. 積分圖計算 I\rm I 的均值與方差、輸入影象 P\rm P的均值、 I\rm IP\rm P的乘積 IP\rm IP
  3. 計算線性相關因子 a\rm ab\rm b
    a=(IPImeanPmean)/(IVar+ϵ)a=(IP-I_{mean}P_{mean})/(I_{Var} +\epsilon )
    b=PmeanaImeanb=P_{mean}-\textrm{a}I_{mean}
  4. 計算a與b的均值
  5. 使用均值得到導向濾波結果 Q=ameanI+bmeanQ = a_{mean}*I+b_{mean}

在這裡插入圖片描述

導向濾波最常用四個功能是:
  • 邊緣保留濾波
  • 影象去噪聲
  • 影象邊緣羽化
  • 影象增強(對比度)
import cv2

def guideFilter(I, p, winSize, eps):

    mean_I = cv2.blur(I, winSize)      # I的均值平滑
    mean_p = cv2.blur(p, winSize)      # p的均值平滑

    mean_II = cv2.blur(I * I, winSize) # I*I的均值平滑
    mean_Ip = cv2.blur(I * p, winSize) # I*p的均值平滑

    var_I = mean_II - mean_I * mean_I  # 方差
    cov_Ip = mean_Ip - mean_I * mean_p # 協方差

    a = cov_Ip / (var_I + eps)         # 相關因子a
    b = mean_p - a * mean_I            # 相關因子b

    mean_a = cv2.blur(a, winSize)      # 對a進行均值平滑
    mean_b = cv2.blur(b, winSize)      
            
           

相關推薦

OpenCVPython 導向濾波

一、導向濾波原理 導向濾波是使用導向影象作為濾波內容影象,在導向影象上實現區域性線性函式表達,實現各種不同的線性變換,輸出變形之後的導向濾波影象。根據需要,導向影象可以跟輸入影象不同或者一致。 公式及推導 假設 III 是導向影象、ppp 是輸入影象、qqq 是

macOS opencv python 影象濾波

opencv python 影象平滑和濾波 1,高斯濾波 1,高斯濾波 #! /usr/local/bin/python3 # coding:utf-8 """ 影象二值化 全域性閥值 """ from PIL import Image im

CUDA加opencv復現導向濾波算法

數組 哈哈 tde 二維數組 grid 深度 lock cat targe   CUDA是GPU通用計算的一種,其中現在大熱的深度學習底層GPU計算差不多都選擇的CUDA,在這我們先簡單了解下其中的一些概念,為了好理解,我們先用DX11裏的Compute shader來和C

CUDA加opencv復現導向濾波演算法

  CUDA是GPU通用計算的一種,其中現在大熱的深度學習底層GPU計算差不多都選擇的CUDA,在這我們先簡單瞭解下其中的一些概念,為了好理解,我們先用DX11裡的Compute shader來和CUDA比較下,這二者都可用於GPU通用計算。   先上一張微軟MSDN上的圖.      Compute

opencv實現導向濾波(GuidedFilter)

何凱明去霧演算法中的導向濾波實現,原文地址導向濾波。 導向影象I,濾波輸入影象p以及輸出影象q。畫素點 i 處的濾波結果是被表達成一個加權平均: 假設導向濾波器在導向影象I和濾波輸出q之間是一個區域性線性模型: 最小化下面的視窗Wk的代價函式: 用來確定a,b的值 其中

OpenCV-Python之邊緣保留濾波(EPF)

兩種常用的方法 高斯雙邊 均值遷移 高斯雙邊濾波 前文提到的高斯模糊只考慮了畫素空間的分佈,而沒有考慮差異問題。下圖十分形象的說明了邊緣保留濾波的原理。一張黑白分明存在噪聲的圖片通過高斯濾波保留邊緣將二者區分開來。 程式碼解析 # 邊緣保留濾波(EP

0029-在OpenCV環境下做導向濾波的程式碼

前邊提到的均值濾波、中值濾波和高斯濾波,都屬於各向同性濾波,它們對待噪聲和影象的邊緣資訊都採取一樣的態度,結果,噪聲被磨平的同時,影象中具有重要地位的邊緣、紋理和細節也同時被抹平了,這是我們所不希望看到的。為了解決這個問題,人們陸續提出了一些演算法來把影象邊緣和噪聲區別對待,比如雙邊濾波和導向濾波,

OpenCV Python教程(3)(4)(5): 直方圖的計算與顯示 形態學處理 初級濾波

OpenCV Python教程(3、直方圖的計算與顯示) 本篇文章介紹如何用OpenCV Python來計算直方圖,並簡略介紹用NumPy和Matplotlib計算和繪製直方圖 直方圖的背景知識、用途什麼的就直接略過去了。這裡直接介紹方法。 計算並顯

導向濾波小結:從導向濾波(guided filter)到快速導向濾波(fast guide filter)的原理,應用及opencv實現程式碼

1. 導向濾波簡介導向濾波是何凱明在學生時代提出的一個保邊濾波(edge-preserving smoothing)演算法。何凱明在cv圈應該算是名人了,學生時代關於影象去霧的研究就以第一作者的身份獲得Best Paper Award(CVPR 2009),而且今年剛剛又斬獲

Python OpenCV _4初級濾波(均值濾波,高斯濾波,中值濾波

Python OpenCV這個初級影象處理系列是參考他人的文章寫的,有些地方做了一些改動,沒有太多理論,側重程式碼實現,主要目的是將這些基本操作程式碼系統地梳理一遍,也是為了以後能快速查詢。 理論就不說了,直接上程式碼和效果圖 原圖 一,均值濾波 程式碼:

openCVPython(1)——初始化環境

pro lxml freeze load ros isa 安裝 git virtual 本系列博客主要參考自——Adrian Rosebrock:《Practical Python and OpenCV: An Introductory,Example

OpenCV--python---圖片的讀取顯示

details detail 筆記 tail opencv 顯示 bsp article enc openCV-Python筆記一:圖像的讀取、顯示和保存 http://blog.csdn.net/djcxym/article/details/52097812

Opencv+Python(4):鼠標作為畫筆

b- 對象 tex wait nta 接下來 space with 活動 鼠標作為畫筆 目標 學習處理OpenCV中的鼠標事件 你將學習這些函數:cv2.setMouseCallback() 簡單的演示 在這裏,我們創建了一個簡單的應用程序,無論我們雙擊它,在

Opencv-Python:圖像尺寸、圖像的讀取、顯示、保存與復制

常用 BE color reat size title enc creat alt Opencv-Python:圖像尺寸、圖像的讀取、顯示、保存與復制 原創 2017年11月23日 21:30:49 4440 在使用opencv的方法時,首先必須導入opencv

opencv-python下簡單KNN分類識別

文件 ont and color div feature png image spa KNN是數據挖掘中一種簡單算法常用來分類,此次用來聚類實現對4種花的簡單識別。 環境:python2.7+opencv3.0+windows10 原理:在使用KNN函數提取出4種花特征點以

opencv- python使用

通道 彩色 imread key 一個 waitkey enc 程序 destory opencv_python使用 一、opencv中的Gui特性:   1、讀入圖像:     cv2.imread()函數讀入圖像。其參數是:       (1)此圖片的路徑。

Opencv-python畫圖基礎知識

plain ofa nco 相關 ring 定義 sim 折線 true 相關函數介紹 1. Point 該數據結構表示了由其圖像坐標 和 指定的2D點。可定義為: Point pt; pt.x = 10; pt.y = 8; 或者 Point pt = Point(10,

opencv——python(1)

opencv入門opencv入門的基本使用 導入opencv模塊 import cv2 2.導入numpy模塊 import numpy as np 3.讀取當前目錄圖片 img = cv2.imread("1.jpg") 4.創建圖像 emptyImage = np.zeros(img.s

18、OpenCV Python 簡單實現一個圖片生成(類似抖音生成字母人像)

gaussian int read 。。 str gray clas range TE 1 __author__ = "WSX" 2 import cv2 as cv 3 import numpy as np 4 5 def local_threshold(i

Gradient Domain Guided Image Filtering(梯度域導向濾波

reg UC clear mat min ati double CP guide 作者提出了一種新的梯度域引導圖像濾波器,通過將明確的一階邊緣感知約束結合到現有的引導圖像濾波器中。