opencv矿石图片检测矿石数量

原始矿石图片
矿石图像,3200*896尺寸
此类图片是高躁图,二值化后图像如下
在这里插入图片描述
采用膨胀的方法去除黑色噪点
在这里插入图片描述
二值图黑白转化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(看你目标是用黑还是白表示,此处用黑色表示),效果不太好,只能选膨胀来搞了。

最后的结果如下:(话说结果图没什么不能拖动缩放呢- -。)
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用 OpenCV 中的图像处理和计算机视觉功能来统计图片中物体的数量。下面是一个基本的步骤概述: 1. 加载图像:使用 OpenCV 中的 `imread` 函数加载图片。 2. 图像预处理:根据具体需求,对图像进行预处理操作,例如调整大小、灰度化、平滑等。这些操作有助于提高后续物体检测的效果。 3. 目标检测:使用适当的目标检测算法(如基于特征匹配、边缘检测或深度学习的算法)来检测图像中的物体。OpenCV 提供了多种目标检测的方法和函数,例如 Haar 级联分类器、Hough 转换等。 4. 物体计数:根据检测到的物体数量,进行计数操作。您可以使用简单的计数变量或更复杂的算法来实现。 5. 结果显示:根据需要,您可以在图像上标记检测到的物体,并将结果显示出来。 以下是一个示例代码片段,演示了如何使用 OpenCV 统计图像中物体的数量(以 Haar 级联分类器为例): ```python import cv2 # 加载级联分类器 cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载图像 image = cv2.imread('image.jpg') # 灰度化处理 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 目标检测 objects = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # 物体计数 object_count = len(objects) # 在图像上标记物体 for (x, y, w, h) in objects: cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示结果图像 cv2.imshow('Object Detection', image) cv2.waitKey(0) cv2.destroyAllWindows() # 打印物体数量 print('Detected objects:', object_count) ``` 请注意,以上代码仅为示例,请根据您的具体需求和图像特点进行适当调整和优化。另外,您可能需要在 OpenCV 官方网站上下载合适的级联分类器文件,并根据您要检测的物体类型选择正确的分类器文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值