图像处理 - 如何计算图像上的对象(堆叠皮革)

Image Processing - How to count objects on an image (stacked leathers)

我想在堆叠的皮革图像上计算皮革数量,感谢任何图像处理帮助。

在下面一些 python 代码之后,我意识到我的代码不是一个健壮的方法,它完全可以根据函数参数值和输入图像而改变。我需要一个强大的方法来处理这个问题。谢谢你的努力。

import cv2
path= r'image.bmp'
im = cv2.imread(path)
im = cv2.resize(im, (640,480), interpolation = cv2.INTER_AREA)
cv2.imwrite('savedImage2.jpg', im) 
im = cv2.GaussianBlur(im, (7,7), sigmaX=31) 
im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 
im = cv2.inRange(im, 50, 90)
cv2.imshow('image', im)
cv2.waitKey(0) 
cv2.destroyAllWindows()

(图像中皮革数=8,真值=8

(图像中皮革数=8,真值=8)

这是一个简单的想法,当然并不适合所有人test_cases。请注意,您花费的时间越多,查看的图像就越多,对图像处理工具的阅读也就越多;您将获得更好的结果并找到更好的解决方案。所以这不是你可以在几分钟内得到最佳答案的事情。下一个问题是环境条件。环境改得越少,错误就越少。

import cv2
import sys
import math
import numpy as np

# Load image
org = cv2.imread(sys.path[0]+'/1.jpg')
im = org.copy()
H, W = im.shape[:2]

# Make a clean binary image
im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
im = cv2.medianBlur(im, 5)

# Slice top of the image
org = org[0:20, 0:W]
im = im[0:20, 0:W]
H, W = im.shape[:2]

# Clean lines like a barcode
im = cv2.GaussianBlur(im, (1,31), 31)
im=cv2.threshold(im,127,255,cv2.THRESH_BINARY)[1]
cv2.rectangle(im, (0, 0), (W, H), 255, 3)

# Find contours
cnts, _ = cv2.findContours(im, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in cnts:
    x, y, w, h = cv2.boundingRect(cnt)
    if w < W:
        cv2.rectangle(im, (x, y), (x+w, y+h), (0, 255, 0), 1)

# Count lines
lines = len(cnts)-1
num = math.ceil(lines/3)
print(num)

# Save and show output
im=cv2.cvtColor(im,cv2.COLOR_GRAY2BGR)
cv2.imwrite(sys.path[0]+'/1_.jpg',np.vstack((org,im)))

请注意,您的两个 test_cases 的边缘不同,看起来属于两种不同的类型。所以你不能用一个简单的算法处理所有不同的样本是很正常的。检查想法,更改参数,添加新想法,直到最终获得所需的结果。

输出图像:

此测试用例的输出编号为 8


最后,我想如果你能把这些碎片干净利索地拼在一起(缩小它们之间的缝隙)并且总是从固定的角度用固定的相机和相同的光量拍摄,你可能会取得更好的效果结果。