The idea is to extract the plate which is in the shape of an ellipse.
I tried the HoughCircles
method from OpenCV but it only works for perfect circles.
I also tried the hough_ellipse
method from skimage
but it is taking too long or I implemented it the wrong way.
Is it possible to detect ellipse shape using the OpenCV module?
What other solutions exist?
The main key for extracting the plate is using cv2.adaptiveThreshold , but there are few more stages:
Finding the ellipse by shape, is much less robust...
Here is the code:
import numpy as np
import cv2
import imutils
img = cv2.imread('food_plate.jpg')
# Convert to Grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Apply adaptive threshold with gaussian size 51x51
thresh_gray = cv2.adaptiveThreshold(gray, 255, adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C, thresholdType=cv2.THRESH_BINARY, blockSize=51, C=0)
#cv2.imwrite('thresh_gray.png', thresh_gray)
# Find connected components (clusters)
nlabel,labels,stats,centroids = cv2.connectedComponentsWithStats(thresh_gray, connectivity=8)
# Find second largest cluster (the cluster is the background):
max_size = np.max(stats[1:, cv2.CC_STAT_AREA])
max_size_idx = np.where(stats[:, cv2.CC_STAT_AREA] == max_size)[0][0]
mask = np.zeros_like(thresh_gray)
# Draw the cluster on mask
mask[labels == max_size_idx] = 255
# Use "open" morphological operation for removing some artifacts
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)))
#cv2.imwrite('mask.png', mask)
# Fill the plate with white pixels
cv2.floodFill(mask, None, tuple(centroids[max_size_idx].astype(int)), newVal=255, loDiff=1, upDiff=1)
#cv2.imwrite('mask.png', mask)
# Find contours, and get the contour with maximum area
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = imutils.grab_contours(cnts)
c = max(cnts, key=cv2.contourArea)
# Draw contours with maximum size on new mask
mask2 = np.zeros_like(mask)
cv2.drawContours(mask2, [c], -1, 255, -1)
#cv2.imwrite('mask2.png', mask2)
img[(mask2==0)] = 0
# Save result
cv2.imwrite('img.jpg', img)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.