图像处理的常见案例_OpenCV 进阶应用,用编程手段搞定图像处理

在我们生活中,常见的图像处理软件有Adobe Photoshop、Adobe Illustrator等。然而,并非只有软件才能实现图像处理,通过编程手段也是能实现的!通过编程手段实现图像处理,也就是计算机视觉。

所谓计算机视觉,就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图像处理,用电脑处理成为更适合人眼观察或传送给仪器检测的图像。

在近些年发展普及的“人脸识别”和“无人驾驶”,其实都属于计算机视觉的范畴,图像处理是一门借助计算机对图像进行分析从而获得所需结果的技术,一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。

而OpenCV是计算机视觉应用中使用最广泛的库之一。

实验楼的新课《OpenCV 进阶应用实战》以案例的方式带大家深入图像处理的世界,通过 OpenCV 来实现现实中常用的算法。

  • 图像轮廓分析
cfbd5dcd17d4dfa02a23dede216d231a.png
  • 视频前景提取
b3e5421be8fd1f0510ec05089654a212.png
  • 视频运动物体轨迹绘制
ef006b7c40eacb41ed48d3492267f2c1.png

本课程共有 8 节实验,将带领大家从各个方面去学习图像处理操作,教会大家如何选取合适的算法对图像进行二值化处理以及对二值图像进行轮廓分析,从而实现形状的匹配等操作。

运用图像形态学的操作进行图像噪声的去除以及断裂处的连接;运用角点检测以及特征分析提取图像中的相关特征;运用 OpenCV 视频操作接口进行读写视频,并且对视频中的每一帧进行操作;运用视频背景消除算法提取视频中的前景目标,运用光流方法以及帧差法对移动物体进行轨迹绘制,还会会采用三个案例将所学习到的知识贯穿起来,从而完成不同的任务。

在课程《OpenCV 进阶应用实战》中可以学到这些知识点:

2d0d7d37500956ac8235ffe9d99ba6c6.png

感兴趣的童鞋,请点击了解更多进入课程页面哦!

项目细节: 首先载入源图像,并进行尺寸预处理。 载入源图像image并作拷贝为org,将image按原始h,w的比例大小设置为高度为500的图像。 进行边缘检测和轮廓检测 在灰度化->边缘检测->轮廓检测后,将轮廓按轮廓的面积进行排序(注意这里默认是顺序的即从小到大,我们需要从大到小排序,所以reverse = True),取面积最大的前5个轮廓,并用多边形逼近(cv.approxPolyDP)的方法将轮廓近似出来,因为检测的轮廓有圆形有长矩形,我们需要的检测的目标轮廓是四边形(类似于矩形)。所以我们经过筛选得到我们需要的四边形的坐标。 坐标的透视变换 由多边形逼近轮廓的方法得到的坐标 是每个轮廓逆时钟方向的各个顶点的坐标,而我们想要顺时针方向的各个顶点的坐标,所以需要先对轮廓坐标重新排序。接着需要求出四边形轮廓的高和宽,来创建一个dst数组:该数组为[[0,0],[width-1,0],[width-1,height-1],[0,height-1] 。将四边形轮廓坐标和dst输入到cv.getPerspectiveTransform 函数里,得到透视变换的M矩阵。接着将用M矩阵对原图像做透视变化,其中得出的warped的大小为(width,height),这样透视变换就做完了。 简单点说:首先读取两个坐标数组,计算变换矩阵;然后根据变换矩阵对原图进行透视变换,并输出到目标画布, OCR识别 在OCR识别之前要对待识别的图像进行预处理,即灰度二值化,接着利用ocr指令来识别。 源码: import cv2 as cv import numpy as np import pytesseract def order_point(pts): rect = np.zeros((4, 2), dtype = "float32") s = pts.sum(axis = 1) rect[0] = pts[np.argmin(s)] rect[2] = pts[np.argmax(s)] diff = np.diff(pts,axis=1) rect[1] = pts[np.argmin(diff)] rect[3] = pts[np.argmax(diff)] return rect def four_point_transfer(image,pts): rect = order_point(pts) (tl,tr,br,bl) = rect width1 = np.sqrt((tr[0]-tl[0])*(tr[0]-tl[0])+(tr[1]-tl[1])*(tr[1]-tl[1])) width2 = np.sqrt((br[0]-bl[0])*(br[0]-bl[0])+(br[1]-bl[1])*(br[1]-bl[1])) width = max(width1,width2) #python中有max函数和np.max函数,前者是比较两个数值的大小取最大值,后者是取出数组的最大值 height1 = np.sqrt((tr[0]-br[0])*(tr[0]-br[0])+(tr[1]-br[1])*(tr[1]-br[1])) height2 = np.sqrt((tl[0]-bl[0])*(tl[0]-bl[0])+(tl[1]-bl[1])*(tl[1]-bl[1])) height = max(height1,height2) dst = np.array([[0,0],[width-1,0],[width-1,height-1],[0,height-1]],dtype="float32") M = cv.getPerspectiveTransform(rect,dst) warped =cv.warpPerspective(image,M,(width,height)) return warped def resize(image,height=None): if height is None: return image else : h,w= image.shape[:2] #shape:h,w,channel image[h(row),w(col),channel] r = height/h width = int(w*r) #关于size函数参数的一般是(宽,高) image = cv.resize(image,(width,height),interpolation=cv.INTER_AREA) #还有resize(img,(宽,高)),即先列后行 return image #利用cv.bounding()得到x,y,width,height #其它情况一般都是先行后列(高,宽) #如shape得到参数,或者roi区域内部参数,建立新的Mat 都是先行后列 image = cv.imread("E:\opencv\picture\page.jpg") orig = image.copy() image = resize(image,height=500) ratio = orig.shape[0]/500 #边缘检测 image_gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) image_gray = cv.GaussianBlur(image_gray,(5,5),0) image_edge = cv.Canny(image_gray,75,200) #轮廓检测 image_contours = cv.findContours(image_edge.copy(),cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)[1] countours = sorted(image_contours,key=cv.contourArea,reverse=True)[:5] for c in countours: arc = cv.arcLength(c,closed=True) approx = cv.approxPolyDP(c,arc*0.02,True) if len(approx) == 4: screen_shot = approx break cv.drawContours(image,[screen_shot],-1,(0,0,255),2) warped =four_point_transfer(orig,screen_shot.reshape(4,2)*ratio) cv.imshow('warped_window',resize(warped,height=650)) warped =cv.cvtColor(warped,cv.COLOR_BGR2GRAY) scan = cv.threshold(warped,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)[1] cv.imwrite("E:/opencv/picture/scan.png",scan) cv.imshow("scan ",scan) scanstring = pytesseract.image_to_string(scan) print(scanstring) cv.waitKey(0) cv.destroyAllWindows()
包括对图像进行离散余弦变换处理的源代码 对图像进行水平镜像处理的源代码 反走样 Line 对图像进行中值滤波处理的源代码 计算机图形学立方体旋转 更新版 分形图像制作器源代码 基于小波零树的图像压缩算法 利用OpenGL实现动画效果 逆滤波处理 实现图案化和抖动技术以及bmp2txt源代码 屏幕保护程序与源代码 屏幕颜色拾取器源代码 曲线处理 贝塞尔曲线程序 实现图象平滑(去噪声) 锐化算法的源代码 视频捕获程序代码 贴片法画球(OpenGL 透明窗口源代码 图案化和抖动技术 以及bmp2txt的源代码 图象的平移 旋转 镜像 转置 缩放等几何变换算法 图象的几何变换算法 图象的检测 模板匹配算法代码 图象的缩放系统(vcvc++) 图象腐蚀 膨胀 细化算法 图象合并 位图与调色板源代码 维纳滤波处理 位图按钮的实现代码范例 位图的Alpha淡入淡出显示示例代码 位图文件读写综述 位图与调色板源代码bitmap picture demo 位图与调色板源代码bmp2rgn tool 星星的诞生与陨落 序列化存储图象 颜色拾取器增强版 演示用递归和贴片法画圆柱 真彩位图转化成256彩色或黑白位图的代码 直方图修正和彩色变换算法代码 直方图修正和彩色变换源代码 指定一种颜色把一幅位图变透明 字幕滚动源代码">包括对图像进行离散余弦变换处理的源代码 对图像进行水平镜像处理的源代码 反走样 Line 对图像进行中值滤波处理的源代码 计算机图形学立方体旋转 更新版 分形图像制作器源代码 基于小波零树的图像压缩算法 利用OpenGL实现 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值