2024-04-19 12:47:18 发布
网友
Food Plate
其想法是提取椭圆形状的板。 我尝试了OpenCV中的HoughCircles方法,但它只适用于完美圆。 我还尝试了skimage中的hough_ellipse方法,但它花费的时间太长,或者我以错误的方式实现了它。 是否可以使用OpenCV模块检测椭圆形状
HoughCircles
skimage
hough_ellipse
还有什么其他解决办法
食物盘:
提取板的主键是使用cv2.adaptiveThreshold,但还有几个阶段:
通过形状找到椭圆,鲁棒性要差得多
代码如下:
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)
结果:
提取板的主键是使用cv2.adaptiveThreshold,但还有几个阶段:
查找最大的群集,并仅使用最大的群集创建新映像李>
在原始图像上应用遮罩李>
通过形状找到椭圆,鲁棒性要差得多
代码如下:
结果:
相关问题 更多 >
编程相关推荐