opencv实现矿石图片检测矿石数量

 更新时间:2022年08月01日 15:34:54   作者:Silencer_s  
这篇文章主要为大家详细介绍了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(看你目标是用黑还是白表示,此处用黑色表示),效果不太好,只能选膨胀来搞了。

最后的结果如下:(话说结果图没什么不能拖动缩放呢- -。)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python完成毫秒级抢淘宝大单功能

    Python完成毫秒级抢淘宝大单功能

    在本篇文章里小编给大家分享了关于Python完成毫秒级抢淘宝大单功能以及实例代码,需要的朋友们参考下。
    2019-06-06
  • 详细解读Python中的__init__()方法

    详细解读Python中的__init__()方法

    这篇文章主要介绍了Python中的__init__()方法,__init__()方法是Python学习当中重要的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python 模拟员工信息数据库操作的实例

    Python 模拟员工信息数据库操作的实例

    下面小编就为大家带来一篇Python 模拟员工信息数据库操作的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 解决Python httpx 运行过程中无限阻塞的问题

    解决Python httpx 运行过程中无限阻塞的问题

    这篇文章主要介绍了解决Python httpx 运行过程中无限阻塞的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python操作注册表的方法实现

    python操作注册表的方法实现

    Python提供了winreg模块,可以用于操作Windows注册表,本文就来介绍一下python操作注册表的方法实现,主要包括打开注册表、读取注册表值、写入注册表值和关闭注册表,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Python中的变量、运算符与流程控制

    Python中的变量、运算符与流程控制

    本文详细讲解了Python中的变量、运算符与流程控制,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • python中使用xlrd读excel使用xlwt写excel的实例代码

    python中使用xlrd读excel使用xlwt写excel的实例代码

    这篇文章主要介绍了python中使用xlrd读excel使用xlwt写excel的实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python中装饰器和魔法方法的区别解析

    Python中装饰器和魔法方法的区别解析

    在Python中,装饰器(Decorators)和魔法方法(Magic Methods)是两种不同的高级特性,分别服务于不同的目的,这篇文章主要介绍了Python中装饰器和魔法方法的区别,需要的朋友可以参考下
    2024-03-03
  • Python构建XML树结构的方法示例

    Python构建XML树结构的方法示例

    这篇文章主要介绍了Python构建XML树结构的方法,结合实例形式分析了Python创建与打印xml数结构的实现步骤与相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • 详解如何比较Python中的两个迭代器

    详解如何比较Python中的两个迭代器

    Python迭代器是高效遍历元素序列的强大工具,有时可能需要比较两个迭代器以确定它们的相等性或找到它们的差异,本文将比较Python中两个迭代器的不同方法,
    2024-11-11

最新评论