在OpenCV中自適應確定canny演算法的分割門限

2021-05-01 19:15:12 字數 1957 閱讀 5149

在opencv中用canny運算元進行邊緣檢測速度很快,不過有點不爽的就是高低閾值需要輸入。在matlab中,如果不指定閾值的話,由函式自適應確定,因此仿照matlab中的做法,對canny函式進行了修改,以便當使用者沒有指定高低閾值時,由函式自適應確定閾值。 我在opencv原碼庫中增加了乙個函式,用於確定高低閾值。 // 仿照matlab,自適應求高低兩個門限

cv_impl void adaptivefindthreshold(cvmat *dx, cvmat *dy, double *low, double *high)

cvsize size;

iplimage *imge=0;

int i,j;

cvhistogram *hist;

int hist_size = 255;

float range_0=;

float* ranges = ;

double  percentofpixelsnotedges = 0.7;

size = cvgetsize(dx);

imge = cvcreateimage(size, ipl_depth_32f, 1);

// 計算邊緣的強度, 並存於影象中

float maxv = 0;

for(i = 0; i < size.height; i++ )

const short* _dx = (short*)(dx->data.ptr + dx->step*i);

const short* _dy = (short*)(dy->data.ptr + dy->step*i);

float* _image = (float *)(imge->imagedata + imge->widthstep*i);

for(j = 0; j < size.width; j++)

_image[j] = (float)(abs(_dx[j]) + abs(_dy[j]));

maxv = maxv < _image[j] ? _image[j]: maxv;

// 計算直方圖

range_0[1] = maxv;

hist_size = (int)(hist_size > maxv ? maxv:hist_size);

hist = cvcreatehist(1, &hist_size, cv_hist_array, ranges, 1);

cvcalchist( &imge, hist, 0, null );

int total = (int)(size.height * size.width * percentofpixelsnotedges);

float sum=0;

int icount = hist->mat.dim[0].size;

float *h = (float*)cvptr1d( hist->bins, 0 );

for(i = 0; i < icount; i++)

sum += h[i];

if( sum > total )

break; 

// 計算高低門限

*high = (i+1) * maxv / hist_size ;

*low = *high * 0.4;

cvreleaseimage( &imge );

cvreleasehist(&hist);

在把cvcanny函式進行以下修改。

在函式體中,當程式用兩個sobel運算元計算完水平和垂直兩個方向的梯度強度過後加入以下**

// 自適應確定閾值

if(low_thresh == -1 && high_thresh == -1)

adaptivefindthreshold(dx, dy, &low_thresh, &high_thresh);

這樣,在呼叫cvcanny函式時,指定高低門限為-1,則cvcanny函式就自適應確定門限。 最後,別忘了重新編譯cv庫,對lib和dll庫進行更新。 that's all!

在OpenCV中自適應確定canny演算法的分割門限

在opencv中用canny運算元進行邊緣檢測速度很快,不過有點不爽的就是高低閾值需要輸入。在matlab中,如果不指定閾值的話,由函式自適應確 定,因此仿照matlab中的做法,對canny函式進行了修改,以便當使用者沒有指定高低閾值時,由函式自適應確定閾值。我在opencv原碼庫中增加了乙個函式...

OpenCV自適應閾值處理

區域性自適應閾值則是根據畫素的鄰域塊的畫素值分布來確定該畫素位置上的二值化閾值。這樣做的好處在於每個畫素位置處的二值化閾值不是固定不變的,而是由其周圍鄰域畫素的分布來決定的。亮度較高的影象區域的二值化閾值通常會較高,而亮度較低的影象區域的二值化閾值則會相適應地變小。不同亮度 對比度 紋理的區域性影象...

opencv函式系列 自適應閾值

在影象處理中較為常用的二值化方法有 1 全域性固定閾值 2 區域性自適應閾值 3 otsu等。全域性固定閾值很容易理解,就是對整幅影象都是用乙個統一的閾值來進行二值化。區域性自適應閾值則是根據畫素的鄰域塊的畫素值分布來確定該畫素位置上的二值化閾值。這樣做的好處在於每個畫素位置處的二值化閾值不是固定不...