我想找到这个图中的深灰色对角线 背景噪音很大,并且亮度有梯度。 (打开 .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)
结果是这样的 。 这里背景噪音仍然很大,线路中断。
我尝试了一些形态学操作(膨胀、腐蚀、打开、关闭),但没有真正的改进。
应用类似
lines = cv.HoughLines(thresh, rho=1, theta=np.pi / 180, threshold=130)
的东西给我留下了这个。
这就是我想要的,但是 130 的阈值不适用于相似的图像,并且会发现没有线条或太多线条。
您可以尝试首先使用 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")