我想使用 python 检测此图像中存在多少张卡片。我尝试使用白色像素但没有得到正确的结果。
我的代码如下:
import cv2
import numpy as np
img = cv2.imread('imaagi.jpg', cv2.IMREAD_GRAYSCALE)
n_white_pix = np.sum(img == 255)
print('Number of white pixels:', n_white_pix)
我是初学者。所以找不到路。
我想使用 python 检测此图像中存在多少张卡片。我尝试使用白色像素但没有得到正确的结果。
我的代码如下:
import cv2
import numpy as np
img = cv2.imread('imaagi.jpg', cv2.IMREAD_GRAYSCALE)
n_white_pix = np.sum(img == 255)
print('Number of white pixels:', n_white_pix)
我是初学者。所以找不到路。
此解决方案与您提供的图像有关,并且在 OpenCV 中实现。
代码:
im = cv2.imread('C:/Users/Jackson/Desktop/cards.jpg', 1)
#--- convert the image to HSV color space ---
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
cv2.imshow('H', hsv[:,:,0])
cv2.imshow('S', hsv[:,:,1])
#--- find Otsu threshold on hue and saturation channel ---
ret, thresh_H = cv2.threshold(hsv[:,:,0], 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ret, thresh_S = cv2.threshold(hsv[:,:,1], 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
#--- add the result of the above two ---
cv2.imshow('thresh', thresh_H + thresh_S)
#--- some morphology operation to clear unwanted spots ---
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(thresh_H + thresh_S, kernel, iterations = 1)
cv2.imshow('dilation', dilation)
#--- find contours on the result above ---
(_, contours, hierarchy) = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
#--- since there were few small contours found, retain those above a certain area ---
im2 = im.copy()
count = 0
for c in contours:
if cv2.contourArea(c) > 500:
count+=1
cv2.drawContours(im2, [c], -1, (0, 255, 0), 2)
cv2.imshow('cards_output', im2)
print('There are {} cards'.format(count))
结果:
在终端上我得到:There are 6 cards
根据您的“白色像素方法”的工作原理(如果可能,请分享更多详细信息),您可以尝试简单的图像二值化,这是一种分离图像中不同对象/实体的行之有效的方法。当然,它只适用于灰度图像,但你也可以使用 sklearn 轻松修复。
它可能会立即提供最佳结果,特别是如果图像的照明条件不同,或者您拥有(如上所示)包含多种颜色的卡片。
为了避免这种情况,您还可以尝试查看不同的颜色空间,例如HSV。
如果这仍然不起作用,我建议使用 OpenCV 或 similra 库中的图像分割库。问题是它们通常还会给您的项目带来一些不必要的复杂性,如果它使用简单的方法(例如二值化),则可能没有必要。