Python open-cv在嘈杂的图像中查找线条

92vpleto  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(101)

我想在这个

中找到深灰色的对角线,背景相当嘈杂,亮度有梯度。(当打开.png时,这条线几乎看不见,但如果我将其读为灰度,这条线会变得更加明显。)
我尝试了不同的模糊,阈值和精明的边缘检测组合。我能想到的最好的办法是:

img_blur = cv.bilateralFilter(img, 3, 120, 120)
thresh = cv.adaptiveThreshold(img_blur, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 501, 3)

这导致了这个

。这里仍然有相当多的噪音在背景和线路中断。
我尝试了一些形态操作(扩张,侵 eclipse ,打开,关闭),但没有真实的的改善。
应用类似lines = cv.HoughLines(thresh, rho=1, theta=np.pi / 180, threshold=130)的东西给我留下了这个

。这就是我想要的,但是130的阈值对类似的图像不起作用,并且会找不到或找不到太多的线。

zf9nrax1

zf9nrax11#

您可以尝试首先使用Hessian检测图像中的脊,然后使用阈值。这在您的示例图像上似乎工作正常。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.feature import hessian_matrix, hessian_matrix_eigvals

def detect_ridges(img: np.ndarray, sigma: int = 3) -> np.ndarray:
    img = cv2.equalizeHist(img.astype(np.uint8))

    elements = hessian_matrix(img, sigma, use_gaussian_derivatives=False)
    eigvals = hessian_matrix_eigvals(elements)

    cv2.normalize(eigvals[0], eigvals[0], 0, 255, cv2.NORM_MINMAX).astype(np.uint8)

    return eigvals[0]

original_image = cv2.imread("zkN7m.png", cv2.IMREAD_GRAYSCALE)
ridges = detect_ridges(original_image)

thresholded = cv2.adaptiveThreshold((255-ridges).astype(np.uint8), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 2)

plt.imshow(thresholded, cmap="bone")

相关问题