Extracción del centro de la franja láser: método de valor extremo python
método de valor extremo
El método de valor extremo primero necesita obtener la función de distribución de grises de la sección transversal de la franja de luz y realizar una operación de gradiente en ella. El punto de píxel donde el valor de degradado es igual a cero es el punto de valor de gris máximo de la sección transversal en la franja de luz, y este punto se toma como el punto central de la franja de luz. El método del valor extremo requiere que la distribución de grises de la sección de la franja láser se aproxime a una distribución gaussiana ideal. Debido a la influencia del ruido ambiental, la distribución de grises de la franja láser en la superficie del juego de ruedas del tren no es una distribución gaussiana ideal. Si se utiliza el valor extremo en este caso, el método extrae la línea central de la franja de luz y el punto central de la franja de luz obtenido puede ser un punto extremo local, lo que genera un gran error en el resultado de la extracción. Como se muestra en la figura de la izquierda de la Figura 1-5, cuando la distribución en escala de grises de la barra de luz es una distribución gaussiana ideal, el método del valor extremo puede extraer rápidamente el centro de la barra de luz láser. Cuando se ve perturbado por el ruido, como se muestra en la figura de la derecha de la Figura 1-5, el valor máximo ya no está en la posición original, sino en el lugar del ruido, por lo que habrá un error de Δo con el centro real de la luz. bar. En el entorno de detección del juego de ruedas del tren con una baja relación señal-ruido, el método es difícil de aplicar a la extracción de la línea central de la franja láser del juego de ruedas en el entorno dinámico.
código pitón
# 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)