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

作者:Silencer_s 时间:2021-08-26 02:17:39 

本文实例为大家分享了opencv矿石图片检测矿石数量的具体代码,供大家参考,具体内容如下

原始矿石图片

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

此类图片是高躁图,二值化后图像如下

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(看你目标是用黑还是白表示,此处用黑色表示),效果不太好,只能选膨胀来搞了。

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

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

来源:https://blog.csdn.net/Silencer_s/article/details/106733352

标签:opencv,检测
0
投稿

猜你喜欢

  • Pycharm之如何安装cv2 [python3.6]

    2023-01-15 09:56:45
  • 利用Python检测URL状态

    2022-12-29 23:03:52
  • vue-loader和webpack项目配置及npm错误问题的解决

    2024-04-29 13:10:33
  • Python3 Random模块代码详解

    2023-04-11 01:36:20
  • 在firefox里如何实现firebug的DOM inspect选择功能?

    2010-09-03 18:20:00
  • python pandas query的使用方法

    2023-01-14 06:23:33
  • JavaScript中String.prototype用法实例

    2024-04-22 22:18:12
  • Python 类的继承实例详解

    2021-04-30 15:54:09
  • 无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法

    2023-09-03 19:49:50
  • 形象化的reflow

    2008-06-08 13:33:00
  • 使用pdb模块调试Python程序实例

    2023-08-11 08:36:28
  • Python编程产生非均匀随机数的几种方法代码分享

    2023-02-10 02:00:19
  • 浅谈pytorch中为什么要用 zero_grad() 将梯度清零

    2022-10-02 11:24:18
  • Python实现生成对角矩阵和对角块矩阵

    2021-03-16 11:45:00
  • Python实现简单的语音识别系统

    2022-09-11 04:44:15
  • django 修改server端口号的方法

    2022-05-08 15:49:10
  • 对python 中class与变量的使用方法详解

    2023-12-27 19:22:10
  • Python将string转换到float的实例方法

    2023-06-13 07:23:47
  • python数据可视化之条形图画法

    2021-08-07 13:43:22
  • Python处理mysql特殊字符的问题

    2024-01-17 01:28:38
  • asp之家 网络编程 m.aspxhome.com