Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sharpen image to detect edges/lines in a stamped "X" object on paper

I'm using python & opencv. My goal is to detect "X" shaped pieces in an image taken with a raspberry pi camera. The project is that we have pre-printed tic-tac-toe boards, and must image the board every time a new piece is laid onto the board (with ink stamps). Then the output says what type of piece, if any, is in what section of the tic-tac-toe board.

Here, I have the lines I have detected in the image in green:

As you can see, the "X" shaped pieces seems to not be easily detected. Only one line on some of the stamps gets "seen."

Here's what the edge detection looks like after the filters:

My method for detecting the "X" shaped piece is to check in each section for any lines with a non-horizontal/vertical slope. My problem is that the "X" shaped stamps are not perfect lines; thus, my code hardly picks up on the lines.

I have tried applying an unsharp filter, using histogram equalization, and just using grayscale into edge detection. None of these have detected more than 1 line in any "X" shaped piece.

Roughly what I am doing:

#sharpen image using blur and unsharp method
gaussian_1 = cv2.GaussianBlur(image, (9,9), 10.0)
unsharp_image = cv2.addWeighted(image, 1.5, gaussian_1, -0.5, 0, image)
#apply filter to find stamp pieces, histogram equalization on greyscale
hist_eq = cv2.equalizeHist(unsharp_image)
#edge detection (input,threshold1,threshold2,size_for_sobel_operator)
edges = cv2.Canny(hist_eq,50,150,apertureSize = 3)
#find lines (edges,min_pixels,min_degrees,min_intersections,lineLength,LineGap)
lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength,maxLineGap)

Only I'm applying this to each of the 9 sections of the board individually, but that's not really important.

TLDR: How can I make my image so that my lines are "crisp" and sharp? I would like to know what I can use to make a stamped "X" look like a few lines.

like image 374
thunderjolt Avatar asked Nov 11 '15 00:11

thunderjolt


People also ask

How do you find the edges of an image?

Common edge detection algorithms include Sobel, Canny, Prewitt, Roberts, and fuzzy logic methods. Image segmentation using the Sobel method. Image segmentation using the Canny method. Image segmentation using a Fuzzy Logic method.

What is an edge image?

An edge in an image is a significant local change in the image intensity, usually associated with a discontinuity in either the image intensity or the first derivative of the image intensity.

What algorithm is used to detect lines in OpenCV?

The Hough Transform is a method that is used in image processing to detect any shape, if that shape can be represented in mathematical form. It can detect the shape even if it is broken or distorted a little bit.


1 Answers

You can try Canny edge detector with Otsu's robust method for determining the dual threshold value.

im = cv2.imread('9WJTNaZ.jpg', 0)
th, bw = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
edges = cv2.Canny(im, th/2, th)

Then you can use

  • convexity defects of the contours

or

  • the area of the filled contour to the area of the bounding box of the contour

to differentiate the cross marks from circles.

This is what I get when I apply Canny to your image.

edges

like image 132
dhanushka Avatar answered Nov 03 '22 22:11

dhanushka