用opencv检测连通线
Connected line detection with opencv
我正在尝试转换如下所示的图像:
变成一个看起来像(我画的):
我想检测并绘制图像中的线条,其中 thick/thin 部分被平滑以创建稍微均匀的宽度,并且如果图像中的像素相互接触,则线条重叠。 (如果你放大原始图像,你可以看到即使是细线段也有连接它们的像素)
我 运行 遇到的两个问题是:
- 原始图像中的薄像素部分最终破碎。因此,转换后图像的像素不会在原始图像中重叠,从而在线条中产生间隙。
- 一些线条靠得足够近,如果我放大东西来尝试修复 #1,检测到的线条最终会在不应该重叠的地方相互重叠。
我目前正在尝试与 Canny/Hough 打交道以使其正常工作,但到目前为止还没有成功。
edges = cv2.Canny(img, 50, 200, None, 3)
hough_img = np.copy(img) * 0 # creating a blank to draw lines on
lines = cv2.HoughLinesP(img, rho=1, theta=np.pi / 180, threshold=35, lines=np.array([]),
minLineLength=3, maxLineGap=2)
for line in lines:
for x1, y1, x2, y2 in line:
cv2.line(hough_img, (x1, y1), (x2, y2), (255, 0, 0), 2)
也许 scikit-image
medial_axis() 就是您所需要的:
from skimage.io import imread
from skimage.morphology import medial_axis
# Load image
im = imread('https://i.stack.imgur.com/cqgfc.png',as_gray=True)
skel= medial_axis(im)
或者,正如 Bart 在评论中的善意建议,您可以使用 skeletonize()
:
from skimage.io import imread, imsave
from skimage.morphology import skeletonize
from skimage.filters import threshold_otsu
# Load image
im = imread('https://i.stack.imgur.com/cqgfc.png',as_gray=True)
# Get Otsu threshold
t = threshold_otsu(im)
# Binarize and skeletonize
r = skeletonize(im>threshold_otsu(im))*255
# Save
imsave('result.png',r)
我正在尝试转换如下所示的图像:
变成一个看起来像(我画的):
我想检测并绘制图像中的线条,其中 thick/thin 部分被平滑以创建稍微均匀的宽度,并且如果图像中的像素相互接触,则线条重叠。 (如果你放大原始图像,你可以看到即使是细线段也有连接它们的像素)
我 运行 遇到的两个问题是:
- 原始图像中的薄像素部分最终破碎。因此,转换后图像的像素不会在原始图像中重叠,从而在线条中产生间隙。
- 一些线条靠得足够近,如果我放大东西来尝试修复 #1,检测到的线条最终会在不应该重叠的地方相互重叠。
我目前正在尝试与 Canny/Hough 打交道以使其正常工作,但到目前为止还没有成功。
edges = cv2.Canny(img, 50, 200, None, 3)
hough_img = np.copy(img) * 0 # creating a blank to draw lines on
lines = cv2.HoughLinesP(img, rho=1, theta=np.pi / 180, threshold=35, lines=np.array([]),
minLineLength=3, maxLineGap=2)
for line in lines:
for x1, y1, x2, y2 in line:
cv2.line(hough_img, (x1, y1), (x2, y2), (255, 0, 0), 2)
也许 scikit-image
medial_axis() 就是您所需要的:
from skimage.io import imread
from skimage.morphology import medial_axis
# Load image
im = imread('https://i.stack.imgur.com/cqgfc.png',as_gray=True)
skel= medial_axis(im)
或者,正如 Bart 在评论中的善意建议,您可以使用 skeletonize()
:
from skimage.io import imread, imsave
from skimage.morphology import skeletonize
from skimage.filters import threshold_otsu
# Load image
im = imread('https://i.stack.imgur.com/cqgfc.png',as_gray=True)
# Get Otsu threshold
t = threshold_otsu(im)
# Binarize and skeletonize
r = skeletonize(im>threshold_otsu(im))*255
# Save
imsave('result.png',r)