Hough Transformationは、画像処理における機能抽出技術です。パラメーター空間内のこのプロセスは、蓄積された結果の積極的な最大値を、ハフ変換の結果として特定の形状に適合するセットに計算します。
開発の歴史:
1962年にポール・ハフによって最初に提案され、直線と曲線を検出しました。
1972年にリチャード・デュダとピーター・ハートによって宣伝され、あらゆる形のオブジェクトの認識に拡大しました。
原理:
直線は、y = k*x+bとして長方形の座標系で表され、r = x*cos(theta)+y*sin(theta)として極座標系で表されます。 Hough Transformationの考え方は、長方形座標系のポイントが極座標系下の直線に対応することであり、同様に、極座標系のポイントは長方形座標系下の直線に対応するということです。長方形の座標系の直線では、勾配とインターセプトが確実であるため、この直線のすべての点は極座標系のポイントに焦点を合わせ、そのような焦点は長方形の座標系の直線を表します。
直線x = Cの場合、実際のアプリケーションでは、パラメーター方程式p = x*cos(theta)+y*sin(theta)が使用されます。このようにして、画像平面上の点はパラメーターr-theta平面上の曲線に対応し、残りは同じです。
標準的なハフ変換:
imgproc.houghlines(マット画像、マットライン、二重rho、double theta、intしきい値、double srn、double stn、double min_theta、double max_theta)
パラメーター説明:
画像:ソース画像
線:検出された線の出力ベクトルは、ハフ変換後に保存されます
RHO:ピクセルの距離精度
シータ:ラジアンの角度精度
しきい値:部品が直線であるときに到達する必要がある値
SRN:RHOパラメーターの除数距離、デフォルト値は0です
STN:Thetaパラメーターの除数距離、デフォルト値0
min_theta:検出された線の最小角度
MAX_THETA:検出されたラインの最大角
サンプルコード:
public static void main(string [] args){system.loadLibrary(core.native_library_name); MAT SRCIMAGE = IMGCODECS.IMREAD( "f://6597210504144579394.jpg"); mat dstimage = srcimage.clone(); imgproc.canny(srcimage、dstimage、400、500、5、false);マットストレージ= new Mat(); imgproc.houghlines(dstimage、storage、1、math.pi / 180、200、0、0、0、10); for(int x = 0; x <storage.rows(); x ++){double [] vec = storage.get(x、0); double rho = vec [0]; double theta = vec [1];ポイントpt1 = new Point();ポイントpt2 = new Point(); double a = math.cos(theta); double b = math.sin(theta); double x0 = a * rho; double y0 = b * rho; pt1.x = math.round(x0 + 1000 *(-b)); pt1.y = math.round(y0 + 1000 *(a)); pt2.x = math.round(x0-1000 *(-b)); pt2.y = math.round(y0-1000 *(a)); if(theta> = 0){imgproc.line(srcimage、pt1、pt2、new Scalar(255、255、255、255)、1、imgproc.line_4、0); }} imgcodecs.imwrite( "f://dst2.jpg"、srcimage); }累積確率ハフ変換:
imgproc.houghlinesp(マット画像、マットライン、二重rho、ダブルシータ、intしきい値、二重minlinelength、double maxlinegap)
パラメーター説明:
画像:ソース画像
線:検出された線の出力ベクトルは、ハフ変換後に保存されます
RHO:ピクセルの距離精度
シータ:ラジアンの角度精度
しきい値:部品が直線であるときに到達する必要がある値
MinlinElength:最低線セグメントの長さ、デフォルトは0になります
maxlineGap:同じ行のポイントにポイントを接続するのに許可されている最大距離、デフォルトは0です
サンプルコード:
public static void main(string [] args){system.loadLibrary(core.native_library_name); MAT SRCIMAGE = IMGCODECS.IMREAD( "f://6597210504144579394.jpg"); mat dstimage = srcimage.clone(); imgproc.canny(srcimage、dstimage、400、500、5、false);マットストレージ= new Mat(); imgproc.houghlinesp(dstimage、storage、1、math.pi / 180、50、0、0); for(int x = 0; x <storage.rows(); x ++){double [] vec = storage.get(x、0); double x1 = vec [0]、y1 = vec [1]、x2 = vec [2]、y2 = vec [3];ポイントstart = new Point(x1、y1);ポイントエンド= new Point(x2、y2); imgproc.line(srcimage、start、end、new Scalar(255、255、255、255)、1、imgproc.line_4、0); } imgcodecs.imwrite( "f://dst2.jpg"、srcimage); }ソース画像:
標準的なハフ変換の結果:
累積確率ハフ変換の結果:
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。