画像処理とコンピュータビジョン - 第 5 章 - 画像セグメンテーション - ハフ変換

1. ハフ変換の原理の紹介

 ハフ変換は、一般的に使用されるコンピュータ ビジョン グラフィックスの検査方法で、直線や円の検査によく使用されます。

 ハフ変換の原理は次のとおりです。
 画像内に直線があると仮定します。式は次のとおりです。
y = kx + by=kx+by=k ×+b
 点(x 0, y 0) (x_{0},y_{0}) を( ×0y0)の場合、この点を通過する直線については、次の公式が成り立つ必要があります:
b = − kx 0 + y 0 b=-kx_{0}+y_{0}b=k x0+y0
 このとき、x、y軸の画像をb、k軸の画像に変更しますが、このとき直線も変化する可能性があり、上から推測できるように、対応する画像も直線になります。図に示すように、
ここに画像の説明を挿入します
 さらに、直線(x 1, y 1) (x_{1},y_{1})から点を取得します。( ×1y1)の場合、次の式が存在する必要があります:
b = − kx 1 + y 1 b=-kx_{1}+y_{1}b=k x1+y1
 このような関数を画像上に描くと、2 つの直線が点 (k ∗ , b ∗ ) で交差することがわかります(k^{*},b^{*})( kb )上の(x 1, y 1) (x_{1},y_{1})( ×1y1)( x 0 , y 0 ) (x_{0},y_{0})( ×0y0) 2 点によって決定される直線。
![ここに画像の説明を挿入](https://img-blog.csdnimg.cn/905cb7cad8ce40eaa338bde0626db96d.png
 ただし、実際の直線検出では、上記の座標系の方法は使用しません。上記の方法は、解のアイデアを提供するだけです。上記の方法の解を完成させるために、極座標方程式を使用します。上記の直線の場合、極座標方程式は次のように表すことができます:
ρ = xcos θ + sin θ \rho=xcos\theta+sin\thetar=× cosθ _+s in θwhere
 ,θ \thetaθは直線の法線ベクトルと x 軸の正の方向の間の角度であり、ρ \rhoρは、次の図に示すように、座標系の原点から直線までの垂直距離です。 以下に示すように
ここに画像の説明を挿入します
 、極座標 (ρ \rho)ρ ,θ \シータθ ) 同様に、パラメータのサイズを変更すると、空間領域に変換された直線が変更されます。そして、空域内のこの直線上のすべての点は極座標 (ρ \rhoρ ,θ \シータθ )で表される直線上の
ここに画像の説明を挿入します
 が極座標系で何組の極座標ペアに対応するかは、θ \thetaステップ サイズがβ \betaの場合、 θのステップ サイズβの場合、n の極座標の式は次のようになります:
n = 360 β n=\frac{360}{\beta}n=b360
 次に
ここに画像の説明を挿入します
 、空域の 3 点に対応する極座標曲線が下図 (a) のようになったとします。極座標曲線は 1 つの点を同時に通過します。空域内にこれら 3 つの点を通過する直線があることがわかります。最も多くの交差点がある点を探してください。それが空域内で探している直線です。
ここに画像の説明を挿入します

2. ハフ変換アルゴリズムのプロセス

·Hough变换直线检测的步骤如下:
1.0的取值范围为[0,360],单位为度根据检测精度要求,采取适当的步长对角度和长度的取值范围进行离散化,形成0-p平面上的离散网格。
2.将每一个离散网格视为一个投票累加器,初始时全部清03.遍历图像的所有像素,对于每个像素计算离散值0i和p=xcos0+ysin0.
4.对在参数空间中将对应的累加器中的值加1,从而完成求出相应的离散化值p,对于每个(p,0)该像素点的投票的投票之后,在离散化的参数空间中找出所累积的投票值
5.访问完所有的图像像素并完成所有,点这些点所对应的参数即为检测得到的直线的参数大于某给定闽值T的局部极大值点,

3. ハフ変換アルゴリズムのコード

import numpy as np
import cv2
from PIL import Image,ImageEnhance 
import matplotlib.pyplot as plt
"""
hough变换是一种常用的计算机视觉图形检验方法,霍夫变换一般用于检验直线或者圆。

"""
img = Image.open(r"C:\Users\Zeng Zhong Yan\Desktop\py.vs\python学习\test.webp")
#增强图像效果
img = ImageEnhance.Contrast(img).enhance(3)
img.show()
#处理成矩阵,便于后续处理
img = np.array(img)
#灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#cv2.THRESH_OTSU具有双峰值,显示效果更好.
"""
cv2.THRESH_OTSU使用最小二乘法处理像素点。一般情况下,cv2.THRESH_OTSU适合双峰图。
cv2.THRESH_TRIANGLE使用三角算法处理像素点。一般情况下,cv2.THRESH_TRIANGLE适合单峰图。
"""
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
#canny边缘检验算法处理
result = cv2.Canny(thresh, ret-30, ret+30, apertureSize=3)

#霍夫变换检测直线
lines = cv2.HoughLinesP(result, 1, 1 * np.pi / 180, 10, minLineLength=10, maxLineGap=5)
# 画出检测的线段
for line in lines:
    for x1, y1, x2, y2 in line:
        cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0),2)
img = Image.fromarray(img, 'RGB')
img.show()

4. ハフ変換アルゴリズムの効果

1. 元の画像は次のとおりです。
ここに画像の説明を挿入します
2. ハフ変換後の直線検出の効果
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_71819746/article/details/133381679