激光条纹中心提取——极值法python

激光条纹中心提取——极值法python

  • 极值法
  • python代码

极值法

极值法首先需要获取光条纹横截面的灰度分布函数,并对其进行梯度运算。梯度值等于零处的像素点就是光条纹中横截面灰度极大值点,并将该点作为光条纹中心点。极值法要求激光条纹截面的灰度分布近似成理想高斯分布,由于受到环境噪声的影响,列车轮对表面的激光条纹灰度分布并不是理想的高斯分布,如果在这种情况下使用极值法提取光条纹中心线,得到的光条纹中心点有可能是局部的极值点,造成提取结果出现较大的误差。如图1-5左图所示,当光条的灰度分布成理想的高斯分布式,极值法可以快速的提取出激光光条的中心。在受到噪声干扰时,如图1-5右图所示,最大值已经不再原来的位置,而是到了噪声的地方,因此和真实的光条中心会存在Δo的误差。在信噪比较低的列车轮对的检测环境下,该方法难以适用于动态环境下列车轮对激光条纹中心线的提取。
激光条纹中心提取——极值法python_第1张图片

python代码

# Maximum value method
import cv2
import numpy as np
import time

def Extreme(img, thresh):
    row,col,chanel = img.shape
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    points= []
    newimage = np.zeros((row,col),np.uint8)
    for i in range(col):
        #Pmax = np.max(gray[:,i])
        Prow = np.argmax(gray[:,i])
        if Prow > thresh:
            points.append([Prow,i])
    for p in points:
        newimage[p[0],p[1]] = 255
        img[p[0],p[1],:] = [0,0,255]
    # cv2.namedWindow("origin",0)
    # cv2.namedWindow("centerLine",0)
    # cv2.imshow("origin",img)
    # cv2.imshow("centerLine",newimage)

    return img, newimage

# start_time = time.time()
# img = cv2.imread("./image/2-3.png")
# Extreme(img)
# tack_time = time.time() - start_time
# cv2.waitKey(0)
# print("One image need tack time: ", tack_time)

if __name__ == "__main__":
    import time
    import os
    image_path = "./image/"
    save_path = "./paper/mvm/"
    if not os.path.isdir(save_path): os.makedirs(save_path)

    sum_time = 0
    for img in os.listdir(image_path):
        image = cv2.imread(os.path.join(image_path, img))
        start_time = time.time()
        _, image_c = Extreme(image, 100)
        end_time = time.time()
        sum_time += end_time - start_time
        cv2.imwrite(os.path.join(save_path, img), image_c)
    average_time = sum_time / len(os.listdir(image_path))
    print("Average one image time: ", average_time)

你可能感兴趣的:(激光条纹中心提取,pytorch,深度学习,机器学习)