ハフの記録を学習OpenCVの変換

ハフ変換を探して画像内の投票の収集と同様の形状を得るために、線形、円形、および画像処理方法における他の単純な形状であります

デカルト座標系によっては、単に明Huofuを変換します

Yは、システム(デカルト空間)デカルト座標系のxyにおける直線を有し= K0 * X + B0ハフKBポイントマップ座標に見出される(ハフ空間)(K0、B0)

また、点(X0、Y0)により、ブランチB = -x0 * K + Y0に直交座標空間は、ハフ空間内にあるマッピングされています 

 

そこに二つの点(X1、Y1)、(X2、Y2)がデカルト空間にあり、分岐線Y = K 0 * X + B0に接続されている場合 

ハフ空間マッピング二つの直線B = -X1 * K + Y1、B = -x2 * K + Y2と点(K0、B0)、点で交差する二つの直線(K0、B0)

(私はこれらの線形ハフ空間における直交座標空間は円を形成する場合、すべてのポイントが1足にマッピングされていることを推測します)

 

この時点で、X = X0 kを無限直線があってもよい、デカルト空間における切片値は、したがって、ハフ空間にマッピングすることができないことができません、

デカルト座標系、極座標系上にマッピングすることができます

極座標の半径rと極角を用いて極座標系の角度は、θ、rは原点からの直線の垂直距離であり、θは垂直なX軸に直線の起源であります

 

ハフリニアの基本的な考え方は、選択を変換:選択複数行は、可能な限りハフ空間内の点にマージ

機能フォーム

行= cv2.HoughLines(画像、ロー、シータ、閾値)

各要素は、浮動小数点ラインで検出された直線のパラメータを表し、(R、θ)は、式numpy.ndarrayあります

ハフ変換前の画像の他の種類の必須変換場合、入力画像の画像は、指定されたフォーマットに変換するために、単一チャネルの8ビットのバイナリ画像であることが

一般に距離r、1の精度の画素におけるロー精度の

角度シータθの精度で、精度は一般にπ/ 180で使用され、それはすべての可能な角度の検索を表します

閾値判定小さく、より直線の閾値を、

 

検出機能が直線ではなく線であるため、全く直線終点検出がありません、

 

1つの インポートCV2                                                                       
 2  インポートNPとしてnumpyの 
 3  インポートPLTとしてmatplotlib.pyplot
 4 IMG = cv2.imread(" mc.jpg " 5グレー= cv2.cvtColor(IMG、cv2.COLOR_BGR2GRAY)
 6つの縁= cv2.Canny(灰色、 50、150、apertureSize = 3 7 ORGB = cv2.cvtColor(IMG、cv2.COLOR_BGR2RGB)
 8 oShow = orgb.copy()
 9行= cv2.HoughLines(エッジ、1、np.pi / 180、140 10  ライン行:
 11      ロー、シータ= ライン[0]
 12      、A = np.cos(シータ)
 13      B = np.sin(シータ)
 14      X0 = * ロー
 15      Y0 = b *のロー
 16      、X1 = INT(X0 + 1000年* ( - B))
 17      Y1 = INT(Y0 + 1000年* ())
 18      ×2 = INT(X0 - 900 *( - B))
 19      Y2 = INT(Y0 - 900 * ())
 20      cv2.line( ORGB、(X1、Y1)、(X2、Y2)、(0,0,255)、2 21 plt.subplot(121 22  plt.imshow(oShow)
 23 plt.axis(' オフ' 24 plt.subplot(122 25  plt.imshow(ORGB)
 26 plt.axis(' オフ' 27 plt.show()

 

 

 

それは直線を繰り返した結果、検出された繰り返し多くを見ることができるように

ハフ誤検出をもたらす、非線形の関係が直線として検出された位置合わせするために起こるかもしれない有限数の点を使用して変換

 

ハフハフ変換アルゴリズムを変換する基本的な確率が変更され、それは考慮にすべてのポイントを取ることはありません、2つの点が直線の改善を選択するためにあります

図1に示すように、ラインの最小許容長さ、それは直線を構成するドット数の閾値を超えているが、このラインの長さが非常に短い場合、

画素数がさえ直線で起こるので、それはこのように誤検出を回避、直線を決定するものではありません

2.最大画素ピッチが直線受け入れることができ、それは直線を構成するドット数の閾値を超えているが、画素の組の間の距離が遠く離れている場合、

私たちは、直線の決意の結果として、受け入れることはありません

機能フォーム

行= cv2.HoughLinesP(画像、ロー、シータ、閾値、minLineLength、maxLineGap)

MinLineLength即ち直線の最小長は、デフォルト値は0であります

maxLineGap即ちピクセルの最小間隔、デフォルト値は0であります

基本的なハフと一致する他の値変換

 

1  インポートCV2
 2  インポートNPとしてnumpyの                                                               
 3  インポートPLTとしてmatplotlib.pyplot
 4 IMG = cv2.imread(" mc.jpg "、-1 5グレー= cv2.cvtColor(IMG、cv2.COLOR_BGR2GRAY) 
 6つの縁= cv2.Canny (灰色、50、150、apertureSize = 3 7 ORGB = cv2.cvtColor(IMG、cv2.COLOR_BGR2RGB)
 8 oShow = orgb.copy()
 9行= cv2.HoughLinesP(エッジ、1、np.pi / 180、1 、minLineLength = 40 10         maxLineGap = 10 11  のための行:
 12      X1、Y1、X2、Y2 = ライン[0]
 13      cv2.line(ORGB、(X1、Y1)、(X2、Y2)、(255,0,0)、 5 14 plt.subplot(121 15  plt.imshow(oShow)
 16 plt.axis(' オフ' 17 plt.subplot(122 18  plt.imshow(ORGB)
 19 plt.axis(' オフ' 20 PLT 。公演()

 

 

 

 

 

 

 1 import cv2                                                                       
 2 import numpy as np 
 3 import matplotlib.pyplot as plt
 4 img = cv2.imread("chess.jpg", 0) 
 5 imgo = cv2.imread("chess.jpg" , -1)
 6 o = cv2.cvtColor(imgo , cv2.COLOR_BGR2RGB)
 7 oshow = o.copy()
 8 img = cv2.medianBlur(img,5)
 9 circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT,1,300,param1 = 50 
10         ,param2 = 30 , minRadius = 100 , maxRadius = 200)
11 circles = np.uint16(np.around(circles))
12 for i in circles[0,:]:
13     cv2.circle(o , (i[0] , i[1]), i[2] , (255,0,0) , 12)
14     cv2.circle(o , (i[0] , i[1]), 2 , (255,0,0) , 12)
15 plt.subplot(121)
16 plt.imshow(oshow)
17 plt.axis('off')
18 plt.subplot(122)
19 plt.imshow(o)
20 plt.axis('off')
21 plt.show()

 

 

 

 

おすすめ

転載: www.cnblogs.com/miaorn/p/12309980.html