7
votes

I used the Laplacian transform in OpenCV for edge detection and then used Hough Line Transform for detecting lines in it. These identified lines need to eventually removed from the image.

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('Feb_16-0.jpg',0)
kernel = np.ones((1,1),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
blur = cv2.GaussianBlur(opening,(1,1),0)
ret3,th4 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 
laplacian = cv2.Laplacian(th4,cv2.CV_8UC1)
cst = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(laplacian,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
    cv2.line(cst,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imwrite('houghlines5.jpg',cst)

I expect to identify all the lines in the Bill: Internet Bill

The results of the laplacian edge detection is as follows:

The edge detection results

whereas the results returned by Hough Line Transform identifies only one line as marked by the green line in the below image: Transformed Internet Bill

Could anyone help me figure out what modifications in code would be required so that all the bold horizontal/vertical lines of the Internet Bill could be identified?

1
Can you also add the result of the laplacian edge detection as a picture? Hough transformation is very sensitive to parameters, further optimization must be done in iteration.Nikolas Rieble
Please also add to your code the import of the picture and the import of the libraries you used, so that anyone willing to help only has to copy paste the code to test it.Nikolas Rieble

1 Answers

13
votes

It seems to me that you are only reading the first element of "lines" in:

for x1,y1,x2,y2 in lines[0]:
    cv2.line(cst,(x1,y1),(x2,y2),(0,255,0),2)

Thus, you are only drawing the first (most significant) line, that has been found ( the longest, most thick). I suggest you to try:

for line in lines:    
    for x1,y1,x2,y2 in line:
         cv2.line(cst,(x1,y1),(x2,y2),(0,255,0),2)

Further, I recommend to set minLineLength lower, if you still do not get the correct results.