程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Opencv學習教程之漫水填充算法實例詳解

Opencv學習教程之漫水填充算法實例詳解

編輯:關於C++

Opencv學習教程之漫水填充算法實例詳解。本站提示廣大學習愛好者:(Opencv學習教程之漫水填充算法實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Opencv學習教程之漫水填充算法實例詳解正文


Opencv學習教程之漫水填充算法實例詳解

作者:Minskyli

這篇文章主要給大家介紹了Opencv學習教程之漫水填充算法的相關資料,文中給出了詳細的示例代碼供大家參考學習,對大家具有一定的參考價值,需要的朋友們下面跟著小編一起來學習學習吧。

前言

基本思想是自動選中了和種子點相連的區域,接著將該區域替換成指定的顏色,經常用來標記或者分離圖像的一部分進行處理或分析。漫水填充也可以用來從輸入圖像獲取掩碼區域,掩碼會加速處理過程,或者只處理掩碼指定的像素點。其中掩膜Mask用於進一步控制那些區域將被填充顏色(比如說當對同一圖像進行多次填充時)。

int floodFill(inputoutputArray,inputoutputMask,seedPoint,Scalar newVal,Rect* rect=0,Scalar loDiff=Scalar(),Scalar upDiff=Scalar(),int flags=4) 

*第一個參數,輸入/輸出1通道或3通道,8位或浮點圖像。

*第二個參數,表示操作掩膜,為單通道,8位,長寬都比輸入圖像大兩個像素點的圖像。漫水填充不會填充掩膜mask的非零像素區域,mask中與輸入圖像(x,y)像素點相對應的點的坐標為(x+1,y+1)。

*第三個參數,漫水填充算法的起始點。

*第四個參數,像素點被染色的值,即在重繪區域的新值。

*第五個參數,用於設置floodFill函數將要重繪區域的最小邊界矩形區域,默認值0。

*第六個參數,當前觀察像素值與其部件鄰域像素值或待加入該部件的種子像素之間的亮度或顏色之負差的最大值。

*第七個參數,當前觀察像素值與其部件鄰域像素值或待加入該部件的種子像素之間的亮度或顏色之正差的最大值。

*第八個參數,操作標志符。

(1)低八位(第0~7位),用於控制算法的連通性,可取4(默認值)或者8。如果設為4,表示填充算法只考慮當前像素水平方向和垂直方向的相鄰點。如果設為8,除上述相鄰點外,還會包含對角線方向的相鄰點。

(2)高八位部分(16~23位),可以為0或者如下兩種選項標識符的組合。

*FLOODFILL_FIXED_RANGE:如果設置為這個標識符,就會考慮當前像素與種子像素之間的差,否則就考慮當前像素與其相鄰像素的差,也就是說,這個范圍是浮動的。

*FLOODFILL_MASK_ONLY:如果設置為這個標識符,函數不會去填充改變原始圖像(也就是忽略第三個參數newVal),而是去填充掩膜圖像(mask)。

(3)中間八位部分(8~15位),用於指定填充掩膜圖像的值,若為0,則掩碼會用1來填充。

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace cv;
using namespace std;

//全局變量聲明
Mat g_srcImage,g_dstImage,g_grayImage,g_maskImage;
int g_nlowDifference=20,g_nupDifference=20;//負差、正差最大值
bool g_bIsColor=true;//是否為彩色標識符布爾值
bool g_bUseMask=false;//是否顯示掩膜窗口的布爾值
int g_nFillMode=1;//漫水填充模式
int g_nConnectivity=4;//表示floodFill函數標識符第八位的連通值
int g_nNewMaskVal=255;//新的重新繪制的像素值

//鼠標消息onMouse回調函數
static void onMouse(int event,int x,int y,int ,void*)
{
 if(event != CV_EVENT_LBUTTONDOWN)//如果鼠標左鍵沒有按下,便返回
  return;
//調用floodFill函數之前的參數准備部分**********
 Point seed =Point(x,y);
 int lowDifference=g_nFillMode==0?0:g_nlowDifference;//空范圍的漫水填充,此值設為0,否則設為全局的g_nlowDifference
 int upDifference=g_nFillMode==0?0:g_nupDifference;//空范圍的漫水填充,此值設為0,否則設為全局的g_nupDifference
 //標識符的0~7位為g_nConnectivity,8~15位為g_nNewMaskVal左移8位的值,16~23位為CV_FLOODFILL_FIXED_RANGE或者0
 int flags=g_nConnectivity+(g_nNewMaskVal<<8)+(g_nFillMode==1?CV_FLOODFILL_FIXED_RANGE:0);
 //隨機生成b、g、r的值
 int b=(unsigned)theRNG() &255;//隨即返回一個0~255之間的值
 int g=(unsigned)theRNG() &255;//隨即返回一個0~255之間的值
 int r=(unsigned)theRNG() &255;//隨即返回一個0~255之間的值

 Rect ccomp;//定義重繪區域的最小邊界矩形區域
 //在重繪區域像素的新值,若是彩色圖模式,取Scalar(b,g,r);若是灰度圖模式,取Scalar(r*0.299+g*0.587+b*0.114)
 Scalar newVal=g_bIsColor?Scalar(b,g,r):Scalar(r*0.299+g*0.587+b*0.114);
 Mat dst=g_bIsColor?g_dstImage:g_grayImage;//目標圖的賦值

 int area;

//正式調用floodFill函數**********************
 if(g_bUseMask)
 {
  threshold(g_maskImage, g_maskImage, 1, 128, CV_THRESH_BINARY);
  area=floodFill(dst, g_maskImage, seed,newVal,&ccomp,Scalar(lowDifference,lowDifference,lowDifference),Scalar(upDifference,upDifference,upDifference),flags);
  imshow("mask",g_maskImage);
 }
 else
 {
  area=floodFill(dst, seed, newVal, &ccomp,Scalar(lowDifference,lowDifference,lowDifference),Scalar(upDifference,upDifference,upDifference),flags);

 }
 imshow("Renderings",dst);
 cout<<area<<"個像素被重繪\n";

}
//main函數
int main()
{
 g_srcImage=imread("/Users/new/Desktop/1.jpg" />

原始灰度圖片:

灰度模式-固定范圍的漫水填充:

彩色模式-固定范圍的漫水填充:

彩色模式-浮動范圍的漫水填充:

操作記錄:

Opencv技巧

(1)theRNG():int b=(unsigned)theRNG() &255; //隨即返回一個0~255之間的值

(2)threshold() :阈值函數

(3)Scalar():Scalar定義可存放1—4個數值的數值。

總結

以上就是這文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對的支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved