研究で調べていた際に、少し時間がかかったので。
横線、縦線の検出には、Sobelフィルタを用います。
水平方向検出用
\begin{matrix}
1 & 2 & 1 \\
0 & 0 & 0 \\
-1 & -2 & -1
\end{matrix}
垂直方向検出用
\begin{matrix}
1 & 0 & -1 \\
2 & 0 & -2 \\
1 & 0 & -1
\end{matrix}
これらを画像に適用します。
また、OpenCVには
cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
があるので使いましょう。
入力画像srcはグレースケールにします。
ddepthは色深度で、cv2.CV_32Fを入れとけば問題ないです。
(dx, dy) = (0, 1)で水平方向検出、(1, 0)で垂直方向検出です。
例に示したソーベルフィルタのカーネルサイズは3なので、ksizeは3でいいでしょう。
gray = cv2.imread('sample.jpg', 0)
dx = cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize=3)
dy = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=3)
cv2.imwrite('./dx.jpg', dx)
cv2.imwrite('./dy.jpg', dy)
Lenaだとわかりにくいですね。。。
今道路に関しての検出してるのですが、そちらだとわかりやすいです。