如愿

  • 一、准备工作
  • 二、硬币和细胞数量识别
  • 三、条形码定位和识别
  • 四、总结
  • 五、参考资料

一、准备工作

  • 所用图片


  • python版本以及opencv版本

python 3.8.12 opencv 3.4.11

二、硬币和细胞数量识别

  • 原理
  1. 用opencv读取图片,读取之后并进行灰度化和二值化
  2. 二值化之后存储图片的二维列表里的值全为0和1,进行膨胀和腐蚀等操作使图像的轮廓更明显
  3. 较为明显之后使用findContours,发现的轮廓数就是我们要求的数量
  • 开始代码操作,导入库并定义文件路径
#导入相关包
import cv2
import numpy as np
import os
#定义文件路径
source_path='..\\source\\AI_digital_image\\'
cell_file="cell.png"
coin_file="coin.png"
  • 构建完整路径并读取图片,图片我就不放了,自己运行看看就知道了,算了图片还是放代码后面,自己看看
#得到完整路径
cell_path=source_path+cell_file
coin_path=source_path+coin_file
#读取文件
cell_read=cv2.imread(cell_path)
coin_read=cv2.imread(coin_path)
cv2.imshow("cell",cell_read)
cv2.waitKey(0)

  • 先进行细胞数量提取,这里进行了灰度化,而且手动调了一波亮度,因为这张图片上下的亮度不一致,不调整的话二值化得出来的效果不太好
#进行灰度化
cell_gauss=cv2.GaussianBlur(cell_read,(5,5),0)#高斯降噪
cell_gray=cv2.cvtColor(cell_gauss,cv2.COLOR_BGR2GRAY)#灰度化
cell_att=cell_gray
cv2.waitKey(0)
#上半部分亮度太低,手动增加
for j in range(3,342):low=int(sum(cell_gray[j]))high=int(sum(cell_gray[335]))add=(high-low)/len(cell_read[3])for i in range(len(cell_read[3])):if int(cell_att[j][i])+add>255:cell_att[j][i]=255else :cell_att[j][i]+=add
cv2.imshow("cell",cell_att)
cv2.waitKey(0)

  • 二值化
thre,cell_bw=cv2.threshold(cell_att,170,255,cv2.THRESH_BINARY_INV)#二值化
cv2.imshow("cell",cell_bw)
cv2.waitKey(0)

  • 细胞的图片感觉应该是血液的样本,不然为啥这么多血红细胞,血红细胞中间是空的,灰度化之后会有小空洞,先用闭运算来填补这些空的地方
#闭运算,填充空洞
#构造一个全1的5*5的矩阵
kernel=np.ones((3,3),int)#设置形态学操作卷积的大小
cell_close=cv2.morphologyEx(cell_bw,cv2.MORPH_CLOSE,kernel)
cv2.imshow("cell",cell_close)
cv2.waitKey(0)

  • 开运算作用:用来消除小的物体,平滑形状边界,并且不改变其面积。可以去除小颗粒噪声,断开物体间的粘连
#开运算
#构造一个全1的5*5的矩阵
kernel=np.ones((11,11),int)#设置形态学操作卷积的大小
cell_open=cv2.morphologyEx(cell_close,cv2.MORPH_OPEN,kernel)
cv2.imshow("cell",cell_open)
cv2.waitKey(0)

  • 开运算之后再进行腐蚀,将两个细胞之间的间隔再拉大一点,同时把那些重叠的地方再细化
#腐蚀运算
#构造一个全1的5*5的矩阵
kernel=np.ones((20,20),int)#设置形态学操作卷积的大小
cell_corr=cv2.erode(cell_open,kernel,iterations=1)
cv2.imshow("cell",cell_corr)
cv2.waitKey(0)

  • 再进行开运算,把细化的重叠部分也断掉
#开运算
#构造一个全1的5*5的矩阵
kernel=np.ones((10,10),int)#设置形态学操作卷积的大小
cell_close2=cv2.morphologyEx(cell_corr,cv2.MORPH_OPEN,kernel)
cv2.imshow("cell",cell_close2)
cv2.waitKey(0)

  • 利用opencv的findcontours获取轮廓,返回的cell_count就是轮廓的数组,长度就是细胞的数量,只要求求数量,绘图时的轮廓就偷懒了,表示个意思就行
image,cell_count,hir=cv2.findContours(cell_close2,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#检测所有轮廓,所有轮廓建立一个等级树结构。
print(len(cell_count))
cell_read=cv2.imread(cell_path)
result = cv2.drawContours(cell_read, cell_count, -1 ,(0, 255, 0), 1)
cv2.imshow('I',result)
cv2.waitKey(0)

  • 接下来就是硬币数量检测了,这个简单多了,刚刚读取了,这里进行灰度化和二值化
#进行灰度化和二值化
coin_gauss=cv2.GaussianBlur(coin_read,(5,5),0)#高斯降噪
coin_gray=cv2.cvtColor(coin_gauss,cv2.COLOR_BGR2GRAY)#灰度化
thre,coin_bw=cv2.threshold(coin_gray,150,255,cv2.THRESH_BINARY_INV)#二值化
cv2.imshow("coin",coin_bw)
cv2.waitKey(0)

  • 开始以为还要一次开运算,这里直接腐蚀效果就很好了
#腐蚀运算
#构造一个全1的5*5的矩阵
kernel=np.ones((20,20),int)#设置形态学操作卷积的大小
coin_corr=cv2.erode(coin_bw,kernel,iterations=1)
cv2.imshow("cell",coin_corr)
cv2.waitKey(0)

  • 获取数量
image,coin_count,hir=cv2.findContours(coin_corr,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#检测所有轮廓,所有轮廓建立一个等级树结构。
print(len(coin_count))
coin_read=cv2.imread(coin_path)
result = cv2.drawContours(coin_read, coin_count, -1 ,(0, 255, 0), 1)
cv2.imshow('I',result)
cv2.waitKey(0)

三、条形码定位和识别

  • 定位就不调用库了,用opencv实现
#导入库
import cv2
  • 读取文件
bar_code_path='..\\source\\picture\\bar_code\\code_bar.jpg'
bar_code=cv2.imread(bar_code_path)
bar_code=cv2.resize(bar_code,(500,300))
cv2.imshow('src',bar_code)
cv2.waitKey(0)

  • 转化为灰度图
#转化为灰度图
bar_code_gray=cv2.cvtColor(bar_code,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',bar_code_gray)
cv2.waitKey(0)

  • 高斯平滑滤波
# 高斯平滑滤波
bar_code_gauss=cv2.GaussianBlur(bar_code_gray,(3,3),0)
cv2.imshow('gauss',bar_code_gauss)
cv2.waitKey(0)

  • 求水平和垂直的梯度差,使用sobel算子,这里好像直接相减有些问题,可能是opencv在python里的存储类型和在c++里不一样,小于0的话就变成200+了

#求水平方向和垂直方向的梯度差,使用sobel算子
bar_code_h=cv2.Sobel(bar_code_gauss,cv2.CV_64F,1,0,ksize=3,scale=1,delta=0,borderType=4)
bar_code_v=cv2.Sobel(bar_code_gauss,cv2.CV_64F,0,1,ksize=3,scale=1,delta=0,borderType=4)
#从16位转化为8位
bar_code_x=cv2.convertScaleAbs(bar_code_h,alpha=1,beta=0)
bar_code_y=cv2.convertScaleAbs(bar_code_v,alpha=1,beta=0)
bar_code_xy=bar_code_x
for i in range(len(bar_code_x)):for j in range(len(bar_code_x[0])):if int(bar_code_x[i][j])-(bar_code_y[i][j])>=0:bar_code_xy[i][j]=bar_code_x[i][j]-bar_code_y[i][j]else:bar_code_xy[i][j]=0
cv2.imshow('x',bar_code_x)
cv2.waitKey(0)
cv2.imshow('y',bar_code_y)
cv2.waitKey(0)
cv2.imshow('xy',bar_code_xy)
cv2.waitKey(0)



  • 均值滤波
#均值滤波
bar_code_blur=cv2.blur(bar_code_xy,(3,3))
cv2.imshow('blur',bar_code_blur)
cv2.waitKey(0)

  • 二值化
#二值化
thr,bar_code_th=cv2.threshold(bar_code_blur,170,255,cv2.THRESH_BINARY)
cv2.imshow('threshold',bar_code_th)
cv2.waitKey(0)

  • 闭运算,填充条形码间隙
#闭运算,填充条形码间隙
import numpy as np
kernel=np.ones((7,7),int)#设置形态学操作卷积的大小
bar_code_close=cv2.morphologyEx(bar_code_th,cv2.MORPH_CLOSE,kernel)
cv2.imshow('close',bar_code_close)
cv2.waitKey(0)

  • 腐蚀,消除旁边的小白点
#腐蚀
kernel=np.ones((7,7),int)#设置形态学操作卷积的大小
bar_code_ero=cv2.erode(bar_code_close,kernel)
cv2.imshow('erode',bar_code_ero)
cv2.waitKey(0)

  • 膨胀使条码连起来
#膨胀
bar_code_dia=cv2.dilate(bar_code_ero,kernel)
bar_code_dia=cv2.dilate(bar_code_dia,kernel)
bar_code_dia=cv2.dilate(bar_code_dia,kernel)
bar_code_dia=cv2.dilate(bar_code_dia,kernel)
cv2.imshow('dilate',bar_code_dia)
cv2.waitKey(0)

  • 定位,这偏差有点迷,可能使计算梯度差时造成的
image,barcode,hir=cv2.findContours(bar_code_dia,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#检测所有轮廓,所有轮廓建立一个等级树结构。
barcode_read=cv2.imread(bar_code_path)
result = cv2.drawContours(barcode_read, barcode, -1 ,(0, 255, 0), 1)
cv2.imshow('I',result)
cv2.waitKey(0)

  • 识别条形码的话可以自己手动排查,也可以调用库,这里就偷懒一下,调用pyzbar库实现
#调用条码库进行条码识别
import pyzbar.pyzbar as pyzbar
import cv2
bar_code_path='..\\source\\picture\\bar_code\\code_bar.jpg'
srcImg = cv2.imread(bar_code_path)
cv2.imshow("Image", srcImg)
barcodes = pyzbar.decode(srcImg)
for barcode in barcodes:barcodeData = barcode.data.decode("utf-8")print(barcodeData)
cv2.waitKey(0)

四、总结

  • 经过上面这些例子,大概明白了对图像的操作都是提取出需要的元素,然后简化简化再简化,最后变为0和1,而0和1对应的就是黑和白,就十分方便处理

五、参考资料

Opencv:10个步骤检测出图片中条形码
python-opencv检测图片中鸡蛋个数/数量

识别硬币和细胞数量+条形码检测(python+opencv)相关推荐

  1. 招商银行信用卡卡号识别项目(第一篇),Python OpenCV 图像处理取经之旅第 53 篇

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 53 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

  2. 毕业设计 深度学习 机器视觉 车位识别车道线检测 - python opencv

    0 前言

  3. 视频字幕识别(百度AI开放平台OCR | python | opencv)

    目标:提取位于视频下方的字幕 机缘:某些要写报告的学习视频太长了orz,弄字幕来参考一下 难点: 调参(不同视频字幕对应参数会不同,但调整不大) 图片相似度比较(哈希算法,有更好的算法但我没用心找) ...

  4. OpenCV+Python简单实践之硬币检测以及条形码检测

    目录标题 一.简单图片格式 1.位图 2.文件压缩比 二.用奇异值分解(SVD)对一张图片进行特征值提取(降维)处理 1.代码 2.效果 三.采用图像的开闭运算(腐蚀-膨胀),检测出2个样本图像中硬币 ...

  5. python opencv 条形码及二维码检测识别

    目录 条形码检测识别 二维码检测识别 基于python opencv pyzbar 实现. 条形码检测识别 原图: 最后截取图: 直接上代码: import cv2 import numpy as n ...

  6. Python实现条码识别:从图像中自动检测和识别条形码

    Python实现条码识别:从图像中自动检测和识别条形码 在现代零售业中,条形码是一项必不可少的技术.它们提供了一种快速.准确和可靠的方法来追踪和管理库存.随着计算机视觉技术的发展,我们可以利用Pyth ...

  7. Python OpenCV高速公路道路汽车车辆摄像头视频侦测检测识别统计数量

    Python OpenCV高速公路道路汽车车辆侦测检测识别统计数量 如需安装运行环境或远程调试,可加QQ905733049由专业技术人员远程协助! 运行结果如下: 运行主要代码如下: import c ...

  8. 使用python+opencv写一个简单的条形码识别代码

    这是一段使用 Python OpenCV 库识别条形码的示例代码: import cv2# 读入图片 img = cv2.imread("barcode.jpg")# 创建条形码检 ...

  9. python颜色识别_颜色检测python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 版权声明:本文为博主原创文章,未经博主允许不得转载. https:blog.cs ...

最新文章

  1. 【转】ASP.NET之 关于触发Global.asax Session_End事件的经验
  2. CodeForces - 1486D Max Median(二分+最长连续子段和)
  3. C语言简易行编辑器,简单的行编辑器C语言.doc
  4. 08-KNN手写数字识别
  5. oracle 汇总上面所有,Oracle经验技巧汇总
  6. JAVA几何图注水,如何使用java绘制几何形状到图片?
  7. 高盛发布区块链报告:从理论到实践(中文版)二
  8. 小学四则运算练习软件需求说明
  9. VSCode的常用快捷键
  10. 【图像检测-显著性检测】基于蚁群算法优化图像视觉显着性检测附matlab代码
  11. CSR867x一拖多加密工具8670 8675
  12. 我曾被stormzhang拉黑过
  13. 电脑族的视力保护常识
  14. IDEA 中 使用 git 进行上传和下载项目
  15. 构造方法以及构造方法的重载
  16. 今天我们来聊聊防盗链机制
  17. 各种进制之间的转换方法
  18. 用 Flutter 实现 PageView 指示器
  19. Windows 怎样删除windows.old
  20. shell “==“ vs.“-eq“

热门文章

  1. Stable Diffusion教学 使用Lora制作AI网红 【AI绘画真人教程】
  2. 系统视频教学视频教程_自由泳教学视频,全套系统教程【收藏版】
  3. RocketMQ源码级别面试题板块
  4. html、JavaScript、JSON中单双引号使用及嵌套
  5. 浏览计算机已查找驱动程序软件,魅族Pro6plus线刷救砖ROM包_内附教程可救砖
  6. Android UsageStatsService 系统数据统计和数据上报
  7. HyperWorks13安装教程
  8. 国家电网、南方电网优惠充值接口分享
  9. RHCSA笔记(1)
  10. 2021年读书清单及进度