上篇文章分享了一个学习的网站,分享一个计算机视觉-深度学习的网站-强烈推荐,有位同学学习了里面的物体计数的内容。
学完后,换成其它图片测试,发现不行。
比如下面这种。
之所以出现这种问题,是因为目标物和背景不能很好的区分开。
一般图像预处理,都会有以下一些过程:
转换成灰度图。
检测物体边缘
阈值处理
纯色背景一般到这里就可以了,目标物和背景以及能够很好的区分出来了。
最后通过查找物体的轮廓数量,计算出对应的物体数量。
不过上面另外一张图片,背景并不是均匀的,要想很好的区分开就比较难,就算通过HSV区分后,依然还存在一些小的噪声数据。
这时需要经过一轮膨胀和腐蚀操作,就可以去除了。
完整代码:
import cv2
import numpy as np
img = cv2.imread('card1.jpg')
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower = np.array([12,0,162])
upper = np.array([179,255,255])
# 获得指定颜色范围内的掩码
mask = cv2.inRange(imgHSV,lower,upper)
# 对原图图像进行按位与的操作,掩码区域保留
imgResult = cv2.bitwise_and(img,img,mask=mask)
# 膨胀和腐蚀
mask = cv2.dilate(mask, None, iterations=1)
mask = cv2.erode(mask, None, iterations=1)
# 检测边缘
edges = cv2.Canny(mask, 30, 70)
# 查找轮廓
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
output = img.copy()
# 画出轮廓线
for c in cnts:
cv2.drawContours(output, [c], -1, (240, 0, 159), 3)
cv2.imshow("Contours", output)
cv2.imshow('edges', edges)
cv2.imshow("Mask", mask)
cv2.waitKey(0)
两年前我写过如何利用python识别验证码和车牌号?(当时测试付费功能,后面的内容我下次重新更新一下),当时用的OCR软件识别的,不过图片复杂一点就不行,需要预处理好才可以。限于当时技术水平,没能用好的方法实现,各种图片处理觉得好麻烦。
今天重新看,我觉得我应该可以很好的实现了。就通过以上的方法得到字母和数字,识别需要训练一个模型或者找到大量的数字和字母图片,并打上标签,一一匹配,查找匹配度最高的即可。
当然了,现在有很多现成的机器学习库,掌握流程后,套个模板还是比较简单的,下面是如何识别数字的。
# 导入图片库
import matplotlib.pyplot as plt
import cv2
# 导入数据集,分类器,数据分割方法
from sklearn import datasets, svm
from sklearn.model_selection import train_test_split
import numpy as np
# 加载数据集
digits = datasets.load_digits()
# 将8*8的数据,变成64*1
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))
# 创建分类器
clf = svm.SVC(gamma=0.001)
# 分割数据集,训练数据和测试数据各50%
X_train, X_test, y_train, y_test = train_test_split(
data, digits.target, test_size=0.5, shuffle=False
)
# print(X_test)
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
print(X_test[:1])
predicted = clf.predict(X_test[:1])
print(predicted[:4])
# 预测一张新图片
img = cv2.imread('1.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img[img>0]=255
img = cv2.resize(img,(8,8))
data = img.reshape(64,)
r= clf.predict(data)
print(r)
今日问题: 找出图片的边缘(不能借助现成的算法。)