我想在堆叠的皮革图像上计数皮革,任何图像处理的帮助都将受到欢迎。
在下面的一些python
代码之后,我意识到我的代码不是一个稳健的方法,它完全取决于函数参数值和输入图像。我需要一个稳健的方法来处理这个问题。感谢您的努力。
import cv2path= 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)
回答:
这是一个简单的想法,肯定不适合所有测试案例。请注意,您花费的时间越多,审查的图像越多,阅读的图像处理工具越多;您将获得更好的结果,并找到更好的解决方案。所以这不是您能在几分钟内得到最佳答案的事情。下一个问题是环境条件。您改变环境的次数越少,错误就越少。
import cv2import sysimport mathimport numpy as np# 加载图像org = cv2.imread(sys.path[0]+'/1.jpg')im = org.copy()H, W = im.shape[:2]# 制作一个干净的二值图像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)# 切片图像顶部org = org[0:20, 0:W]im = im[0:20, 0:W]H, W = im.shape[:2]# 清理像条形码一样的线条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)# 查找轮廓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)# 计数线条lines = len(cnts)-1num = math.ceil(lines/3)print(num)# 保存并显示输出im=cv2.cvtColor(im,cv2.COLOR_GRAY2BGR)cv2.imwrite(sys.path[0]+'/1_.jpg',np.vstack((org,im)))
请注意,您的两个测试案例的边缘不同,看起来属于两种不同类型。因此,无法用一个简单的算法处理所有不同的样本是正常的。检查这些想法,改变参数,添加新想法,直到最终得到所需的结果。
输出图像:
此测试案例的输出数字是8。
最后,我认为如果您能将这些部分整洁地拼接在一起(缩小它们之间的间隙),并且始终从固定角度用固定相机和相同的光量拍摄,您可能会获得更好的结果。