opencv实现矿石图片检测矿石数量
作者:Silencer_s 发布时间:2021-08-26 02:17:39
标签:opencv,检测
本文实例为大家分享了opencv矿石图片检测矿石数量的具体代码,供大家参考,具体内容如下
原始矿石图片
此类图片是高躁图,二值化后图像如下
采用膨胀的方法去除黑色噪点
二值图黑白转化dilateImg = 255 - dilateImg #黑白转换
全部代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pywt
"""原始图像导入"""
img = cv2.imread("000166.jpg")
#img = cv2.resize(img, (1600, 896))
#cv2.imshow("original", img)
"""转化为灰度图像"""
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cv2.imshow("gray", gray)
"""转化为二值图像
#dst0 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,251, 1)
cv2.imshow("black&white", dst0)"""
"""图像去躁
denose = cv2.fastNlMeansDenoising(gray,None,100,7,21)
cv2.imshow("denosing", denose)"""
"""小波图像去躁
coeffs = pywt.dwt2(gray, 'haar')
cA1,(cH1, cV1, cD1) = coeffs
cD1 = np.zeros(cD1.shape) + 255
coeffs = cA1,(cH1, cV1, cD1)
denose = pywt.idwt2(coeffs, 'haar')
cv2.imshow("denose", denose)"""
"""转化为二值图像"""
dst1 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,251, 1)
cv2.imshow("black&white", dst1)
"""膨胀用于排除小型黑洞"""
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(6,6)) #(此矩阵有关于黑点、噪点的去除)
dilateImg = cv2.dilate(dst1, kernel)
#erodImg = cv2.erode(dilateImg, kernel)
cv2.imshow("erodImg&wdilateImg",dilateImg)
"""计算数目"""
dilateImg = 255 - dilateImg #黑白转换
imgs,contours,hierarchy = cv2.findContours(dilateImg,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #轮廓检测函数
cv2.drawContours(dilateImg,contours,-1,(120,0,0),2) #绘制轮廓
cv2.imshow("calcuate",dilateImg)
count=0 #矿石总数
ares_avrg=0 #矿石平均
#遍历找到的所有矿石
for cont in contours:
ares = cv2.contourArea(cont)#计算包围形状的面积
if ares<50: #过滤面积小于50的形状
continue
count+=1 #总体计数加1
ares_avrg+=ares
print("{}-blob:{}".format(count,ares),end=" ") #打印出每个矿石的面积
rect = cv2.boundingRect(cont) #提取矩形坐标
print("x:{} y:{}".format(rect[0],rect[1]))#打印坐标
#cv2.rectangle返回值是x,y,w,h
cv2.rectangle(img,(rect[0],rect[1]),(rect[0]+rect[2],rect[1]+rect[3]),(0,0,0xff),1)#绘制矩形
y=10 if rect[1]<10 else rect[1] #防止编号到图片之外
cv2.putText(img,str(count), (rect[0], y), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 3) #在矿石左上角写上编号
print("矿石平均面积:{}".format(round(ares_avrg/ares,2))) #打印出每个矿石的面积
print(count)
cv2.imshow("original", img)
cv2.waitKey()
#cv2.destroyAllWindows() # important part!
本来想用小波去躁,把HH全置255(看你目标是用黑还是白表示,此处用黑色表示),效果不太好,只能选膨胀来搞了。
最后的结果如下:(话说结果图没什么不能拖动缩放呢- -。)
来源:https://blog.csdn.net/Silencer_s/article/details/106733352


猜你喜欢
- 组件<template><div> <input id="upload_file&quo
- ord是unicode ordinal的缩写,即编号chr是character的缩写,即字符ord和chr是互相对应转换的.但是由于chr局
- mysql一次插入多条数据:INSERT INTO hk_test(username, passwd) VALUES('qmf2
- 在使用Django自带的admin后台的时候,他提供了一些默认的指令可以对数据进行操作, 比如批量删除,修改等 同样的我们也可以添加自己的指
- Python中的字典一、字典的特点二、创建字典创建字典用大括号表示dict1={'a':3,'b':4,
- 1、使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; +----------+ | D
- 本文实例讲述了Python画柱状统计图操作。分享给大家供大家参考,具体如下:一、工具:python的matplotlib.pyplot 库二
- 先上一段代码,如下所示:select distinct b.OrgID,b.CompanyID,b.AreaID,b.CustC
- element-ui el-table组件自定义合计(summary-method)坑项目需要用到表格,带有合计功能的,照搬的element
- 核心代码function convert2utf8($string) { return iconv(&
- 扩展Code:var blogModule = (function (my) { my.AddPhoto = function (
- 本文实例讲述了Python实现的数据结构与算法之快速排序。分享给大家供大家参考。具体分析如下:一、概述快速排序(quick sort)是一种
- 一、Pyeharts简介pyecharts 是一个用于生成 Echarts 图表的类库。用 Echarts 生成的图可视化效果很不错,pye
- numpy对数组求平均时忽略nan值在对numpy数组求平均np.mean()或者求数组中最大最小值np.max()/np.min()时,如
- Node.js中的事件触发器所引发的思考今天在看 Node.js 文档的时候讲到事件触发器,其中的 emit 方法让我想到了 Vue 中的自
- sql语句中默认是不区分大小写的,所以语句: Sql代码 SELECT * FROM RecEngineBizInfo WHERE RecE
- python实现从登录到自动发送qq邮件,供大家参考,具体内容如下qq邮箱登录注意问题账户密码登录框是写在一个iframe上的,所以我们要先
- 本文主要是总结利用tensorflow实现迁移学习的基本步骤。所谓迁移学习,就是将上一个问题上训练好的模型通过简单的调整使其适用于一个新的问
- Vue服务器部署刷新页面404问题描述在上线vue开发的前端网页部署在服务器上后,刷新页面显示404原因因为网页上显示的是静态绝对路径而实际
- 今天是边复习边创作博客的第三天,我今年大二,我们专业开的有这门课程,因为喜欢所以更加认真学习,本以为没人看呢,看了后台浏览量让我更加认真创作