opencv(python)图像处理入门教程
opencv(python)图像处理入门教程
Ibelievesunshine
毕业于浙江师范大学数计学院,是一名图像处理工程师
展开
-
opencv 结合pyqt5 编写简单的图像处理GUI程序
实验目标我们学的内容都是跑在命令行中的,并没有界面,那么”脚本语言”Python如何搭建GUI界面呢?其实Python支持多种图形界面库,如Tk(Tkinter)、wxPython、PyQt等,虽然Python自带Tkinter,无需额外安装包,但我更推荐使用PyQt,一是因为它完全基于Qt,跨平台,功能强大,有助于了解Qt的语法,二是Qt提供了Designer设计工具,界面设计上可以拖控件...原创 2020-04-03 19:46:21 · 13535 阅读 · 19 评论 -
opencv 实现图像时钟
解决方案详解绘制表盘表盘上只有60条分/秒刻线和12条小时刻线,当然还有表盘的外部轮廓圆,也就是重点在如何画72根线。先把简单的圆画出来:import cv2 as cvimport mathimport datetimeimport numpy as npmargin = 5 # 上下左右边距radius = 220 # 圆的半径center = (center_x,...原创 2020-04-03 14:04:58 · 1049 阅读 · 0 评论 -
opencv 实现图像高斯金字塔
函数:dst = cv.pyrDown( src[, dst[, dstsize[, borderType]]] ) # 高斯金字塔下采样参数:src 源图像.dst 输出图像;它有着指定的大小,和源图像有着相同的类型.dstsize 输出图像的大小.borderType 像素外延方法.默认情况下,输出图像的大小为((src.cols+1)/2, (src.rows+1)/2)。...原创 2020-04-03 13:10:23 · 568 阅读 · 0 评论 -
opencv 实现角点检测 Shi-Tomasi角点检测
角点检测概述角点检测概述Harris角点检测算法手动实现Harris角点检测算法手动实现opencv中使用Harris角点检测opencv中使用Harris角点检测opencv中使用 Shi-Tomasi角点检测函数:corners = cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance[, cor...原创 2020-04-03 12:05:15 · 384 阅读 · 0 评论 -
opencv 图像处理应用之车道检测
目标:实际公路的车道线检测素材中车道保持不变,车道线清晰明确,易于检测,是车道检测的基础版本,网上也有很多针对复杂场景的高级实现,感兴趣的朋友可以自行了解。如果我们手动把这部分ROI区域抠出来,就会排除掉大部分干扰。接下来检测直线肯定是用霍夫变换,但ROI区域内的边缘直线信息还是很多,考虑到只有左右两条车道线,一条斜率为正,一条为负,可将所有的线分为两组,每组再通过均值或最小二乘法拟合的方...原创 2020-04-03 00:36:17 · 2426 阅读 · 5 评论 -
opencv 霍夫变换检测直线和圆
霍夫变换霍夫变换原理及python实现opencv 霍夫直线变换OpenCV中用cv.HoughLines()在二值图上实现霍夫变换,函数返回的是一组直线的(r,θ)数据:函数中:参数1:要检测的二值图(一般是阈值分割或边缘检测后的图)参数2:距离r的精度,值越大,考虑越多的线参数3:角度θ的精度,值越小,考虑越多的线参数4:累加数阈值,值越小,考虑越多的线实验:检测图像中的直线...原创 2020-04-02 12:58:15 · 938 阅读 · 0 评论 -
opencv 模板匹配,在图像中寻找物体
使用模板匹配在图像中寻找物体模板匹配模板匹配就是用来在大图中找小图,也就是说在一副图像中寻找另外一张模板图像的位置:opencv中用 cv.matchTemplate() 实现模板匹配。模板匹配的原理其实很简单,就是不断地在原图中移动模板图像去比较,有6种不同的比较方法,详情可参考:TemplateMatchModes1. 平方差匹配CV_TM_SQDIFF:用两者的平方差来匹配,最好...原创 2020-04-01 21:58:22 · 5886 阅读 · 1 评论 -
opencv 绘制图像直方图,实现直方图均衡化
直方图直方图简单来说就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的有多少个……直方图是一种分析图像的手段:直方图计算opencv库计算直方图使用 cv.calcHist(images, channels, mask, histSize, ranges) 计算,其中:参数1:要计算的原图,以方括号的形式传入,如:[img]参数2:选择图像的某个通道,计算直...原创 2020-04-01 13:12:56 · 1393 阅读 · 0 评论 -
opencv 凸包讲解和绘制
凸包讲解凸包跟多边形逼近很像,只不过它是物体最外层的”凸”多边形:集合A内连接任意两个点的直线都在A的内部,则称集合A是凸形的。如下图,红色的部分为手掌的凸包,双箭头部分表示凸缺陷(Convexity Defects),凸缺陷常用来进行手势识别等:opencv中凸包函数# cnt:轮廓;hull:返回的凸包的角点坐标;reuturnPoints=True:代表返回角点的x/y坐标hull...原创 2020-04-01 10:25:02 · 2190 阅读 · 0 评论 -
opencv 多边形近似物体形状
前面我们学习过最小外接矩和最小外接圆,那么可以用一个最小的多边形包围物体吗?当然可以:其中 cv.approxPolyDP() 的参数1是源图像的某个轮廓;参数2(epsilon)是一个距离值,表示多边形的轮廓接近实际轮廓的程度,值越小,越精确;参数3表示是否闭合。import cv2 as cvimport numpy as np# 多边形逼近# 1.先找到轮廓img = cv.i...原创 2020-04-01 09:49:27 · 1593 阅读 · 0 评论 -
opencv 利用轮廓检索函数实现字母匹配(图像匹配)
在待识别图像上找到模板图像待识别图像:模板图像:识别原理1. 将待识别图像 -> 灰度图像 -> 二值图像2. 通过轮廓检索函数 cv.findContours 找到待识别图像所有轮廓3. 模板图像 -> 灰度图像 -> 二值图像4. 通过轮廓检索函数 cv.findContours 找到模板图像中字母 A 的外轮廓5. 将第2步得到的轮廓逐一和第4步得...原创 2020-03-31 20:10:05 · 3474 阅读 · 1 评论 -
opencv 物体形状匹配
**opencv中 cv.matchShapes() 可以检测两个形状之间的相似度,返回值越小,越相似。**先读入下面这张图片:进行实验:import numpy as np import cv2 as cvimg = cv.imread('shapes.jpg', 0)_, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + c...原创 2020-03-31 15:26:50 · 3387 阅读 · 0 评论 -
opencv 图像轮廓特征 图像面积,轮廓周长,外接矩形、最小外接矩形、最小外接圆、拟合椭圆
找出图像轮廓contours, hierarchy = cv.findContours(thresh, 3, 2)画出图像轮廓cnt = contours[1]cv.drawContours(img_color1, [cnt], 0, (0, 0, 255), 2)计算轮廓面积area = cv.contourArea(cnt) #cnt:轮廓print(area)...原创 2020-03-31 14:36:15 · 3013 阅读 · 0 评论 -
opencv 利用图像轮廓函数填充圆环内部 图像轮廓函数应用小例子
实验:import cv2 as cvimport numpy as np# 1.读入圆环img = cv.imread('circle_ring.jpg')img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)_, thresh = cv.threshold( img_gray, 0, 255, cv.THRESH_BINARY +...原创 2020-03-31 10:24:13 · 2468 阅读 · 0 评论 -
opencv cv.findContours 函数详解
函数 cv.findContourscontours, hierarchy = cv.findContours( image, mode, method[, contours[, hierarchy[, offset]]] )参数1:源图像参数2:轮廓的检索方式,这篇文章主要讲解这个参数参数3:一般用 cv.CHAIN_APPROX_SIMPLE,就表示用尽可能少的像素点表示轮廓co...原创 2020-03-30 22:31:48 · 15187 阅读 · 2 评论 -
opencv 绘制图像轮廓
图像轮廓概念轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手;而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓。寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图。注意:...原创 2020-03-30 20:30:54 · 1766 阅读 · 2 评论 -
opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
图像膨胀和腐蚀图解原理及python实现更多内容:图像膨胀和腐蚀原理及python实现opencv中膨胀和腐蚀函数dilation = cv.dilate(img, kernel) # 膨胀erosion = cv.erode(img, kernel) # 腐蚀实验import cv2 as cvimport numpy as npimg = cv.imread...原创 2020-03-30 18:11:25 · 815 阅读 · 0 评论 -
opencv 图像边缘检测 Canny边缘检测算法使用
图解边缘检测opencv 应用Canny算法进行边缘检测import cv2 as cvimport numpy as npimg = cv.imread('baby_g.jpg', 0)# 二值化图像处理后,边缘检测效果更好_, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)# cann...原创 2020-03-30 11:55:52 · 807 阅读 · 0 评论 -
opencv 对图像进行卷积
卷积什么是二维卷积呢?看下面一张图就一目了然:卷积就是循环对图像跟一个核逐个元素相乘再求和得到另外一副图像的操作,比如结果图中第一个元素5是怎么算的呢?原图中3×3的区域与3×3的核逐个元素相乘再相加:5=1×1+2×0+1×0+0×0+1×0+1×0+3×0+0×0+2×2算完之后,整个框再往右移一步继续计算,横向计算完后,再往下移一步继续计算。简而言之,卷积是一个对应位置像素值相乘...原创 2020-03-30 11:09:28 · 4101 阅读 · 0 评论 -
opencv 调整图像亮度和对比度
图像亮度以灰度图像为例,图像亮度指的是图像的明暗程度,图像的像素值整体越接近于255,图像越亮,反之越接近于0,图像越暗。图像对比度假设灰度图像的像素值的范围为[a,b],如果b-a的值越接近于255,图像对比度越大,看上去图像更清晰;反之越接近于0,图像越不清晰。修改图像的亮度和对比度OpenCV中亮度和对比度应用这个公式来修改:g(x)=αf(x)+β,其中:α(>0...原创 2020-03-30 00:00:14 · 14808 阅读 · 0 评论 -
opencv 图像融合
图像相加要叠加两张图片,可以用cv.add()函数,相加两幅图片的形状(高度/宽度/通道数)必须相同。numpy中可以直接用res = img + img1相加,但这两者的结果并不相同:import numpy as npimport cv2 as cvx = np.uint8([250])y = np.uint8([10])print(cv.add(x, y)) # 250+1...原创 2020-03-29 19:33:36 · 648 阅读 · 0 评论 -
opencv 实现一个鼠标绘图小程序
需求在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换。左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图。实现思想用鼠标画图:需要定义鼠标的回调函数mouse_event画圆或矩形:需要定义一个画图的模式mode左键单击、移动、释放:需要捕获三个不同的事件开始画图,结束画图:需要定义一个画图的标记位drawing实现代码import cv2 as cvi...原创 2020-03-29 16:59:01 · 456 阅读 · 0 评论 -
opencv 基本绘图功能 画直线 画圆 给图像添加文字等
直线矩形圆椭圆多边形多条直线图像上写文字实验import cv2 as cvimport numpy as np# 创建一副黑色的图片img = np.zeros((512, 512, 3), np.uint8)# 画一条线宽为5的蓝色直线# 参数1:源图像,参数2:起点,参数3:终点,参数4:颜色(蓝色),参数5:线宽(5)cv.line(img, ...原创 2020-03-29 15:14:47 · 499 阅读 · 0 评论 -
opencv 仿射变换与透视变换详解
常见的2D图像变换从原理上讲主要包括基于2×3矩阵的仿射变换和基于3×3矩阵透视变换。仿射变换原理基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换:如果写成矩阵的形式,就是:作如下定义:矩阵T(2×3)就称为仿射变换的变换矩阵,R为线性变换矩阵,t为平移矩阵,简单来说,仿射变换就是线性变换+平移。变换后直线依然是直线,平行线依然...原创 2020-03-29 11:15:30 · 1990 阅读 · 1 评论 -
opencv 图像平移、缩放、旋转、翻转 图像仿射变换
图像几何变换图像几何变换从原理上看主要包括两种:基于2x3矩阵的仿射变换(平移、缩放、旋转、翻转)、基于3x3矩阵的透视变换。图像平移opencv实现图像平移实现图像平移,我们需要定义下面这样一个矩阵,tx和ty分别是x和y方向上平移的距离:图像平移利用仿射变换函数 cv.warpAffine() 实现实验# 图像平移import numpy as npimport c...原创 2020-03-28 23:40:52 · 3412 阅读 · 0 评论 -
opencv 二值化图像详解 一文看懂各种二值化方法
本文介绍使用不同的阈值方法“二值化”图像固定阈值分割图解代码import cv2 as cv# 读入灰度图像img = cv.imread('baby_g.jpg', 0)# 阈值127分割图像ret, th = cv.threshold(img, 127, 255, cv.THRESH_BINARY)cv.imshow('thresh', th)cv.waitKey(0...原创 2020-03-28 21:25:01 · 5048 阅读 · 1 评论 -
opencv 图像颜色空间转换和特定颜色物体追踪
颜色空间转换HSV简介HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色。H表示色调(Hue),S表示饱和度(Saturation),V表示明度(Value)。OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同...原创 2020-03-28 20:10:40 · 751 阅读 · 0 评论 -
opencv 图像基本操作 像素值的获取、图像大小、ROI、通道分割与合并等
opencv中的图像基本操作方法访问和修改图像某像素点的值函数a=img[y,x] #获取像素点的值img[y,x]=b #修改像素点的值实例import cv2 as cvimport numpy as npimg = cv.imread('baby.png')px = img[50,100]print(px) # output:[76,94,94]# 只获取图...原创 2020-03-28 16:55:35 · 1530 阅读 · 0 评论 -
opencv 创建调色板
滑动条创建要创建一个滑动条,使用cv.createTrackbar(‘R’,‘image’,0,255,call_back),参数参数1:滑动条的名称参数2:所在窗口的名称参数3:当前的值参数4:最大值参数5:回调函数名称,回调函数默认有一个表示当前值的参数创建好之后,可以在回调函数中获取滑动条的值,也可以用:cv.getTrackbarPos(‘R’,‘image’)得到,其中,...原创 2020-03-28 16:09:02 · 658 阅读 · 0 评论 -
opencv 视频操作入门
打开摄像头并捕获照片要使用摄像头,需要使用cv2.VideoCapture(0)创建VideoCapture对象,参数0指的是摄像头的编号,如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1,依此类推。# 打开摄像头并灰度化显示import cv2 as cv # 0表示摄像头的编号capture = cv.VideoCapture(0)while(True): ...原创 2020-03-28 01:01:43 · 236 阅读 · 0 评论 -
opencv 图像读写显示、matplotlib 库图像读写显示
图片格式:bmp全称:Bitmap不压缩png全称:Portable Network Graphics无损压缩jpg全称:Joint Photographic Experts Group有损压缩opencv(python)中图像读写显示:import cv2 as cvnew_img = cv.imread('baby.png') # 文件大小:36...原创 2020-03-27 20:39:00 · 468 阅读 · 0 评论 -
opencv 显示程序运行时间
opencv(python)实现代码:import cv2 as cv# 开始计时start = cv.getTickCount()# 读入一张图片img = cv.imread('baby.png')# 停止计时end = cv.getTickCount()# 单位:sprint((end - start) / cv.getTickFrequency(),' secon...原创 2020-03-27 16:49:52 · 687 阅读 · 1 评论