Python open-cv 在噪声图像中查找线条

问题描述 投票:0回答:1

我想找到这个图中的深灰色对角线 grayscale image 背景噪音很大,并且亮度有梯度。 (打开 .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)

结果是这样的 threshold image。 这里背景噪音仍然很大,线路中断。

我尝试了一些形态学操作(膨胀、腐蚀、打开、关闭),但没有真正的改进。

应用类似

lines = cv.HoughLines(thresh, rho=1, theta=np.pi / 180, threshold=130)
的东西给我留下了这个。 这就是我想要的,但是 130 的阈值不适用于相似的图像,并且会发现没有线条或太多线条。

python opencv edge-detection feature-detection
1个回答
2
投票

您可以尝试首先使用 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")

© www.soinside.com 2019 - 2024. All rights reserved.