用opencv实验形态学开运算和闭运算
基于OpenCV的水银体温计示数实时检测

基于OpenCV的水银体温计示数实时检测姚坤【摘要】为了实现对水银体温计产品的在线非接触式检测,设计一种示数检测系统;基于特殊的机械运载平台设计配合线阵相机对体温计产品进行图像采集,基于OpenCV开源视觉库对图像进行处理,提出一种基于模板匹配和纵向扫描端点查找的图像搜索算法,通过确定刻度线和水银柱升降端在图像中的相对位置关系计算体温计示数;不借助外部测量仪器对产品示数进行实时检测,可有效取代传统的人工操作方式;实验结果表明,该系统运行稳定且具有较好的实时性,检测精度较高,满足测量不确定度小于0.1℃的检测要求.【期刊名称】《计算机测量与控制》【年(卷),期】2016(024)001【总页数】4页(P89-91,101)【关键词】示数检测;线阵相机;模板匹配;纵向扫描;OpenCV【作者】姚坤【作者单位】中国电信股份有限公司山东分公司,山东菏泽274000【正文语种】中文【中图分类】TP391.4水银体温计是目前使用最广泛的体温测量工具,在体温计的市场份额中占据着大部分比重。
在水银体温计的生产过程中,产品的检定是出厂前必不可少的步骤。
目前国内的生产线上普遍采用的检定方法是将产品放置在一定温度的恒温水箱中,一段时间后,取出进行人工目测,根据示数判断是否合格。
传统方法存在准确度差、效率低等问题,由于生产环境对温控的严格要求,车间的高温会导致人员易疲劳等问题,从而检测结果更易受主观因素的影响。
随着技术水平的不断提高,机器代替人工进行智能化生产检测已经成为工业发展的趋势。
在已有的相关研究中,陈恪等人提出一种基于边缘检测和霍夫变换的温度计检测方法[1]。
另外,向毅等人提出一种基于霍夫变换和形态学运算的温度计读数识别方法,可有效读数温度计示数[2]。
但是对于三棱体温计的检测以上方法适用性不强,且缺少系统化的相关设计,难以实现产品的在线检定。
本文为了实现不借助外部测量仪器,对体温计进行实时检定的目的,设计了一套水银体温计示数检测系统。
基于OpenCV图像处理系统的开发与实现

基于OpenCV图像处理系统的开发与实现刘培军;马明栋;王得玉【摘要】In the research of digital image processing technology, when a small number of images are processed, various image processing algorithms are generally used for programming according to different requirements, and there are a lot of repetitive work. However, when the amount of digital image data is large and the real-time requirement of processed images is high, all images are processed, codes and algorithms are written manually, which is quite difficult and inefficient. In order to effectively solve the above problems, based on OpenCV computer vision library and under the integrated development environment of Qt Creator, we develop and implement an image processing system of object-oriented programming with better interface and convenient for users. The practice of digital image processing shows that the system can process images efficiently and quickly.%在数字图像处理技术的研究过程中,基于平时对少量图像进行处理时,一般都是针对不同需求运用各种图像处理算法进行编程,存在着许多重复性工作.而当数字图像数据量非常大且对处理的图像实时性要求非常高时,对所有图像进行处理,代码以及算法的实现都通过人工进行编写,存在着相当大的难度且效率十分低下.为有效解决上述问题,以OpenCV计算机视觉库为基础,在Qt Creator 集成开发环境下,采用面向对象编程,开发并实现了一款界面良好,方便用户使用的图像处理系统.通过对大量数字图像处理的实践表明,该系统能够有效快速地对图像进行处理.【期刊名称】《计算机技术与发展》【年(卷),期】2019(029)003【总页数】5页(P127-131)【关键词】图像处理算法;OpenCV;Qt Creator;面向对象;图像处理系统【作者】刘培军;马明栋;王得玉【作者单位】南京邮电大学通信与信息工程学院, 江苏南京 210003;南京邮电大学地理与生物信息学院, 江苏南京 210023;南京邮电大学地理与生物信息学院, 江苏南京 210023【正文语种】中文【中图分类】TP3020 引言在计算机技术如此成熟的今天,图像处理理论与技术已经得到了较为全面的发展并在持续不断的优化创新中,尤其在人工智能、航空航天、工业部件检测、交通、医学等领域得到了广泛应用[1-2]。
二值形态学膨胀、腐蚀、开、闭运算opencv

【二值形态学膨胀、腐蚀、开、闭运算opencv的深度解析】一、概念介绍1. 二值形态学在图像处理中,二值形态学是一种针对二值图像进行的形态学操作,主要包括膨胀、腐蚀、开、闭运算等。
2. 膨胀膨胀是二值形态学中的一种基本操作,它能够使目标区域扩张并填充内部的空洞,从而使目标变大。
3. 腐蚀腐蚀是二值形态学中的另一种基本操作,它能够使目标区域收缩并去除边缘细节,从而使目标变小。
4. 开运算开运算是先腐蚀后膨胀的组合操作,可以用来去除图像中的噪声和小的干扰目标。
5. 闭运算闭运算是先膨胀后腐蚀的组合操作,可以用来填补图像中的小孔和裂缝。
二、深入探讨1. 膨胀的原理和作用膨胀通过结构元素的滑动来扩张目标区域,可以使目标变大,填充空洞,连接断裂的目标,是图像处理中常用的操作之一。
2. 腐蚀的原理和作用腐蚀通过结构元素的滑动来收缩目标区域,可以使目标变小,去除边缘细节,分离接触的目标,也是图像处理中常用的操作之一。
3. 开闭运算的应用场景开运算通常用于去除图像中的小噪声和杂点,可以平滑目标轮廓,提高目标边缘的连通性;闭运算通常用于填补图像中的小孔和断裂,可以使目标更加完整,减少断裂和裂缝。
4. opencv中的二值形态学函数opencv提供了丰富的二值形态学函数,可以方便地进行膨胀、腐蚀、开、闭运算,如cv2.dilate()、cv2.erode()、cv2.morphologyEx()等,可以通过设置结构元素的形状和大小来调整操作效果。
5. 个人观点和理解对于二值形态学操作,我认为膨胀和腐蚀是其基础,而开闭运算则是在这两者基础上的进一步应用,能够更加精细地处理目标区域,去除干扰和噪声,提取有效信息。
在实际应用中,需要根据具体情况选择不同的操作和参数,以达到最佳的处理效果。
三、总结回顾通过本文的介绍和分析,我们深入理解了二值形态学中的膨胀、腐蚀、开、闭运算的原理和作用,以及在opencv中的应用方式。
我们也从个人观点出发,探讨了这些操作的实际意义和效果。
形态学的原理以及应用场景(含源码)

形态学的原理以及应用场景(含源码)转自:摘要:形态学一般指生物学中研究动物和植物结构的一个分支。
用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具。
基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。
形态学图像处理的基本运算有:•膨胀和腐蚀(膨胀区域填充,腐蚀分割区域)•开运算和闭运算(开运算去除噪点,闭运算填充内部孔洞)•击中与击不中•顶帽变换,黑帽变换形态学的应用:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化等;分割出独立的图像元素,或者图像中相邻的元素;求取图像中明显的极大值区域和极小值区域;求取图像梯度在讲各种形态学操作之前,先来看看结构元素:膨胀和腐蚀操作的核心内容是结构元素。
(后面的开闭运算等重要的也是结构元素的设计,一个合适的结构元素的设计可以带来很好的处理效果OpenCV里面的API介绍:Mat kernel = getStructuringElement(int shape,Size ksize,Point anchor);一,腐蚀和膨胀腐蚀和膨胀是最基本的形态学操作,腐蚀和膨胀都是针对白色部分(高亮部分)而言的。
•膨胀就是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域(是求局部最大值的操作)•腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域(是求局部最小值的操作)膨胀与腐蚀能实现多种多样的功能,主要如下:1、消除噪声2、腐蚀分割(isolate)出独立的图像元素,膨胀在图像中连接(join)相邻的元素。
3、寻找图像中的明显的极大值区域或极小值区域4、求出图像的梯度opencv中膨胀/腐蚀API:(两者相同)void dilate/erode( const Mat& src, //输入图像(任意通道的)opencv实现:Mat src1 = imread("D:/opencv练习图片/腐蚀膨胀.png");图片膨胀:图片[图片上传中...(image-e5cbf7-1637738882548-13)]1️⃣ 腐蚀操作的原理就是求局部最小值的操作,并把这个最小值赋值给参考点指定的像素。
OpenCV常用库函数

OpenCV常⽤库函数⼀、core模块1、Mat - 基本图像容器Mat 是⼀个类,由两个数据部分组成:矩阵头(包含矩阵尺⼨,存储⽅法,存储地址等信息)和⼀个指向存储所有像素值的矩阵(根据所选存储⽅法的不同矩阵可以是不同的维数)的指针。
创建Mat对象⽅法:11->Mat() 构造函数:2 Mat M(2,2, CV_8UC3, Scalar(0,0,255));3int sz[3] = {2,2,2};4 Mat L(3,sz, CV_8UC(1), Scalar::all(0));52->Create() function: 函数6 M.create(4,4, CV_8UC(2));73-> 初始化zeros(), ones(), :eyes()矩阵8 Mat E = Mat::eye(4, 4, CV_64F);9 Mat O = Mat::ones(2, 2, CV_32F);10 Mat Z = Mat::zeros(3,3, CV_8UC1);114->⽤逗号分隔的初始化函数:12 Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);常⽤操作:1 Mat A, C; // 只创建信息头部分2 A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这⾥为矩阵开辟内存3 Mat B(A); // 使⽤拷贝构造函数4 C = A; // 赋值运算符5 Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle6 Mat E = A(Range:all(), Range(1,3)); // using row and column boundaries7 Mat F = A.clone();8 Mat G;9 A.copyTo(G); //使⽤函数 clone() 或者 copyTo() 来拷贝⼀副图像的矩阵。
形态学开运算和闭运算公式

形态学开运算和闭运算公式
形态学开运算和闭运算是图像处理中常用的两种形态学操作。
形态学开运算可以用来消除图像中的小噪点,并使边缘更加清晰;形态学闭运算则可以填充图像中的空洞,并使目标更加完整。
形态学开运算的公式可以表示为:
开运算(A) = 腐蚀(A, B) ⊛ 膨胀(A, B)
其中,A代表输入图像,B代表结构元素(也称为模板),⊛代表形态学腐蚀操作,⊕代表形态学膨胀操作。
形态学闭运算的公式可以表示为:
闭运算(A) = 膨胀(A, B) ⊛ 腐蚀(A, B)
形态学开运算和闭运算的操作步骤如下:
1. 对输入图像A进行形态学腐蚀操作,记为C1 = 腐蚀(A, B);
2. 对C1进行形态学膨胀操作,记为D1 = 膨胀(C1, B);
3. 对输入图像A进行形态学膨胀操作,记为D2 = 膨胀(A, B);
4. 对D2进行形态学腐蚀操作,记为C2 = 腐蚀(D2, B);
5. 形态学开运算结果为D1,形态学闭运算结果为C2。
形态学开运算和闭运算可以应用于各种图像处理任务中。
例如,在目标检测中,可以先进行形态学开运算来消除噪点和细小的边缘,然后再进行闭运算来填充目标内部的空洞,从而得到更准确的目标边界。
形态学开运算和闭运算是图像处理中常用的操作,可以通过腐蚀和膨胀操作来改善图像的质量和准确性。
它们在各种图像处理任务中发挥着重要的作用,对于提高图像处理的效果具有重要的意义。
多媒体技术实验报告

一、实验目的本次实验旨在通过实际操作,加深对多媒体技术的理解,掌握多媒体的基本处理方法,包括图像处理、音频处理和视频处理等。
通过实验,培养学生动手能力、分析问题和解决问题的能力,以及团队合作精神。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 图像处理软件:OpenCV4. 音频处理软件:PyAudio5. 视频处理软件:FFmpeg三、实验内容1. 图像处理(1)图像读取与显示使用OpenCV库读取图像文件,并使用imshow函数显示图像。
(2)图像滤波对图像进行高斯滤波、均值滤波和锐化处理,观察滤波效果。
(3)图像边缘检测使用Canny算法对图像进行边缘检测,观察边缘效果。
(4)图像形态学操作对图像进行腐蚀、膨胀、开运算和闭运算等形态学操作,观察形态学效果。
2. 音频处理(1)音频播放与录制使用PyAudio库播放和录制音频文件。
(2)音频信号处理对音频信号进行低通滤波、高通滤波和带通滤波等处理,观察滤波效果。
(3)音频信号转换将音频信号从PCM格式转换为WAV格式,并观察转换效果。
3. 视频处理(1)视频读取与显示使用FFmpeg库读取视频文件,并使用imshow函数显示视频帧。
(2)视频帧提取从视频中提取连续帧,观察帧间差异。
(3)视频帧处理对视频帧进行灰度化、二值化、腐蚀、膨胀等处理,观察处理效果。
(4)视频编码与解码将视频编码为H.264格式,并解码为原始视频格式,观察编码和解码效果。
四、实验结果与分析1. 图像处理实验结果(1)读取并显示图像成功读取图像文件,并使用imshow函数显示图像。
(2)图像滤波通过高斯滤波、均值滤波和锐化处理,图像质量得到改善。
(3)图像边缘检测使用Canny算法对图像进行边缘检测,成功提取图像边缘。
(4)图像形态学操作通过腐蚀、膨胀、开运算和闭运算等形态学操作,成功实现图像形态学变换。
2. 音频处理实验结果(1)音频播放与录制成功播放和录制音频文件。
OpenCV-Python系列之开运算与闭运算

OpenCV-Python系列之开运算与闭运算图像的腐蚀与膨胀是本次教程的核⼼——开运算与闭运算的基础,如果结构元素为圆形,则膨胀操作可填充图像中⽐结构元素⼩的孔洞以及图像边缘处⼩的凹陷部分。
⽽腐蚀可以消除图像中的⽑刺及细⼩连接成分,并将图像缩⼩,从⽽使其补集扩⼤。
但是,膨胀和腐蚀并⾮互为逆运算,所以它们可以结合使⽤。
在腐蚀和膨胀两个基本运算的基础上,可以构造出形态学运算簇,它由膨胀和腐蚀两个运算的复合与集合操作(并、交、补等)组合成的所有运算构成。
例如,可使⽤同⼀结构元素,先对图像进⾏腐蚀然后膨胀其结果,该运算称为开运算;或先对图像进⾏膨胀然后腐蚀其结果,称其为闭运算。
开运算和闭运算是形态学运算族中两种最为重要的运算。
对于图像X及结构元素S,⽤符号表⽰S对图像X作开运算,⽤符号表⽰S对图像X作闭运算,它们的定义为:⾸先需要来了解⼀个函数:cv2.morphologyEx(src, op, kernel)参数说明:src传⼊的图⽚op进⾏变化的⽅式kernel表⽰定义的卷积核的⼤⼩以及形状op = cv2.MORPH_OPEN 进⾏开运算,指的是先进⾏腐蚀操作,再进⾏膨胀操作op = cv2.MORPH_CLOSE 进⾏闭运算,指的是先进⾏膨胀操作,再进⾏腐蚀操作开运算开运算指的就是对图像先进⾏腐蚀操作,然后再进⾏膨胀操作,⽽通常情况下,它是对图像的明亮的区域进⾏操作,可以消除图像中的⽩噪声,现在我们来看例⼦,先看⼀幅图像:现在我们想要消除图像中的⿊⾊的⽑刺,但是如果直接对图像进⾏开运算是不⾏的,因为开运算是对图像的明亮区域进⾏操作,看⼀下直接进⾏开运算会有什么效果:import cv2import numpy as npimg = cv2.imread('open.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("result", open)cv2.waitKey(0)cv2.destroyAllWindows()可以看到,图像的⽑刺没有被去除,现在我们需要将原图进⾏阈值化翻转,也就是⿊⽩颠倒,这样才⽅便进⾏形态学的处理,我们在前⾯阈值部分讲过,这⾥就不再讲述了,直接看代码:import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]cv2.imshow("img",img)cv2.imshow("thres",threshold)cv2.waitKey(0)cv2.destroyAllWindows()现在图像已经被⿊⽩颠倒了过来,现在我们可以开始进⾏开运算了,当然⾸先也是需要定义⼀个卷积核的,这在上个教程中已经谈到,在这⾥我们定义⼀个3*3的矩形卷积核:import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open =cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("thres",threshold)cv2.imshow("result", open)cv2.waitKey(0)cv2.destroyAllWindows()这样效果就显⽽易见了,如果我们将卷积核改成5*5的呢:import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))open =cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)cv2.imshow("thres",threshold)cv2.imshow("result", open)cv2.waitKey(0)cv2.destroyAllWindows()这就说明操作过度了,所以对于形态学处理卷积核的适当选取是⾮常重要的,现在我们对处理之后的图像进⾏还原:import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open =cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)result = cv2.threshold(open,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]cv2.imshow("img",img)cv2.imshow("thres",threshold)cv2.imshow("open", open)cv2.imshow("result",result)cv2.waitKey(0)cv2.destroyAllWindows()看⼀下最终还原的结果:事实上,卷积核的灵活运⽤将会极⼤的⽅便图像的形态学处理,我们来进⾏⼀个实战,⽐如现在给出⼀幅图像:我们将⽤开运算分别提炼出横线和竖线,我们使⽤13*1的卷积核进⾏实验:import cv2import numpy as npimg = cv2.imread('hengshu.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(13,1))open =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("open", open)cv2.waitKey(0)cv2.destroyAllWindows()是不是很神奇,现在我们使⽤1*13的卷积核进⾏实验:import cv2import numpy as npimg = cv2.imread('hengshu.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,13))open =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("open", open)cv2.waitKey(0)cv2.destroyAllWindows()竖线也被完美的提取出来了,在以后的项⽬实战中,我们将会⽤到这些知识,合理的过滤掉图像中多余的信息,事实上,我们还发现,处理之后的图像偏暗,没有原图那么明亮,这在下次教程中的顶帽——⿊帽操作中可以进⾏处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用opencv实验形态学开运算和闭运算,程序代码为
#include "cv.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
//调入照片
IplImage* img = cvLoadImage("2.jpg");
if(!img) //判断图片调入是否成功
return -1; //调入图片失败则退出
//将图片缩小两倍
IplImage*
img_small=cvCreateImage(cvSize(img->width/3,img->height/3),img->depth,img->n Channels);
cvResize(img,img_small);
//初始化结果要存到的图像指针
IplImage* result1=cvCloneImage(img_small);
IplImage* result2=cvCloneImage(img_small);
//分别对图像进行形态学开运算和闭运算
cvMorphologyEx(img_small,result1,NULL,NULL,CV_MOP_OPEN,1);//最后一个参数为膨胀和腐蚀次数
cvMorphologyEx(img_small,result2,NULL,NULL,CV_MOP_CLOSE,1);
//创建窗口,并确定其为大小不可变类型窗口
cvNamedWindow("liuxi_open", CV_WINDOW_AUTOSIZE);
cvNamedWindow("liuxi_close", CV_WINDOW_AUTOSIZE);
//显示图片
cvShowImage("liuxi_open", result1);
cvShowImage("liuxi_close", result2);
//cvShowImage("liuxi_open", img_small);
cvWaitKey(0); //等待按键
//release images
cvReleaseImage(&img);
cvReleaseImage(&img_small);
cvReleaseImage(&result1);
cvReleaseImage(&result2);
//destroy windows
cvDestroyWindow("liuxi_open");
cvDestroyWindow("liuxi_close");
return 0;
}。