C言語でHough変換での直線検出処理の実現
Posted: 2017年10月16日(月) 18:59
初めて質問させていただきます。何かとご迷惑をかけるかもしれませんがよろしくお願いします。
今C言語でのHough変換を行うプログラムを作成中です。
まずアルゴリズムについてですが、
①エッジ検出処理、2値化処理をした画像を読み込む
②明度値が255のポイントをサーチし0<θ<360の範囲でρ = x * cos(θ) + y * sin(θ)を計算し配列に投票を行う。
③②の投票した配列から最大値を検出。
④最大値を画像として出力。
であっていますでしょうか?
今作成しているプログラムではρθのハフ空間の画像出力まで成功しており、
後は最大値の検出、それをxy画像空間で出力する方法が分かりません。
そこを教えていただきたいです。
int H[][]には投票した結果
int rho_maxには計算したrhoの最大値
int h,wには入力画像の縦横のサイズが入っています。
導き出したrho_mとtheta_mを出力処理の関数に渡して画像として出力したいです。
画像を出力するアルゴリズムも教えてください。
追加でピークが複数あった場合の処理も教えてほしいです。
今C言語でのHough変換を行うプログラムを作成中です。
まずアルゴリズムについてですが、
①エッジ検出処理、2値化処理をした画像を読み込む
②明度値が255のポイントをサーチし0<θ<360の範囲でρ = x * cos(θ) + y * sin(θ)を計算し配列に投票を行う。
③②の投票した配列から最大値を検出。
④最大値を画像として出力。
であっていますでしょうか?
今作成しているプログラムではρθのハフ空間の画像出力まで成功しており、
後は最大値の検出、それをxy画像空間で出力する方法が分かりません。
そこを教えていただきたいです。
int H[][]には投票した結果
int rho_maxには計算したrhoの最大値
int h,wには入力画像の縦横のサイズが入っています。
導き出したrho_mとtheta_mを出力処理の関数に渡して画像として出力したいです。
画像を出力するアルゴリズムも教えてください。
追加でピークが複数あった場合の処理も教えてほしいです。
void peakHough(int H[][360],int rho_max, int h, int w, int *rho_m, int *theta_m)
{
int i, theta, rho, max, cnt;
int M[1000][2];
int rh=0;
int th=0;
//-----最大値を抽出-----
cnt = 0;
max = 0;
for(theta=0; theta<360; theta++){
for(rho=0; rho<rho_max; rho++){
if(H[rho][theta] > max){
max = H[rho][theta];
rh = rho;
th = theta;
}
}
}
/*
printf("%d %d\n",rho,theta);
for(theta=0; theta<360; theta++){
for(rho=0; rho<rho_max; rho++){
if(H[rho][theta] = max)
M[cnt][0] = rho;
M[cnt][1] = theta;
cnt++;
}
}
*/
*rho_m = rh;
*theta_m = th;
}