文档章节

opencv+python 提取国徽轮廓

sskicgah
 sskicgah
发布于 2017/08/16 10:14
字数 814
阅读 360
收藏 2

简单的说,就是最近需要做图像处理相关的项目,之前没关注过这个领域,突然接触,还是很多细节思路不明白,中间想了很多临时方案,解决过程,最后探索的结果是用不上,不过也有部分东西可以留下思路作为借鉴。

图像提取轮廓,庆幸找到用 Python 和 OpenCV 检测图片上的条形码这篇文章,学了一些处理的思路和方法。这个也是整个处理过程的基础。这里简单说一个探索过程,就是提取轮廓,目标国徽。

opencv版本不一样,用到的api还是有区别的,这里用到的版本是2.4.13

截取一张国徽照片,参考上面的文章,先做灰度,模糊,二值化,再做闭运算,之后4次腐蚀,4次膨胀,之后查找轮廓,在原图画一个轮廓,看起来不是很理想。

def get_guohui2():
    #获取国徽轮廓
    img = cv2.imread("pic/guohui0.jpg")
    
    #灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #模糊
    blurred = cv2.blur(gray, (9, 9))
    #二值化
    (_, thresh) = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("image", thresh)
    cv2.waitKey(0)
    
    #闭运算
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40, 20))
    close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

    # perform a series of erosions and dilations
    #腐蚀、膨胀
    close = cv2.erode(close, None, iterations = 4)
    close = cv2.dilate(close, None, iterations = 4)
    
    cv2.imshow("image", close)
    cv2.waitKey(0)
    
    #查找轮廓
    (contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
    
    cv2.imshow("image", img)
    cv2.waitKey(0)

后面改了先开运算再闭运算,再调整一些参数,看起来效果好多了

def get_guohui2():
    #获取国徽轮廓
    img = cv2.imread("pic/guohui0.jpg")
    
    #灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #模糊
    blurred = cv2.blur(gray, (3, 3))
    #二值化
    (_, thresh) = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("image", thresh)
    cv2.waitKey(0)
    
    #开运算
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
    open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

    # perform a series of erosions and dilations
    #腐蚀、膨胀
    open = cv2.erode(open, None, iterations = 4)
    open = cv2.dilate(open, None, iterations = 4)
    
    cv2.imshow("image", open)
    cv2.waitKey(0)
    
    #闭运算
    close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
    cv2.imshow("image", close)
    cv2.waitKey(0)
    
    #查找轮廓
    (contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
    
    cv2.imshow("image", img)
    cv2.waitKey(0)

但是还有一些缺陷,不够完整,后面想到,可能是边缘不够明显,于是找了怎么锐化边缘,找到OpenCV图像处理 空间域图像增强(图像锐化 1 基于拉普拉斯算子)。里面都是C++的代码,参考了一下,用了矩阵,小改就完成了。锐化后没做模糊操作。

def get_guohui2():
    #获取国徽轮廓
    img = cv2.imread("pic/guohui0.jpg")
    
    #锐化操作
    kernel = np.matrix('0 -1 0; -1 5 -1; 0 -1 0')
    dst = cv2.filter2D(img,-1,kernel)

    cv2.imshow("Result", dst)
    cv2.waitKey(0)
    
    #灰度
    gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
    
    #二值化
    (_, thresh) = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("image", thresh)
    cv2.waitKey(0)
    
    #开运算
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
    open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

    # perform a series of erosions and dilations
    #腐蚀、膨胀
    open = cv2.erode(open, None, iterations = 4)
    open = cv2.dilate(open, None, iterations = 4)
    
    cv2.imshow("image", open)
    cv2.waitKey(0)
    
    #闭运算
    close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
    cv2.imshow("image", close)
    cv2.waitKey(0)
    
    #查找轮廓
    (contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    area = cv2.contourArea(contours[0])
    print area
    
    cv2.drawContours(img, [contours[1]], -1, (0, 255, 0), 3)
    
    cv2.imshow("image", img)
    cv2.waitKey(0)

完。

© 著作权归作者所有

共有 人打赏支持
sskicgah

sskicgah

粉丝 7
博文 43
码字总数 32720
作品 0
福州
程序员
OpenCV中几何形状识别与测量

经常看到有学习OpenCV不久的人提问,如何识别一些简单的几何形状与它们的颜色,其实通过OpenCV的轮廓发现与几何分析相关的函数,只需不到100行的代码就可以很好的实现这些简单几何形状识别与...

gloomyfish
04/16
0
0
opencv中复制视频不成功,请大牛请教

大牛们,本人在opencv+python环境下,用下列代码创建新视频,文件创建成功,但是该视频文件没有任何内容写入,是什么原因啊 import cv2 videoCapture = cv2.VideoCapture('f://video.avi') ...

哈泥湖
2013/07/19
766
1
【OpenCV3图像处理】提取轮廓的凸包、外包矩形、最小外包矩形、最小外包圆

1、提取轮廓的凸包 convexhull()函数(点我看OpenCV3.2帮助文档) 函数调用形式: void convexhul(InputArray points,OutputArray hull,bool clockwise=false,bool returnPoints=true) 输入......

u011574296
2017/06/15
0
0
iOS中使用Tesseract提取身份证号码

iOS中使用Tesseract提取身份证号码 曾静的技术博客2017-07-1557 阅读 iOS ( ,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然...

曾静的技术博客
2017/07/15
0
0
【工具语言系列】关于 MATLAB 图像分割 & 边缘检测

如何进行图像分割 图像分割 基于边缘的图像分割 微分算子 曲线拟合边缘检测 Canny边缘检测算子 轮廓跟踪 边缘形态检测 霍夫变换 多尺度轮廓提取 基于区域的图像分割 阈值化分割 特征空间聚类...

AllenMoore
01/27
4
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash工作管理详解

Bash工作管理 Bash的工作是对具体任务的一个抽象表述,更确切的说是对管道的应用上的表述。Bash中的工作在形式上表现为一组相关进程或单个进程。工作进程组分为前台和后台,前台进程会对键盘...

小陶小陶
18分钟前
2
0
Qt那些事0.0.1

LIBS += -L$$PWD/lib/ -lStv1QMAKE_POST_LINK += $$QMAKE_COPY $$replace(PWD,"/","\\")\lib\Stv1.dll $$replace(OUT_PWD,"/","\\")\debug\Stv1.dll pro文件里,写起来按理说应该是轻松地......

Ev4n
27分钟前
2
0
如何正确的使用动态VPS(Linux)自动更换IP

背景 现在越来越多的人开始玩网赚项目,蚂蚁再小也是肉,薅羊毛的羊毛党越来越多,一些网赚项目也越来越受欢迎,但是一般的网赚项目都是要求真实用户的,所以要想获得大量的真实ip,一种动态...

bengozhong
34分钟前
1
0
分布式任务系统(LTS)部署学习使用

章节速览 背景介绍 环境部署 LTS架构原理&代码样例 个人心得经验 一、背景介绍 很多公司应该都会遇到job服务部署执行时:定时、并发、分布式这些问题。有的人就是只跑一个job服务,这样会简单...

硅步积千里
44分钟前
29
0
kotlin使用spring data redis(一)

1.引包 #忘记引用这个包的下场就是#nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfigcompile 'org.apache.commons:commons-p......

weidedong
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部