OpenCV學習 18 細化演算法 6

2021-09-06 12:05:31 字數 2631 閱讀 7989

本章我們在學習一下基於索引表的細化演算法。

假設要處理的影象為二值圖,前景值為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條曲線。相...