Physics CG sobel邊緣檢測

2021-09-22 17:49:13 字數 1821 閱讀 5703

接下來幾篇主要圍繞卷積具體能在圖形渲染中實現什麼效果,比如常用的邊緣檢測濾波器(卷積濾波器),這個濾波器不僅在學習卷積的時候基本都會講到,而且我看過的國內外shader開發書籍中也都會提到,濾波器構成如下:

三維圖形學中邊緣的意義我們之前講過,不明白的可以回過去看下,這裡我們在來看下二維圖形中邊緣的意義。二維圖形中,因為圖形中畫素值的不同,會在連續畫素差異較大的地方讓我們肉眼形成一種邊界的視覺,同時邊界分為xy兩軸組成,所以我們需要xy兩個方向的濾波器進行卷積運算。

貼下xy兩個方向的濾波器(運算元)的數值矩陣,如下:

sobel濾波器

-1      0       1               -1       -2        -1

x =  -2      0       2        y =   0         0         0

-1      0       1                1         2         1

首先我說下sobel卷積核心公式:這兩個運算元需要和當前畫素矩陣的亮度值做點乘,得到的xy軸兩方向的值(也稱梯度),計算其結合梯度值(g = sqrt(gx^2 + gy ^2);),然後將這個梯度值g作為主紋理顏色與邊緣顏色混合的權重值即可。

一般的亮度計算公式: y(亮度)=(0.299*r)+(0.587*g)+(0.114*b)

當然了還有如下:

這裡我們不用運算元去點乘rgb是因為y明亮度作為引數取梯度值更能準確表明連續畫素之間的差異。那麼對於xy軸兩個運算元,圖形數學敏感一些的話,看得出來x軸運算元處理的畫素矩陣,如果x正負方向上明亮度差異很大,就能產生乙個絕對值較大的梯度值,那麼我們就認為這就是「邊界」,y軸運算元同理。

接著就來shader實現,如下:

shader "unlit/edgesobelshader"

_edgecolor("edge color",color) = (1,1,1,1)

}subshader

lod 100

pass

;struct v2f

;sampler2d _maintex;

float4 _maintex_st;

float4 _maintex_texelsize;

float4 _edgecolor; /*邊緣顏色值*/

//rgb提取明亮度

//rgb轉yuv公式

float rgbtoy(fixed4 col)

fixed4 frag (v2f i) : sv_target

; /*x軸sobel運算元*/

float ysobel[9] = ; /*y軸sobel運算元*/

//xy軸梯度和結合梯度

float g = 0, gx = 0, gy = 0;

for (int k = 0; k < 9; k++)

//計算結合梯度

g = sqrt(gx*gx + gy*gy);

//主紋理取樣

fixed4 col = tex2d(_maintex, i.uv[4]);

//梯度混合

col = lerp(col, _edgecolor, g);

return col;

}endcg}}

}

順便看下效果,如下:

好了,之後會找一些其他的卷積濾波器來實現一些效果。

樹邊,前向邊,後向邊,橫叉邊

樹邊,前向邊,後向邊,橫叉邊,應該說,不是乙個圖本身有的概念,應該是圖進行dfs時才有的概念。圖進行dfs會得到一棵dfs樹 森林 在這個樹上才有了這些概念。對圖進行dfs,可以從任意的頂點開始,遍歷的方式也是多樣的,所以不同的遍歷會得到不同的dfs樹,進而產生不同的樹邊,前向邊,後向邊,橫叉邊。所...

邊學邊用LINUX

第一講 linux概述 第二講 linux的安裝過程 一 第三講 linux的安裝過程 二 第四講 linux的安裝過程 三 第五講 linux的安裝過程 四 第六講 x windows系統 第七講 kde的基本操作 第八講 linux作業系統中的中文環境 第九講 linux作業系統中的其它應用程式...

Python邊學邊用

由於要對10x10的節點設定靜態路由,如果手動寫真的太費事了。考慮使用程式設計實現。由於一直想學python,就藉機邊學邊用吧 python 是一種物件導向 直譯式計算機程式語言。它包含了一組完善而且容易理解的標準庫,能夠輕鬆完成很多常見的任務。它的語法簡捷和清晰,盡量使用無異義的英語單詞,與其它大...