我正在做一个个人项目,我想在显微镜图像中选择一些非常具体的线条。第一张图片是原始图像,第二张图片是我想检测的线条(黄色)的图像。不是直线是的,但确实是直线。
现在,我为线检测制作了一个非常基本的代码,这种代码可以“有效”检测线,但在此过程中需要检测到很多不需要的线。查看带有另一个图像的示例(以及它下面的代码,在 Python 中,使用 OpenCV)。
import cv2 as cv
import numpy as np
#Load and normalize .tif image:
img = 'imagenes.tif'
img = cv.imread(img, 0)
img_scaled = cv.normalize(img, np.zeros((800, 800)), 0, 255, cv.NORM_MINMAX)
#Resizing images:
pct = 30
w = int(img.shape[1] * pct / 100)
h = int(img.shape[0] * pct / 100)
dim = (w, h)
resized = cv.resize(img_scaled, dim, interpolation = cv.INTER_AREA)
# First stage: Gaussian blur.
gaussian = cv.GaussianBlur(resized,(5, 5),0)
# Second Stage: edge detection with Canny.
low_threshold = 90
high_threshold = 150
edges = cv.Canny(gaussian, low_threshold, high_threshold)
# Third stage: Hough Line transform.
rho = 1
theta = np.pi / 180
threshold = 15
minLineLenght = 15
maxLineGap = 15
myBlankLines = resized.copy()
lines = cv.HoughLinesP(edges, rho, theta, threshold, np.array([]),
minLineLenght, maxLineGap)
for line in lines:
for x1,y1,x2,y2 in line:
cv.line(myBlankLines,(x1,y1),(x2,y2),(255,0,0),5)
cv.imshow('image_resized', resized)
cv.imshow('Stage 1: Gaussian', gaussian)
cv.imshow('Stage 2: Edges', edges)
cv.imshow('Stage 3: Lines', myBlankLines)
cv.waitKey(0)
cv.destroyAllWindows()
现在。我不介意从零开始构建过滤器并避免使用 OpenCV 或任何其他图像处理/计算机视觉库。但我对我应该走的方向感到有点迷茫。我不确定是否:
- 做更多的预过滤。
- 调整霍夫线变换的参数。
- 可能与机器学习有关的其他东西。
你有什么建议?感谢您对这项有趣的任务提出的任何建议。