本章我們在學習一下基於索引表的細化演算法。
假設要處理的影象為二值圖,前景值為1,背景值為0。
索引表細化演算法使用下面的8鄰域表示法:
乙個畫素的8鄰域,我們可以用8位二進位制表示,比如下面的8鄰域,表示為00111000=0x38=56
我們可以列舉出各種情況下,當前畫素能否刪除的表,該錶大小為256。它的索引即為8鄰域表示的值,表中存的值為0或1,0表示當前畫素不能刪除,1表示可以刪除。deletemark[256]
比如下圖第乙個表示,索引值為0,它表示孤立點,不能刪除,所以deletemark[0]=0,第二個表示索引值為17,它表示端點,也不能刪除,所以deletemark[17]=0,第三個表示索引為21,刪除的話會改變連通域數量,所以deletemark[21]=0,第四個表示索引值為96,此時可以刪除,所以deletemark[96]=1。
最終我們會定義一張完整的表來表示當前畫素能否刪除。
索引表細化演算法描述很簡單。
1.找到輪廓,其值用4表示
2.查詢值為4的輪廓,查詢索引表判斷能否刪除,能刪除的話把它置為0。
迴圈迭代1,2直到再也沒有可以刪除的點為止。
下面的演算法的**:
if(dst.data!=src.data)
// p0 p1 p2
// p7 p3
// p6 p5 p4
unsigned
char deletemark[256] = ;//索引
int i, j;
int width, height;
//之所以減1,是方便處理8鄰域,防止越界
width = src.cols -1;
height = src.rows -1;
int step = src.step;
int p0, p1, p2,p3,p4,p5,p6,p7;
uchar* img;
bool ifend;
bool border = false; //交換刪除的次序,防止從一邊細化
while(1)}}
//printf("\n");
//printmat(dst);
//執行刪除操作
ifend = false;
img = dst.data;
for(i = 1; i < height; i++)}}
//printf("\n");
//printmat(dst);
//printf("\n");
//已經沒有可以細化的畫素了,則退出迭代
上面的演算法可以看到細化後的輪廓偏右了,我們可以更改刪除的迴圈條件,把迴圈拆分成三個,修改後的**如下:
void gthin::cvidxthin(cv::mat& src, cv::mat& dst)修改後的結果://非原地操作時候,copy src到dst
if(dst.data!=src.data)
// p0 p1 p2
// p7 p3
// p6 p5 p4
unsigned
char deletemark[256] = ;//索引
int i, j;
int width, height;
//之所以減1,是方便處理8鄰域,防止越界
width = src.cols -1;
height = src.rows -1;
int step = src.step;
int p0, p1, p2,p3,p4,p5,p6,p7;
uchar* img;
bool ifend;
bool border = false; //交換刪除的次序,防止從一邊細化
while(1)}}
//printf("\n");
//printmat(dst);
//執行刪除操作
ifend = false;
img = dst.data;
for(i = 1; i < height; i++)}}
img = dst.data;
for(i = 1; i < height; i++)}}
img = dst.data;
for(i = 1; i < height; i++)}}
//printf("\n");
//printmat(dst);
//printf("\n");
//已經沒有可以細化的畫素了,則退出迭代
if(!ifend) break;
}}
程式源**:工程firstopencv11
OpenCV學習記錄6
一 學習內容 1 獲取影象座標處的畫素值,並修改圖對比度 二 include include using namespace std using namespace cv int main int argc,char ar char figure name figure1 namedwindow f...
opencv學習之路(18) 霍夫變換
在影象處理和計算機視覺領域中,如何從當前的影象中提取所需要的特徵資訊是影象識別的關鍵所在。在許多應用場合中需要快速準確地檢測出直線或者圓。其中一種非常有效的解決問題的方法是霍夫 hough 變換。以上原理部分,霍夫圓變換的基本原理和上面講的霍夫線變化大體上是很類似的,只是點對應的二維極徑極角空間被三...
OpenCV學習18 霍夫變換檢測直線
霍夫變換直線檢測 前提條件 邊緣檢測已經完成 單通道8位灰度影象,經過二值化變為黑白影象 平面空間轉到極座標空間 通過上式子可以把畫素點轉化成極座標,如下圖所示。上面的曲線相交與一點,說明了什麼資訊呢?說明這些畫素都在一條直線。比如乙個影象有200個畫素,通過座標變換。那麼就可以得到200條曲線。相...