私はHough TransformのRosetta Code Java implementationを使用していて、アキュムレータの視覚化もうまく行っています。Rosetta Codeで見つかった行を表示するHough Transformを元画像
アキュムレータは、次のようになります:私はcpompileと、このようなクラスを呼び出すことを考えると
:
$ javac HoughTransform.java && java HoughTransform pentagram.png out.png 640 480 100
このような入力画像が与えられ
どちらが理にかなっている。今私が見つけた線で元の画像をオーバーレイしたいのですが、これは私に深刻な問題をもたらします。
私は、私はC++で書かれて欲しいものない例見つけることができる:https://github.com/brunokeymolen/hough/blob/master/hough.cpp#L125
から
... int x1, y1, x2, y2; x1 = y1 = x2 = y2 = 0; if(t >= 45 && t <= 135) { //y = (r - x cos(t))/sin(t) x1 = 0; y1 = ((double)(r-(_accu_h/2)) - ((x1 - (_img_w/2)) * cos(t * DEG2RAD)))/sin(t * DEG2RAD) + (_img_h/2); x2 = _img_w - 0; y2 = ((double)(r-(_accu_h/2)) - ((x2 - (_img_w/2)) * cos(t * DEG2RAD)))/sin(t * DEG2RAD) + (_img_h/2); } else { //x = (r - y sin(t))/cos(t); y1 = 0; x1 = ((double)(r-(_accu_h/2)) - ((y1 - (_img_h/2)) * sin(t * DEG2RAD)))/cos(t * DEG2RAD) + (_img_w/2); y2 = _img_h - 0; x2 = ((double)(r-(_accu_h/2)) - ((y2 - (_img_h/2)) * sin(t * DEG2RAD)))/cos(t * DEG2RAD) + (_img_w/2); } ...
私は私ができるならば、少なくとも参照するコードを適応しようとしたが一般的な考えを得るが、C++バージョンとRosettaコードバージョンの実装は異なるようだ。
私が実装さ:結果はすでに私には無意味であるとして、
public static void getLines(String filename, int thetaAxisSize, ArrayData arrayData) throws IOException { BufferedImage inputImage = ImageIO.read(new File(filename)); double[] sinTable = new double[thetaAxisSize]; double[] cosTable = new double[thetaAxisSize]; for (int theta = thetaAxisSize - 1; theta >= 0; theta--) { double thetaRadians = theta * Math.PI/thetaAxisSize; sinTable[theta] = Math.sin(thetaRadians); cosTable[theta] = Math.cos(thetaRadians); } java.awt.Color color = new java.awt.Color(255, 0, 0); int max = arrayData.getMax(); System.out.println("Max value: " + max); for (int r = 0; r < arrayData.height; r++) { for (int theta = 0; theta < arrayData.width; theta++) { int val = arrayData.get(theta, r); if (val < max - 1) { continue; } System.out.println("Found val: " + val + ", r: " + r + ", theta: " + theta); int x = (int)(r * cosTable[theta]); int y = (int)(r * sinTable[theta]); System.out.println("Found val: " + val + ", r: " + r + ", theta: " + theta + ", x/y: " + x + "/" + y); } } ImageIO.write(inputImage, "PNG", new File("/tmp/hough-overlay.png")); }
をしかし、その後行き詰まっ:
Max value: 217 (this one still makes sense) Found val: 216, r: 275, theta: 342 Found val: 216, r: 275, theta: 342, x/y: -29/273 Found val: 216, r: 276, theta: 340 Found val: 216, r: 276, theta: 340, x/y: -27/274 Found val: 217, r: 277, theta: 337 Found val: 217, r: 277, theta: 337, x/y: -23/276 Found val: 217, r: 277, theta: 339 Found val: 217, r: 277, theta: 339, x/y: -25/275 Found val: 217, r: 278, theta: 336 Found val: 217, r: 278, theta: 336, x/y: -21/277 Found val: 216, r: 279, theta: 334 Found val: 216, r: 279, theta: 334, x/y: -19/278
私の数学は、私が変えることができる方法を見つけるために十分ではありません
r
およびtheta
がイメージスペースに戻ってきて、行が見つかった場合。私はHough Transformに関する多くのホワイトペーパーと記事を読んでいますが、私はまだ理解していません。私が見つけたいくつかの実装は、C++バージョンのように、すべて私が持っているJavaバージョンと少し違っているようです。誰かがHough TransformのRosetta Code Java実装を使用し、極座標から元の画像に線を戻すことができたのでしょうか?
この五角形の最大値の近くに5つのクラスタがありますか? – MBo
@MBoどういう意味ですか?ハフ空間画像によれば、線は正しく検出される。 – Max
はい、あなたの問題は、これらの明るい場所の位置を取得することですか? – MBo