0

我尝试了几种图像分割方法,但它们不起作用。我不想用 Deep-learning 的方法来解决这个问题,OpenCV-Python是我目前正在学习的。

由于考虑到背景的颜色,大的白色托盘与前景过于相似,尤其是白色的小盘子,所以我点了这个链接,目的是得到一个满意的分割结果。 OpenCV 锐化边缘(没有孔的边缘) 虽然结果仍然令人失望......

import cv2
import numpy as np

img = cv2.imread('2.jpg')
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
img_h, img_s, img_v = cv2.split(img_hsv)
img_s = cv2.GaussianBlur(img_s, (9, 9), 2, 2)
img_s = cv2.convertScaleAbs(img_s, 0.5, 0.5)
img_s = np.array(img_s, np.float32)
img_new_1 = cv2.Sobel(img_s, -1, 1, 0)
img_new_2 = cv2.Sobel(img_s, -1, 0, 1)
img_new_1 = cv2.multiply(img_new_1, img_new_1)
img_new_2 = cv2.multiply(img_new_2, img_new_2)
img_grad_abs_val_approx = cv2.pow((img_new_1 + img_new_2), 0.5)
filtered = cv2.GaussianBlur(img_grad_abs_val_approx, (9, 9), 2, 2)
mean, std = cv2.meanStdDev(filtered)
_, filtered_1 = cv2.threshold(filtered, mean[0] + std[0], 1.0, cv2.THRESH_TOZERO)
_, filtered_2 = cv2.threshold(filtered, mean[0] + std[0], 1.0, cv2.THRESH_BINARY)
filtered_2 = np.array(filtered_2, np.uint8)

contour = cv2.findContours(filtered_2, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
contour_img = np.zeros((filtered_2.shape[0], filtered_2.shape[1]), np.uint8)

cv2.drawContours(contour_img, contour[1], -1, 255)

cv2.imshow('image', filtered_1 / 50)
cv2.imshow('image_contour', contour_img)
cv2.waitKey(0)

2.jpg

我完全不知道如何使用传统方法(opencv)来解决这个问题,白色的盘子和里面的糖果太烦人了。

4

0 回答 0