1、題目:乙個資料矩陣,選定某個位置的資料元作為參考,尋找與該資料元值相同的連成一片的最大範圍。如下二維陣列中所示,選擇arr[1][3]作為參考物件,從位置(1,3)開始尋找所有相連的值為『1』的元素。結果很明顯如下圖1所示。
int arr[5][5]=;圖1:
2、深度遍歷方法
從(1,3)位置開始,按照「上、右、下、左」的順序檢查相鄰位置的值是否與參考值相同,如果相同則被篩選到候選集中,並以該點為基點再出發擴充套件檢查。
a. (1,3)-->(2,3)-->(2,4)-->(3,4)-->(4,4)-->(4,3)-->(4,2)-->(4,1)-->(3,1)-->(2,1)-->(1,1)-->(1,2)-->
b. (1,3)-->(1,2)-->...
深度遍歷可能從不同的路徑到達相同的位置點,正如上面的(1,2)位置。為了避免形成迴路,還得記住已識別點的位置。從分析來看,計算過程比較複雜,要記住所有點位置,也需要不少的記憶體空間;計算上,每識別乙個新點,都要在已檢測集合中進行匹配。
3、廣度遍歷方法
從(1,3)位置開始,按照「上、右、下、左」的順序檢查相鄰位置的值是否與參考值相同,如果相同則被篩選到候選集合中,並作為新的參考點。
(1,3)-->(2,3)-->(1,2)
|-->(2,4) |-->(0,2)
如此,從(1,3)位置相鄰4個點篩選,命中的點追加的候選佇列中。為了避免迴路,把每個點4個相鄰方向的檢查狀態記錄下來,0表示未檢測,1表示已檢測為有相同值,2表示檢測為無相同值(邊界點)。這些資訊在後續的檢測中,避免重複迴圈。
#include #include#include
using
namespace
std;
struct
nposition
;#define max_limit 5
intmain()
; queue
active; //
待檢測佇列
vectorchecked; //
已檢測的點
nposition seed=;
int val=1
;
seed.x = 1
; seed.y = 3
; active.push( seed );
while( !active.empty() )
;temp.x = p.x-1
; temp.y =p.y;
temp.stats = 1
; active.push( temp );
p.statn = 1
; }
else
p.statn = 2
; }
if( p.state == 0
) ;
temp.x =p.x;
temp.y = p.y+1
; temp.statw = 1
; active.push( temp );
p.state = 1
; }
else
p.state = 2
; }
if( p.stats == 0
) ;
temp.x = p.x+1
; temp.y =p.y;
temp.statn = 1
; active.push( temp );
p.stats = 1
; }
else
p.stats = 2
; }
if( p.statw == 0
) ;
temp.x =p.x;
temp.y = p.y-1
; temp.state = 1
; active.push( temp );
p.statw = 1
; }
else
p.statw = 2
; }
active.pop();
checked
.push_back( p );
}//!while
//int i=0
; cout
<
linked positions:
"<
for( ; i
}
兩幀相減法實現鏡頭邊界檢測
最為簡單的是兩幀相減法 即前後兩幀相減,通過閾值選出一部分變化的畫素,當被選出的畫素比例大於閾值時,視為鏡頭轉換。所以有兩個引數,要手工調,很不方便。或許可以用深度學習試一試 再者,當兩個鏡頭變化時,會有連續的幀出現變化,可以用出現變化的幀去抑制下一變化幀,從而只選取一幀。import cv2 im...
矩形和圓的相交檢測 演算法分析與實現
編寫乙個函式 int isonrect float x,float y,float r,float x1,float y1,float x2,float y2 x,y表示乙個圓的圓心,r是圓的半徑 x1,y1,x2,y2表示乙個矩形的一條對角線上的兩個頂點的座標 矩形的四邊均與座標軸平行或者垂直 要...
FPGA實現Sobel邊緣檢測演算法
傳統sobel演算法實現主要分為兩步 一是影象視窗畫素的生成,二是梯度的計算。演算法的具體實現步驟可參考這裡主要分享一下本人遇到的一點小問題 1 按照參考例程,平方根器的輸入radical會一直是藍線 高阻態 解決辦法 將pa xpa x pa ypa y單獨拿出來計算並賦值給中間訊號i radic...