canny運算元共分四步:高斯濾波-》求梯度-》非最大抑制-》用雙閾值法檢測和連線邊緣。
canny四部曲將詳細分析各個步驟,並且附上每個步驟的原始碼。
第乙個步驟為高斯濾波。高斯函式的傅利葉變換也是高斯函式,高斯函式可看成乙個低通濾波器,可以去除高斯雜訊。對影象來說,常用二維零均值離散高斯函式作平滑濾波器,函式表示式如下:
高斯函式具有可分離性,因此高斯濾波器可以有效實現。通過二維高斯函式的卷積可以分兩步來進行,首先將影象與一維高斯函式進行卷積,然後將卷積的結果與方向垂直的相同一維高斯函式進行卷積。因此,二維高斯濾波的計算量隨濾波模板寬度成線性增長而不是成平方增長。
高斯函式的可分離性很容易表示:
於是在高斯濾波器的設計中,二維高斯函式的卷積運算可以通過使用單個一維高斯模板,對兩次卷積之間的影象和最後卷積的結果影象進行轉置來完成。
以下是產生一維高斯模板的函式:
// 一維高斯分布函式,用於平滑函式中生成的高斯濾波係數
/* * @parameter sigma: 高斯函式引數
* @parameter pdkernel: 高斯核函式模板
* @parameter pnwidowsize: 高斯模板大小
*/void creatgauss(double sigma, double **pdkernel, int *pnwidowsize)
//歸一化
for(i=0;i
}
以下函式呼叫一階函式模板,對原圖想分水平垂直兩次卷積實現高斯平滑:
//用高斯濾波器平滑原影象
/* * @parameter sz : 影象尺寸
* @parameter pgray : 影象灰度值
* @parameter presult: 影象
* @parameter sigma: 高斯函式引數
*/void gaussiansmooth(size sz, lpbyte pgray, lpbyte presult, double sigma)
if ((pdkernel = (double *)malloc(nwindowsize*sizeof(double)))==null)
//產生一維高斯資料
creatgauss(sigma, &pdkernel, &nwindowsize);
nlen = nwindowsize/2;
//x方向濾波
for(y=0;y=0 && (i+x)=0 && (i+y)< sz.cy)
}presult[y*sz.cx+x] = (unsigned char)ddotmul/dweightsum;
} }free(pdtemp);//釋放記憶體
free(pdkernel);
}
以下是用到的一些type:
typedef struct size;
typedef unsigned char *lpbyte;
typedef long long;
canny邊緣檢測之二(獲取梯度)將很快送到。
MySQL學習四部曲
網際網路時代,關聯式資料庫中mysql的使用最為廣泛,從而造就了大量的mysql從業人員。曾經使用oracle的網際網路巨頭阿里系也進行了去ioe化,也影響了更多的人想去學習mysql,從事mysql方面的工作。我是從四年前開始接觸mysql的,從之前的工程師工作,到現在的架構工作,再到偶爾的dba...
MySQL學習四部曲
互聯 網時代,關聯式資料庫中mysql的使用最為廣泛,從而造就了大量的mysql從業人員。曾經使用oracle的網際網路巨頭阿里系也進行了去ioe化,也影 響了更多的人想去學習mysql,從事mysql方面的工作。我是從四年前開始接觸mysql的,從之前的工程師工作,到現在的架構工作,再到偶爾的 d...
MySQL學習四部曲
網際網路時代,關聯式資料庫中mysql的使用最為廣泛,從而造就了大量的mysql從業人員。曾經使用oracle的網際網路巨頭阿里系也進行了去ioe化,也影響了更多的人想去學習mysql,從事mysql方面的工作。我是從四年前開始接觸mysql的,從之前的工程師工作,到現在的架構工作,再到偶爾的dba...