ハフ変換について質問します。
ハフ変換のアルゴリズムとして以下のようにしてプログラムに実装して動作させたのですが上手くいきません。どこに問題があるか教えて欲しいです。
1 入植画像を読み込む
2 入力画像の輝度値が255のところでθの値を30度ずつ変化させながらr = xcosθ + ysinθ
の式に当てはめながら配列P[r][θ]の所をインクリメントする
3 配列Pの最大の値のところのr,θを求める
4 その最大のr, θを逆ハフ変換の式によってx,y 座標の値に変換してグラフ(又は元画像)にプロットしていく。このとき水平面と垂直方面のとにわける。
自分的には4の所で問題があると思っているのですが・・・。
回答よろしくお願いします。
ハフ変換の直線検出について
Re: ハフ変換の直線検出について
[code = c]
void HoughTransform(void){
int * pInputData; // 元画像のデータを格納
int iWidth,iHeight,iMaxValue; // 画像の幅,高さ,解像度
int deltatheta=1;
int theta=0;
int rho;
int x,y;
int i,j;
int max = 0;
int rhomax,thetamax;
double PI = 3.14;
FILE *fp1,*fp2;
if( (fp1=fopen("houghx.txt", "w")) == NULL)
{
printf("そのファイルは存在しません.\n");
exit(EXIT_FAILURE);
}
if( (fp2=fopen("houghy.txt", "w")) == NULL)
{
printf("そのファイルは存在しません.\n");
exit(EXIT_FAILURE);
}
printf("////入力画像////\n");
pInputData = ReadPgm(&iWidth, &iHeight, &iMaxValue);
int p[iWidth*2][181];
int rx,ry;
for(i=0;i<181;i++){
for(j=0;j<iWidth*2;j++){
p[j] = 0;
}
}
printf("ホフ変換実行中\n");
for(y=0;y<iHeight;y++){
for(x=0;x<iWidth;x++){
theta = 0;
if(pInputData[y*iWidth+x]==0){
while(theta<=180){
rho = x*cos(theta*PI/180)+y*sin(theta*PI/180);
p[rho][theta]++;
theta = theta + deltatheta;
}
}
}
}
for(x=0;x<181;x++){
for(y=0;y<iWidth*2;y++){
if(max < p[y][x]){
max = p[y][x];
rhomax = y;
thetamax = x;
}
}
}
printf("最大値%d %d %d\n" ,p[rhomax][thetamax],rhomax,thetamax);
for(x=0;x<iWidth;x++){
ry=-(cos(thetamax*PI/180)/sin(thetamax*PI/180))*x+(rhomax/sin(thetamax*PI/180));
fprintf(fp1,"%d %d \n" ,x,ry);//ここでtxtに座標の情報を書き込む
}
for(y=0;y<iHeight;y++){
rx=-(sin(thetamax*PI/180)/cos(thetamax*PI/180))*y+(rhomax/cos(thetamax*PI/180));
fprintf(fp2,"%d %d \n" ,rx,y);//ここでtxtに座標の情報を書き込む
}
}
[\code]
void HoughTransform(void){
int * pInputData; // 元画像のデータを格納
int iWidth,iHeight,iMaxValue; // 画像の幅,高さ,解像度
int deltatheta=1;
int theta=0;
int rho;
int x,y;
int i,j;
int max = 0;
int rhomax,thetamax;
double PI = 3.14;
FILE *fp1,*fp2;
if( (fp1=fopen("houghx.txt", "w")) == NULL)
{
printf("そのファイルは存在しません.\n");
exit(EXIT_FAILURE);
}
if( (fp2=fopen("houghy.txt", "w")) == NULL)
{
printf("そのファイルは存在しません.\n");
exit(EXIT_FAILURE);
}
printf("////入力画像////\n");
pInputData = ReadPgm(&iWidth, &iHeight, &iMaxValue);
int p[iWidth*2][181];
int rx,ry;
for(i=0;i<181;i++){
for(j=0;j<iWidth*2;j++){
p[j] = 0;
}
}
printf("ホフ変換実行中\n");
for(y=0;y<iHeight;y++){
for(x=0;x<iWidth;x++){
theta = 0;
if(pInputData[y*iWidth+x]==0){
while(theta<=180){
rho = x*cos(theta*PI/180)+y*sin(theta*PI/180);
p[rho][theta]++;
theta = theta + deltatheta;
}
}
}
}
for(x=0;x<181;x++){
for(y=0;y<iWidth*2;y++){
if(max < p[y][x]){
max = p[y][x];
rhomax = y;
thetamax = x;
}
}
}
printf("最大値%d %d %d\n" ,p[rhomax][thetamax],rhomax,thetamax);
for(x=0;x<iWidth;x++){
ry=-(cos(thetamax*PI/180)/sin(thetamax*PI/180))*x+(rhomax/sin(thetamax*PI/180));
fprintf(fp1,"%d %d \n" ,x,ry);//ここでtxtに座標の情報を書き込む
}
for(y=0;y<iHeight;y++){
rx=-(sin(thetamax*PI/180)/cos(thetamax*PI/180))*y+(rhomax/cos(thetamax*PI/180));
fprintf(fp2,"%d %d \n" ,rx,y);//ここでtxtに座標の情報を書き込む
}
}
[\code]
Re: ハフ変換の直線検出について
>動作させたのですが上手くいきません
何がどう 上手くいかない のかを説明しないとわからないです.
(1)動作させた とのことですが,
int p[iWidth*2][181];
これ,コンパイル通るのでしょうか?
(2)最後のグラフプロット?は,「傾きに応じてどちらか一方」とかではなく,何故2回やるのでしょうか?
(なにかしらそうする必要がある?)
線の傾き次第ではゼロ割(…に非常に近い状況)が起こりそうです.
(3)どうでもいいことかもしれませんが
>30度ずつ変化させながら
にはなっていないような?
何がどう 上手くいかない のかを説明しないとわからないです.
(1)動作させた とのことですが,
int p[iWidth*2][181];
これ,コンパイル通るのでしょうか?
(2)最後のグラフプロット?は,「傾きに応じてどちらか一方」とかではなく,何故2回やるのでしょうか?
(なにかしらそうする必要がある?)
線の傾き次第ではゼロ割(…に非常に近い状況)が起こりそうです.
(3)どうでもいいことかもしれませんが
>30度ずつ変化させながら
にはなっていないような?