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
0
投稿
猜你喜欢
- 之前有写过一篇浏览器的tab设计,这回说说网站的tab设计。一说到tab很自然地就想到了导航、信息架构。随着网站信息结构的复杂化,选择tab
- 当我们准备建立一个Web站点时,就必须向域名登记机构申请一个Internet域名,因此,我们通常希望了解自己准备使用的域名是否已经被注册,这
- 声明定位元素:position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。平台:win/I
- 所谓天赋(左脑和右脑)也就是你是否有艺术天赋,天赋也许是存在的,这主要在于人类左右脑的分工。左脑主要负责逻辑理解、语言、判断、分类、分析、推
- 本文实例分析了CI框架出现mysql数据库连接资源无法释放的解决方法。分享给大家供大家参考,具体如下:使用ci框架提供的类查询数据:$thi
- ASP 本身不支持动态包含文件,现在的动态包含是通过 FSO 把被包含的文件合并到主文件里再运行。以下也有把形如 <!--#
- 由于不同的项目需要用不同的python版本,于是使用Anaconda来进行版本管理,现记录一下经验:在官网下载并安装好Anaconda以后(
- 迭代器什么是迭代迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代&
- 首先要注册一个账号密码,通过账号密码登录,并且滑块验证,自动输入搜索关键词,进行跳转翻页爬取数据,并保存到Excel文件中。代码运行时,滑块
- 只要你的Web开发知识不是语文老师教的,那么你应该已经知道一个合格的开发者应该永远抱着怀疑的眼光看用户提交的数据。你不仅需要在前端通过表单或
- 如下所示:L = ['adam', 'Lisa', 'bart', 'Paul
- 小白尝试写任意文件读取poc我是一个小白,完全不懂Python,但是Python在渗透中往往是一个重要的角色。有一个CSDN百万大佬写了这样
- 一个不错的二级联动下拉菜单源码,您一定会用得到的。运行代码:<html><head><title>Lis
- 大部分面向对象的编程语言(除了C++)都只支持单继承,而不支持多继承,为什么呢?因为多继承不仅增加编程复杂度,而且容易导致莫名其妙的错误。P
- 本文较为详细的介绍了python中raw_input的用法,使用raw_input 能够很方便的丛控制台读入数据。具体用法示例如下:1.输入
- 上一篇介绍了 HTML5 中 Canvas 的路径,这篇将要介绍一下 Canvas&nbs
- 互联网充斥着枯燥的设计,惠普、IBM、戴尔、微软,以及其他数不尽的网站(相似的布局,相似的配色)。可能有人会说通过这样一种标准化的界面可以使
- 1.前言JavaWeb Struts2的 * 我们都能很熟悉,在请求交给Action处理之前,先在 * 中处理,处理完之后再交给Action
- 我一般是不看别人写的代码的,为啥?累!而且这位同志给的还是经过压缩的!汗。。。考我是不是?还有,这位同志也不给个示例的代码,只说是代码没有问
- 很简单的方法,但很实用。用过新浪邮箱的朋友应该会知道此脚本的效果。如果您提交的数据处理时间很长,用这个做为提示很不错的.将下面的代码复制到&