wordPress主题模板站,公司主网站百度收录大量网站之类的信息,微信网站开发价格,海珠营销型网站制作一、实验简介
传统的计数方法常依赖于人眼目视计数#xff0c;不仅计数效率低#xff0c;且容易计数错误。通常现实中的对象不会完美地分开#xff0c;需要通过进一步的图像处理将对象分开并计数。本实验巩固对OpenCV的基础操作的使用#xff0c;适当的增加OpenCV在图像处…一、实验简介
传统的计数方法常依赖于人眼目视计数不仅计数效率低且容易计数错误。通常现实中的对象不会完美地分开需要通过进一步的图像处理将对象分开并计数。本实验巩固对OpenCV的基础操作的使用适当的增加OpenCV在图像处理方向的进阶操作例如利用canny算子等算法进行图像分割 二、实验目的
通过本实验能够综合利用OpenCV在图像处理的方向的应用了解并使用
OpenCV的基本操作了解大概运行逻辑和原理。 三、实验步骤与结果
1、实验实现功能说明 通过本实验能够综合利用opencv在图像处理的方向的应用能够识别图片中硬币数量。 2、实验整体设计思路
1、选取图片可以选取硬币摆放简单的图片边缘清晰也无交叉叠加可以选取硬币叠加的图片增加分割难度可以选取一张包含不同物体的图片且物体之间边缘并不十分清晰将指定物品的数量显示出来
2、图片读取与展示
3、转成灰度图并进行二值化
4、去掉背景
5、利用距离变换通过阈值让图像粘连分开或者采用腐蚀膨胀方法来或者图像分割包括canny边缘检测等算法将物体分割。
6、若采用距离变换方法或者腐蚀膨胀方法需统计物体的轮廓若直接采用图像分割方法则省略这一步。
7、获得零件数量。
8、绘制轮廓。可以用不同的颜色为物体做一个区分 3、实验程序
#导入库
import cv2 import enum import ipywidgets.widgets as widgets import numpy as np import matplotlib.pyplot as plt import random from IPython.core.display_functions import display from cv2 import putText #显示文件图像 # 1 文件的读取 2 封装格式解析 3 数据解码 4 数据加载 img cv2.imread(coins.jpg, 1) # cv2.imshow(image, img) #这段需要在树莓派图形化界面命令行执行会显示一个图像的窗口 cv2.imwrite(coins.jpg, img) # 1 name 2 data # 展示图像的函数 def show(img, titleNone): if title: plt.title(title) try: plt.imshow(img[:, :, ::-1]) except Exception as e: plt.imshow(img, cmapgray) finally: plt.show() #高斯滤波减小噪点和硬币上的图案对轮廓识别的影响 blurred cv2.GaussianBlur(img, (15, 15), 0) show(blurred, 231_lwxwpb_After Gaussian filtering) #转化为灰度图 img_gray cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY) show(img_gray, 231_lwxwpb_Gray Image) img_gray cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY) # 统计各个灰度级的个数 gray_histogram cv2.calcHist([img_gray], [0], None, [256], [0, 256]) # 绘制灰度直方图 plt.plot(gray_histogram, colorred) plt.title(231_lwxwpb_Grayscale Histogram) plt.xlabel(Gray Level) plt.ylabel(Count) plt.xlim([0, 256]) plt.show() # 算法自动找出合适阈值ret2将灰度图转换为黑白图thresh为返回的黑白图 ret2, thresh cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSUcv2.THRESH_BINARY) show(thresh,231_lwxwpb_gray) #另一种腐蚀膨胀 img_bgr2rgb1 thresh plt.imshow(img_bgr2rgb1) plt.show() # 开运算先腐蚀再膨胀消除图片背景的噪声 kernel np.ones((3,3), np.uint8) opening cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations3) show(opening,231_lwxwpb_Open Operation) resultopening #画出轮廓 contours,hirearchycv2.findContours(result,cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)# 找出连通域 img1img.copy() img1 cv2.drawContours(img, contours, -1, (0, 0, 255), 2) show(img1, 231_lwxwpb_Box the result) ObjCount len(contours) # 在每个轮廓的中心标注轮廓的标号 for i in range(0, ObjCount): # minAreaRect返回轮廓的最小外接矩形的信息 rect cv2.minAreaRect(contours[i]) img1 cv2.drawContours(img, contours, i, (0, 0, 255), 2) # 在绘制轮廓前生成随机颜色 random_color (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) img1 cv2.drawContours(img, contours, i, random_color, 2) img2 putText(img, str(i 1), (int(rect[0][0]), int(rect[0][1])), cv2.FONT_HERSHEY_COMPLEX, 1, random_color, 2) # 在图片上标注硬币的个数 img3 putText(img, ObjCount str(ObjCount), (20, 30), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 0), 2) # 署名 cv2.putText(img, lvwenxiang, (0, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) cv2.putText(img, wangpengbo, (0, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) # 所有操作结束后进行释放 show(img1) print(fThe Count of Corn is {ObjCount}) 4、实验结果
1.高斯模糊处理二值化灰度图 2.灰度直方图灰度图转黑白图 3.两种腐蚀膨胀方法类似 4.描绘边界统计数量 5.终端显示 四、实验分析
1、实验总结与收获
实验未达到理想结果理想的结果是任意给出一张图片能识别出图中硬币数量。分析原因一与统计数量原理有关当图片背景和硬币的颜色饱和度等视觉感应相似时python处理的机械化往往会造成误差。二在转灰度图时无法分割硬币即使在腐蚀膨胀后也无法分割硬币与硬币反光也有一定关系。
实验结果可以实现让我们了解了图片物体统计的基本原理本次综合实验基于前面对OpenCV基础编程的了解打下坚实基础后才可熟练完成本次任务。实验中需要选择和调试不同的参数如阈值、腐蚀和膨胀的迭代次数等这些参数的选择对最终的图像处理效果有很大的影响。我们学会了通过不断尝试和调整参数来找到最佳的处理结果这也突显了参数选择的挑战性和重要性。在进行图像处理实验时记录和追踪每个处理步骤和参数设置是非常重要的添加必要的备注有助于增强代码可读性这可以确保实验结果的可重复性也方便了解和修复潜在的问题。
2、实验收获
本次实验的进行使我们对计算机视觉领域有了初步的认识让我们能够对OpenCV这方面的知识有一个比较基础的了解对我们学习Python方面有非常棒的提高使我对图像处理和其他种种技术有了较为坚实的基础。
同时这次实验也提高了寻找问题和解决问题能力锻炼了我的思考能力强化了我的思维方式这对我今后的学习和生活都有很大的帮助。 3、其他实验建议或意见
提供腐蚀膨胀的代码以及给出更多的解决策略供新手学习参考可给出网址让我们对识别统计的原理有更深的了解发现更多解决问题方法。