網(wǎng)站開(kāi)發(fā)與維護(hù)的崗位特點(diǎn)職責(zé)seo網(wǎng)站內(nèi)部?jī)?yōu)化方案
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)?jiān)陲@著位置標(biāo)明本文出處以及作者網(wǎng)名,未經(jīng)作者允許不得用于商業(yè)目的。
本文的C#版本請(qǐng)?jiān)L問(wèn):圖像分割-漫水填充法 floodFill (C#)-CSDN博客
FloodFill方法是一種圖像處理算法,它的目的是將一個(gè)閉合的區(qū)域內(nèi)的像素全部涂上同一個(gè)顏色。在實(shí)現(xiàn)中,通常會(huì)使用遞歸或隊(duì)列來(lái)處理待處理列表。具體的實(shí)現(xiàn)方式會(huì)根據(jù)具體應(yīng)用場(chǎng)景的需求而有所不同。
CvInvoke.FloodFill方法用于執(zhí)行圖像的漫水填充操作,它將連通區(qū)域中的所有像素點(diǎn)填充為指定顏色的操作。該方法聲明如下:
Public Shared Function FloodFill (
???????? src As IInputOutputArray,
???????? mask As IInputOutputArray,
???????? seedPoint As Point,
???????? newVal As MCvScalar,
???????? <OutAttribute> ByRef rect As Rectangle,
???????? loDiff As MCvScalar,
???????? upDiff As MCvScalar,
???????? Optional connectivity As Connectivity = Connectivity.FourConnected,
???????? Optional flags As FloodFillType = FloodFillType.Default
) As Integer
參數(shù)說(shuō)明:
- src:輸入輸出的圖像,必須是單通道灰度圖像或三通道彩色圖像。
- mask:掩碼圖像,必須是單通道8位圖像,并且高寬各比源圖像大2。如果指定了掩碼,則只有掩碼中像素值為255的區(qū)域才會(huì)被填充或者標(biāo)記。如果不指定掩碼,則默認(rèn)填充或者標(biāo)記整個(gè)圖像。
- seedPoint:表示種子點(diǎn)的坐標(biāo),即從哪個(gè)像素點(diǎn)開(kāi)始填充或者標(biāo)記連通區(qū)域。
- newVal:填充的新顏色,可以是一個(gè)標(biāo)量值(單通道圖像)或一個(gè)包含三個(gè)通道值的MCvScalar結(jié)構(gòu)體(三通道圖像)。
- rect:輸出參數(shù),表示被填充區(qū)域的邊界矩形。
- loDiff:低閾值向量。如果相鄰像素點(diǎn)的值與種子點(diǎn)的差值小于低閾值向量,則將其歸為同一連通區(qū)域。
- upDiff:高閾值向量。如果相鄰像素點(diǎn)的值與種子點(diǎn)的差值大于高閾值向量,則將其歸為不同的連通區(qū)域。
- connectivity:連接性,指定像素的相鄰關(guān)系。默認(rèn)為八連通。
- flags:漫水填充算法的標(biāo)志位。默認(rèn)為FixedRange,表示使用固定的閾值范圍進(jìn)行填充。
返回值:
返回一個(gè)整數(shù)值,表示填充的像素個(gè)數(shù)。
'漫水填充法 floodFillPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim m As New Mat("C:\learnEmgucv\tower.jpg", ImreadModes.Color)'種子點(diǎn)的坐標(biāo)Dim seedPoint As New Point(100, 100)'填充顏色Dim newVal As New MCvScalar(0, 255, 255)'掩碼圖像Dim mmask As New Matmmask = Mat.Zeros(m.Rows + 2, m.Cols + 2, DepthType.Cv8U, 1)Dim rect As New Rectangle' 執(zhí)行漫水填充Dim numFilledPixels As Integer = CvInvoke.FloodFill(m, mmask, seedPoint, newVal, rect,New MCvScalar(10, 10, 10),New MCvScalar(20, 20, 20))'輸出填充的像素個(gè)數(shù)Console.WriteLine("Number of filled pixels: " & numFilledPixels)'顯示填充后的圖像ImageBox1.Image = m
End Sub
輸出結(jié)果如下圖所示:
圖8-1漫水填充法實(shí)現(xiàn)圖像分割
'漫水填充法 floodFill'選取不同的起始點(diǎn)坐標(biāo)進(jìn)行填充Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickDim msrc As New Mat("c:\learnEmgucv\tower.jpg", ImreadModes.AnyColor)ImageBox1.Image = msrcDim mask As New Mat(msrc.Rows + 2, msrc.Cols + 2, DepthType.Cv8U, 1)Dim area As Integer'從坐標(biāo)(250, 250)進(jìn)行填充Dim mdst1 As Mat = msrc.Clonearea = CvInvoke.FloodFill(mdst1, mask,New Point(250, 250),New MCvScalar(0, 0, 255),New Rectangle(),New MCvScalar(40, 40, 40),New MCvScalar(40, 40, 40),Connectivity.FourConnected,FloodFillType.FixedRange)CvInvoke.Imshow("mdst1", mdst1)'從坐標(biāo)(400, 400)進(jìn)行填充Dim mdst2 As Mat = msrc.Clonearea = CvInvoke.FloodFill(mdst2, mask,New Point(400, 400),New MCvScalar(0, 255, 0),New Rectangle(),New MCvScalar(60, 60, 60),New MCvScalar(80, 80, 80),Connectivity.FourConnected,FloodFillType.FixedRange)CvInvoke.Imshow("mdst2", mdst2)
End Sub
輸出結(jié)果如下圖所示:
圖8-2 不同坐標(biāo)點(diǎn)填充效果
'FloodFill隨機(jī)坐標(biāo)點(diǎn)使用隨機(jī)顏色填充Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.ClickDim msrc As New Mat("c:\learnEmgucv\tower.jpg", ImreadModes.AnyColor)ImageBox1.Image = msrcDim mask As New Mat(msrc.Rows + 2, msrc.Cols + 2, DepthType.Cv8U, 1)Dim lodiff As New MCvScalar(20, 20, 20)Dim hidiff As New MCvScalar(20, 20, 20)Dim r As New RandomFor i As Integer = 0 To 99Dim x As Integer = r.Next(msrc.Cols)Dim y As Integer = r.Next(msrc.Rows)Dim p As New Point(x, y)Dim newsc As New MCvScalar(r.Next(256), r.Next(256), r.Next(256))Dim area As Integerarea = CvInvoke.FloodFill(msrc, mask,p,newsc,New Rectangle(),lodiff,hidiff,Connectivity.FourConnected,FloodFillType.FixedRange)NextCvInvoke.Imshow("mout", msrc)
End Sub
輸出結(jié)果如下圖所示:
圖8-3 隨機(jī)坐標(biāo)點(diǎn)使用隨機(jī)顏色填充
由于.net平臺(tái)下C#和vb.NET很相似,本文也可以為C#愛(ài)好者提供參考。
學(xué)習(xí)更多vb.net知識(shí),請(qǐng)參看vb.net 教程 目錄