世界关注: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(看你目标是用黑还是白表示,此处用黑色表示),效果不太好,只能选膨胀来搞了。
最后的结果如下:(话说结果图没什么不能拖动缩放呢- -。)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
X 关闭
X 关闭
- 1转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 2充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 3好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 4名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 5亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 6京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 7网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久
- 8市场竞争加剧,有车企因经营不善出现破产、退网、退市
- 9北京市市场监管局为企业纾困减负保护经济韧性
- 10市场监管总局发布限制商品过度包装标准和第1号修改单