首页 > 解决方案 > 区分实线和虚线的相关性

问题描述

想弄清楚自动相关是否是区分实线和虚线的好主意。

我得到固定尺寸的图像,由虚线(不同图像中可变频率的间隙)和实线(实线的长度可能不会延伸到整个图像尺寸)组成

起初,我开始收集图像沿其长度的补丁窗口强度,并在浮点的 std::vector 中获得其补丁强度比(每个补丁的总强度/补丁大小 * 255)

考虑使用patch ratio > threshold number作为检测的一种形式。但是,如果遇到没有完全延伸到整个图像长度的实线,这将失败。

有人建议使用自相关来检测是否存在满足阈值的多个峰值(希望我做对了)。现在我在这里有几个问题

  1. 这种方法真的可行吗?或者可能有其他指标或方法来区分虚线和实线
  2. 有没有人有代码与 std::vectors 进行自相关?或者可以请我指出一个实现。我正在使用 OpenCV 和 C++

顺便说一句,这是我的形象

虚线 不完整的虚线

一条实线
一条实线

标签: c++opencvimage-processing

解决方案


一种简单的方法是使用虚线比实线具有更少像素的观察结果。使用这些信息,我们可以cv2.countNonZero()用来确定非零元素的数量。由于您的图像已经被阈值化,因此具有更多像素的图像应该是实线,而具有较少像素的图像应该是虚线。

结果:

(“虚线”,246)

(“固体”,1193)

我的实现是用 Python 实现的,但您可以使用相同的想法轻松地将其转换为 C++

import cv2

dashed = cv2.imread('dashed.png')
dashed = cv2.cvtColor(dashed, cv2.COLOR_BGR2GRAY)
solid = cv2.imread('solid.png')
solid = cv2.cvtColor(solid, cv2.COLOR_BGR2GRAY)

cv2.imshow('dashed', dashed)
cv2.imshow('solid', solid)

dashed_pixels = cv2.countNonZero(dashed)
solid_pixels = cv2.countNonZero(solid)

print('dashed', dashed_pixels)
print('solid', solid_pixels)
cv2.waitKey(0)

推荐阅读