10

標準の画像処理フィルター (OpenCV から) を使用して、画像から長い水平線と垂直線を削除するにはどうすればよいですか?

画像は白黒なので、削除するということは単純に黒く塗るということです。

図:

必要なフィルターの図

私は現在Pythonでそれを行っており、ピクセルの行と列を繰り返し処理し、連続するピクセルの範囲を検出して、Nピクセルより長いものを削除しています。ただし、OpenCV ライブラリと比較すると非常に遅く、OpenCV 関数で同じことを実現する方法があれば、桁違いに高速になる可能性があります。

これは、ピクセルの行(水平線の場合)であるカーネルを使用した畳み込みによって実行できると思いますが、トリックを実行する正確な操作を理解するのに苦労しています。

4

5 に答える 5

9

線が本当に水平/垂直である場合は、これを試してください

import cv2
import numpy as np
img = cv2.imread('c:/data/test.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
linek = np.zeros((11,11),dtype=np.uint8)
linek[5,...]=1
x=cv2.morphologyEx(gray, cv2.MORPH_OPEN, linek ,iterations=1)
gray-=x
cv2.imshow('gray',gray)
cv2.waitKey(0)    

結果

ここに画像の説明を入力

詳細については、 OpenCV Morphological Transformationsのドキュメントを参照してください。

于 2013-09-30T18:18:02.953 に答える
1

画像から水平線を削除するには、エッジ検出アルゴリズムを使用してエッジを検出し、OpenCV でハフの変換を使用して線を検出し、それらを白くします。

import cv2
import numpy as np
img = cv2.imread(img,0)
laplacian = cv2.Laplacian(img,cv2.CV_8UC1) # Laplacian Edge Detection
minLineLength = 900
maxLineGap = 100
lines = cv2.HoughLinesP(laplacian,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(img,(x1,y1),(x2,y2),(255,255,255),1)
cv2.imwrite('Written_Back_Results.jpg',img)
于 2016-07-13T11:43:21.030 に答える