簡體   English   中英

將圖像划分為單個對象(硬幣)以進行機器學習

[英]Divide image to single objects (coins) for machine learning

我想自動將多個硬幣的圖像划分為單個硬幣,以便之后可以將單個硬幣放入對硬幣進行分類的模型中(使用 Tensorflow/Keras)。

輸入圖像看起來像這樣

它們應該看起來像這樣(抱歉,我無法直接集成圖像,因為我是 StackOverflow 的新手)。

我想對輸入圖像進行划分,將單個硬幣放入一個分類模型中,以便我知道單個硬幣的單個價值,從而可以識別第一張輸入圖像的價值。

我已經嘗試了一個物體檢測模型,但它沒有檢測到硬幣( https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606 )。 因為我已經知道圖像上的所有對象都是硬幣,所以我認為可能有更簡單的方法來划分圖像?

先感謝您。

我會嘗試類似於本教程的顏色分割作為將硬幣與背景分開的第一步。 這是我使用 OpenCV 在 Python 中的快速嘗試:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("coins.jpg")

lower = np.array([0,40,5])
upper = np.array([255,255,255])
mask = cv2.inRange(hsv, lower, upper)

cv2.imshow(img)
plt.show()
plt.imshow(mask)

這給我們帶來了輸入圖像

在此處輸入圖片說明

到這個面具:

在此處輸入圖片說明

從這里使用 blob 分析和大小過濾器,您應該能夠找到並分離未連接的硬幣。 可以使用活動輪廓來斷開重疊區域,或者由於您的目標是創建訓練數據集,因此可以在拍照前移動硬幣。

在此處輸入圖片說明

import cv2
import imutils
import numpy as np
import matplotlib.pyplot as plt

def display(img,count,cmap="gray"):
    f_image = cv2.imread("coins.jpg")
    f, axs = plt.subplots(1,2,figsize=(12,5))
    axs[0].imshow(f_image,cmap="gray")
    axs[1].imshow(img,cmap="gray")
    axs[1].set_title("Total Money Count = {}".format(count))


image = cv2.imread("coins.jpg")
image_blur = cv2.medianBlur(image,25)
image_blur_gray = cv2.cvtColor(image_blur, cv2.COLOR_BGR2GRAY)
image_res ,image_thresh = cv2.threshold(image_blur_gray,240,255,cv2.THRESH_BINARY_INV)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(image_thresh,cv2.MORPH_OPEN,kernel)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, last_image =  cv2.threshold(dist_transform, 0.3*dist_transform.max(),255,0)
last_image = np.uint8(last_image)

cnts = cv2.findContours(last_image.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)


for (i, c) in enumerate(cnts):
    ((x, y), _) = cv2.minEnclosingCircle(c)
    cv2.putText(image, "#{}".format(i + 1), (int(x) - 45, int(y)+20),
        cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 5)
    cv2.drawContours(image, [c], -1, (0, 255, 0), 2)

display(image,len(cnts))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM