像素是圖像的基本元素,像素與像素之間存在著某些聯(lián)系,理解像素間的基本關(guān)系是數(shù)字圖像處理的基礎(chǔ)。常見的像素間的基本關(guān)系包括:鄰域、鄰接、通路、連通、距離。
Part1 1. 鄰域
鄰域表示了像素之間的連接關(guān)系。
像素(x,y)的鄰域,是指與像素(x,y)對應(yīng)的點(diǎn)的集合{(x+p,y+q)} ,其中 (p,q) 為一對有意義的整數(shù)。鄰域是像素(x,y)附近像素形成的區(qū)域,像素 (x,y) 也被稱為中心像素。
最常用的鄰域有以下幾種:
鄰域.png
鄰域是一個(gè)很基礎(chǔ)的概念。后續(xù)我們對圖像進(jìn)行卷積操作的時(shí)候,通常是對當(dāng)前像素的鄰域像素進(jìn)行操作的。
以一個(gè)最簡單的均值濾波為例,均值濾波是對于每一個(gè)像素點(diǎn), 將其設(shè)定為取其鄰域窗口內(nèi)的所有像素的平均值。
這里的模板,也可以被稱為核(kernels)、窗口(windows)、掩模(mask)。
下圖以 3*3 的模板為例,均值濾波會(huì)對原圖像的每一個(gè)像素點(diǎn),計(jì)算它的鄰域像素和模版矩陣的對應(yīng)元素的乘積,然后加起來,作為該像素位置的值。窗口的移動(dòng)是從左到右,然后從上到下依次移動(dòng)。
卷積.png
下面,實(shí)現(xiàn)一個(gè)簡單的均值濾波函數(shù)
MatmeanFilter(Mat&src,intksize=3) { cv::Matdst=src.clone(); intk0=ksize/2; intsum[3]={0,0,0}; for(inti=k0;i(i-k0+m,j-k0+n)[channel]; } } dst.at (i,j)[channel]=saturate_cast ((float)sum[channel]/(ksize*ksize)); } } } returndst; }
當(dāng)然這個(gè)代碼只是粗略地實(shí)現(xiàn)均值濾波,存在著很多優(yōu)化的空間,例如使用積分圖、卷積核分離等。OpenCV 也提供了均值濾波函數(shù) blur() 函數(shù)。
intmain(intargc,char*argv[]) { Matsrc=imread(".../flower.jpg"); imshow("src",src); Matdst; dst=meanFilter(src,15); imshow("meanFilter",dst); blur(src,dst,Size(15,15)); imshow("blur",dst); waitKey(0); return0; }
均值濾波函數(shù)效果.png
上面只是簡單例舉了領(lǐng)域的使用場景,后續(xù)會(huì)有專門的文章來詳細(xì)介紹卷積和濾波。
Part2 2. 鄰接
鄰接是指兩個(gè)像素,在位置上相鄰并且取值相同或相近。
我們用 V 表示定義鄰接的灰度值集合。在二值圖像中,V={1} 表示值為1的像素鄰接。在灰度圖像中,V 包含更多的元素。
像素 p 和 q 是 4 鄰接,那么它們一定是 8 鄰接的。反之,不一定成立。
下圖反應(yīng)了 8 鄰接會(huì)帶來二義性。
鄰接.png
從圖中可以看到,p 是中心像素。
q1、q2 和 p 是 8 鄰接的。
q1 和 p 非 m 鄰接的。
q2 和 p 是 m 鄰接的。
某條通路經(jīng)過像素 q2、p、q1,那會(huì)有幾種走法呢?
如果從 p、q1、q2 是 8 鄰接的角度看,p 到 q1 可以有2種走法,所以 q2 到 q1 的通路有2條。
同理,從 m 鄰接角度看,p 和 q1 只有1種走法,所以 q2 到 q1 的通路只有1條。
所以,m 鄰接的引入是為了消除 8 鄰接常常帶來二義性。
從集合的角度看:
Part3 3. 通路
由不同的鄰接定義,可以得到不同的通路:4 鄰接 => 4 通路,8 鄰接 => 8 通路,m 鄰接 => m 通路
通路.png
所以,從中間的圖可以看到 q2 和 q1 之間存在 8 通路,從最右的圖可以看到 q2 和 q1 之間存在 m 通路。
從集合的角度看:
下圖中,p-q 通路對應(yīng)的是不同的通路。
多種通路.png
Part4 4. 連通
lineType 參數(shù).png
下面的例子,展示了使用不同的 lineType 參數(shù)的效果
intmain(intargc,char*argv[]) { Matimage=Mat::zeros(Size(80,80),CV_8UC3); image.setTo(255);//設(shè)置屏幕為白色 Pointp1(20,0); Pointp2(80,60); Pointp3(0,0); Pointp4(80,80); Pointp5(0,20); Pointp6(60,80); line(image,p1,p2,Scalar(0,0,255),1,LINE_4); line(image,p3,p4,Scalar(255,0,0),1,LINE_8); line(image,p5,p6,Scalar(0,255,0),1,LINE_AA); imshow("src",image); waitKey(0); return0; }
將生成的圖片放大,可以看到使用 LINE_4、LINE_8、LINE_AA 畫出來的線段效果是不同的。使用 LINE_AA 效果看上去是最好的,其次是 LINE_8。
不同lineType參數(shù)的效果.png
通過鄰接可以引申很多概念,鄰接 -> 通路 -> 連通 -> 連通集 -> 區(qū)域/鄰接區(qū)域 -> 前景和背景 -> 邊界
Part5 5. 距離
對于像素 p(x,y)、q(s,t) 和 z(u,v),如果滿足:
非負(fù)性:D(p,q) ≥ 0
同一性:D(p,q)=0,當(dāng)且僅當(dāng)p=q時(shí)
對稱性:D(p,q) = D(q,p)
直遞性:D(p,z) ≤ D(p,q) + D(q,z)
則稱 D 是距離的度量函數(shù)。
Part6 6. 總結(jié)
本文涉及到很多概念,這些概念代表著像素間的基本關(guān)系。像鄰域、連通在后續(xù)文章中很多都會(huì)涉及到,像距離又跟相似度有關(guān),所以它們是數(shù)字圖像的基礎(chǔ)。
審核編輯:劉清
-
濾波器
+關(guān)注
關(guān)注
161文章
7811瀏覽量
178088 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41345 -
均值濾波
+關(guān)注
關(guān)注
0文章
10瀏覽量
7102
原文標(biāo)題:OpenCV 筆記(6):像素間的基本關(guān)系——鄰域、鄰接、通路、連通、距離
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論