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

3
我想在这张图片中找到暗灰色的对角线。背景非常嘈杂,并且亮度有梯度变化。 (当打开.png文件时,这条线几乎看不见,但如果将其读取为灰度图像,则线条更加明显。)
我尝试了不同的模糊、阈值化和Canny边缘检测的组合。我能想到的最好的方法是:
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),我得到了这个 result。 这正是我想要的,但是阈值130对于类似的图像不起作用,可能找不到或找到太多线条。
1个回答

3
你可以尝试使用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")

enter image description here


在更多的图像上进行测试,使用更高的sigma值ridges = detect_ridges(original_image, sigma=5)给我带来了非常好的结果。谢谢! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接