• ベストアンサー

ハフ変換により円の検出方法はhttp://a-gamyl.hp.inf

ハフ変換により円の検出方法はhttp://a-gamyl.hp.infoseek.co.jp/Clang/ip_hough.htmlなどのサイトに掲載されているので理解できます。 しかし、楕円の検出の場合にどのようなプログラムを組めば描写できるかを知りたいです。 かなり難しいとは感じています。

  • 科学
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

たぶん, ハフ変換の「プログラム」を見るよりも「アルゴリズム」を見た方がいいと思います. もっというと, 「一般論として」ハフ変換がどのようなものであるかを理解すべきかもしれません.

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%95%E5%A4%89%E6%8F%9B
ci013052
質問者

お礼

ありがとうございます。 確かにアルゴリズムを理解してからのプログラムですね。

関連するQ&A

  • ハフ変換(円の検出)について

    ハフ変換を用いて2値画像中の円を検出するプログラムを作りたいのです。直線の検出は ρ=xcosθ+ysinθ でxy平面の点をρθ平面に反映しましたが、円の場合はどういう代数方程式を用いればいいのでしょうか?

  • ハフ変換(Hough変換)の原理について

    現在、ハフ変換の原理について下記サイトなどを参考に調べていますが いまいち原理がよくわかりません。 そこで2つ質問があります。 http://www.allisone.co.jp/html/Notes/image/Hough/index.html 【質問1】  ハフ変換の原理は以下の認識であっていますでしょうか。 [直線を検出するハフ変換の原理] 10個のピクセルで構成される画像があり、各々のピクセルの座標を (x1, y1)、(x2, y2)、(x3, y3)・・・(x10, y10) とする場合。 また、画像上の直線の式は p = xcosθ + ysinθで表すことができるため、 様々なpとθの組み合わせの式を作成(例えば下記3つの式) (1) 2 = xcos10 + ysin10 (2) 4 = xcos20 + ysin20 (3) 6 = xcos30 + ysin30 (1)の式に10個のピクセルの各々の座標(x1, y1)、(x2, y2)・・・(x10, y10) を代入 → 2つのピクセルの座標が(1)式を満たす 同様に(2)の式に10個のピクセルの各々の座標を代入 → 8つのピクセルの座標が(2)式を満たす 同様に(3)の式に10個のピクセルの各々の座標を代入 → 3つのピクセルの座標が(3)式を満たす (2)式を満たすピクセルが多数存在するためこの画像には 4 = xcos20 + ysin20 で表す直線が存在する 【疑問2】 上記の認識でよい場合、もう1つ疑問があります。 直線の式 p = xcosθ + ysinθ において様々な(p, θ)の組み合わせの式を作成 することになると思うのですがその(p, θ)はどのように決めるのでしょうか。 考えうる限りすべての(p, θ)の組み合わせの式を作成するとものすごい量の 種類の式ができると思います。これをプログラムで行うとハフ変換はかなり 重い処理ということになるのでしょうか。

  • 画像情報処理についてです。(Hough変換です。)

    お忙しいところ申し訳ありません。大学の工学部の学生の者です。 大学の「画像情報処理」の講義で次のような課題が出題されました。 1.「画像内に平行な2直線が存在する。その2直線の中心に位置する直線を検出するアルゴリズムを考案せよ」 2.「画像内に中心の位置を同じくする幾つかの円と、それらの円と中心位置が異なる円が存在する(それらは交わっていない)。この時、中心の位置を同じくする幾つかの円の中心位置のみを検出するアルゴリズムを考案せよ(即ち、同心円でない円の中心は検出しない)。」 Hough変換を用いればいいというのは何となく分かるのですが、具体的なアルゴリズムが分かりません。 教えて頂けると幸いです。

  • 直線検出のハフ変換プログラム(delphi)

    ただいまdelphiで直線検出のハフ変換のプログラムを書いているのですが、コンパイルし、実行しようとするとスタックオーバーフローになってしまいます。 おそらく2次元配列のcounterの部分だと思うのですが、どなたか回避の仕方お分かりになるでしょうか? ご存じの方いらっしゃいましたら教えて下さい。 下記にハフ変換の部分のコードを載せます。 他にも何か気付いた点ありましたらご指摘お願いいたします。 ○直線検出のハフ変換○ var i, j, k, n: Integer; rx, ry: Integer; clr: tcolor; R: longint; counter_max: Integer; THETA_RESOLUTION, RHO_RESOLUTION, LNUMBER_MAX: Integer; pai: Double; theta, rho: Integer; theta_max, rho_max, count: Integer; theta_cut, rho_cut: Integer; counter:array[0..1023,0..1999] of Integer; //直線検出のためのカウンタ sn:array[0..1023] of Double; //sin cs:array[0..1023] of Double; //cos begin THETA_RESOLUTION:=1024; //thetaの範囲は0から1023まで RHO_RESOLUTION:=2000; //rhoの範囲は-1000から999まで LNUMBER_MAX:=15; //検索する電線の数は15まで pai:=PI / THETA_RESOLUTION; //π÷THETA_RESOLUTION for i:=0 to 1023 do //sinとcosのテーブルを用意 begin sn[i]:=Sin(pai*i); cs[i]:=Cos(pai*i); end; //ハフ変換の実行// for rx:=0 to 639 do begin for ry:=0 to 479 do begin clr:=image1.Canvas.Pixels[rx,ry]; R:=colortorgb(clr); if(getrvalue(R)=0)and(getgvalue(R)=0)and(getbvalue(R)=0) then //黒である for theta:=0 to 1023 do begin rho:=Trunc(rx*cs[theta]+ry*sn[theta]+0.5); counter[theta,rho+1000]:=counter[theta,rho+1000]+1; end; end; end; //ハフ逆変換の実行// for n:=0 to 14 do begin //counterが最大になるtheta_maxとrho_maxを求める// counter_max:=0; for theta:=0 to 1023 do begin for rho:=-RHO_RESOLUTION div 2 to RHO_RESOLUTION div 2-1 do begin if(counter[theta,rho+RHO_RESOLUTION div 2] > counter_max) then begin counter_max:=counter[theta,rho+RHO_RESOLUTION div 2]; theta_max:=theta; rho_max:=rho; count:=counter_max; end; end; end; //counter[theta_max,rho_max]の近傍を0にする// for i:=-20 to 20 do begin for j:=-10 to 10 do begin theta_cut:=theta_max+i; rho_cut:=rho_max+j; if(theta_cut < 0) then begin theta_cut:=theta_cut+THETA_RESOLUTION; rho_cut:=-rho_cut; end else if(theta_cut > THETA_RESOLUTION-1) then begin theta_cut:=theta_cut-THETA_RESOLUTION; rho_cut:=-rho_cut; end; counter[theta_cut,rho_cut+RHO_RESOLUTION div 2]:=0; //削除する end; end; //ハフ逆変換した結果の表示// if(theta_max<>0) then //垂線の線を描く begin for rx:=0 to 639 do begin ry:=Trunc((rho_max-rx*cs[theta_max])/sn[theta_max]+0.5); if(ry>=480)or(ry<0) then continue; image1.Canvas.Pixels[rx,ry]:=RGB(255,0,0); end; end; if(theta_max<>THETA_RESOLUTION div 2) then //水平の線を描く begin for ry:=0 to 479 do begin rx:=Trunc((rho_max-ry*sn[theta_max])/cs[theta_max]+0.5); if(rx>=640)or(rx<0) then continue; image1.Canvas.Pixels[rx,ry]:=RGB(255,0,0); end; end; //直線を形成するピクセルが60個未満になったら表示しない// if count<60 then break; end; end;

  • 円のHough変換をC言語で

    つくってみたのですが、ループが多すぎて実行時間が30分以上はかかりそうです。 ループをどうやって減らせばよいか、アドバイスお願いします。 円は(x-a)^2+(y-b)^2=400です。 以下、現在のプログラムの手順 1.b[x][y][a]を初期化(x,y,aでループ) 2.画素値が0のとき、b[x][y][a]=(円の式をb=~~の形にしたときの右辺)を行う(x,y,aでループ) 3.b[x][y][a]の頻度をカウントする。(カウントするbの値,x,y,aでループ。ここが時間かかる。) 4.逆変換する。まだ試してないけどxでしかループしないので時間はかからないはず。

  • 楕円を円に変換する問題です。

    1次変換 A=(1      -α) (β   √3・γ) によって楕円3x^2+9y^2=1を原点を中心とする半径1の円になるとき α,β,γを求めよ。ただしα、β、γは正の実数とする。 という問題です。 (X,Y)を変換後の座標としますと、X^2+Y^2=1・・(1)が成り立ちます。 又、楕円は(1/√3 , 0) (0 , 1/3)を通りますので (X,Y)=(1/√3 , 1/√3・β)   ・・(2) (X,Y)=(α/3 ,√3・γ/3)    ・・(3) が成り立ちます。 (2)を(1)に代入しβ=√2を導出することはできたのですが、(3)を(1)に代入したところで詰まってしまいました。 ご回答よろしくお願いします。

  • 自分のHPでウイルスを検出しました。

    自分のHPでウイルスを検出しました。 ウイルスバスター2006を使用し最新版にアップデートしています。 ウインドウズ(XP・SP2)も同様に最新版にアップデート済みです。 検出したのは「VBS_DLOADER.EYE」というものです。 バスターのサポートに電話をして処理の方法を聞きましたら 「ファイルの削除」で問題なく処理できるときき実行して バスターでパソコン全体をスキャンしたところ何も見つかりませんでした。 (他にもマイクロソフトのPC セーフティのスキャンでも何も見つかりませんでした) が、再び自分のHPに行くと同じウイルスを検出。 TOPページだけでなく(全部のページは確認していませんが) 他のページでも同様に検出されました。 そのためレンタルしているサーバーに問い合わせましたが (どのウイルスを検出したかも含めてメールしました) 「弊社サーバーに関して、仮にサーバー上にウィルスを含むファイルがあった場合、 該当ファイルが自動的に削除されることはありませんが、 ウィルスが、サーバー上で蔓延するということはありません。」 という回答が来ました。 そのメールに 「まず、サーバーにアップロードされている全ファイルを、 ローカルにダウンロードし、ウィルススキャンを行って下さい。」 とあったのですがこの意味がよくわかりません。 アップロードしているファイルを再びスキャンしましたが何も見つかりませんでした。 方法が間違っているのでしょうか? お友達も私のHPでウイルスを検出し「ジョークプログラム」だったと言っています。 またHPはJAVAは使っていませんがアフィリエイトのバナーは貼っています。 初心者どうやって対策をしていいのかわからず困っています。 わかりやすく教えていただけるとありがたいです。 よろしくお願いします。

  • アイフォンで撮ったムービーをHPに掲載したいのですが簡単な方法を教えて

    アイフォンで撮ったムービーをHPに掲載したいのですが簡単な方法を教えて下さい。 MOVをWMVに変換しなければいけないのですよね?? お願いします!!

  • 自分のHPのひとつからもうひとつのHPのページを書き替える方法?

    初めまして。ここで良いかどうか分からないのですが教えて下さい。 HPのサイトを2つ持ってますが,一方のサイトから他のサイトの特定のページを一定時間毎(1ケ月に一度)に自動的に書き替え(一度読み出して その後同じファイルないし若干の変更をしたものを上書き)したいのです。 (つまりサイト側にはファイル更新) クライアントがアクセスしなくても サーバ側だけで時間起動で自動的に動作させたいのですが,どのようにやれば可能でしょうか? できればそのプログラム自体をHPのページの中に埋め込めるのが一番の希望です。 それが不可能な場合は HPサイト内にディレクトリィを別に作ってそれ用のプログラムファイルを置く方法が希望です。 当方は HPは作れますが,WEBプログラムはできないので 分かりやすく教えて頂ければ有り難いです。 ご教授の程宜しくお願い致します。

  • どの環境・言語を選択すべきでしょうか?【画像処理・ハフ変換】

    工学系(化学)の大学生です。 開発環境・言語の選択に関してアドバイスを頂きたいと思い質問を投稿させて頂きます。 この度卒業研究を進めるに当たって多量の画像処理を行う事になりました。一枚一枚の処理は単純なのですが全体ではとても手でこなせる量ではなくコンピューター上で自動的に行いたいと考えています。 以下に参考になりそうな事柄を挙げました。こちらを基に、今後どのような開発環境・言語を選択して開発を行っていけばいいかアドバイスをいただければと思います。必要事項等ありましたら随時補足させて頂きます。 それでは、どうぞよろしくお願いいたします。 【処理内容】 ・画像から複数の円の半径を抽出*数百枚 ・得られたデータを統計的に処理、グラフ出力まで (現時点ではハフ変換の考え方をベースにしたプログラムを組もうと考えています。) 【開発に当たっての条件・希望】 ・実際に処理を行うに当たってプログラムを回すのはは自分のPCでなく大学の情報処理インフラを使おうと考えているので処理速度等の優先順位は低い ・自分以外の人間が今後アップデートを行う可能性がありできるだけ広く認知されている開発環境と言語を使いたい ・できれば無料で… 【スキルなど】 ・企業の研修のようなもので4つほど簡単なアプリケーションを作成しました(一ヶ月、Borland Delphi) ・授業の一部分でいくつかの極めて簡単なプログラムを組みました(c言語) 上二つで得た知識はほとんど残っていません。プログラミングの雰囲気はなんとなくわかる初心者、位に思っていただければと思います。