批量图片添加图片轮廓(怎么给图片添加轮廓)
1087
2022-05-29
简 介:
本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。
关键词:
OpenCV,contours,中心点
寻找轮廓的中心
目 录
Contents
形状检测和分析
利用OpenCV寻
找边界中心点
总 结
寻找轮廓的中心
目 录
Contents
形状检测和分析
利用OpenCV寻
找边界中心点
总 结
今
天在图像处理中需要用到OpenCV的轮廓中心,在 OpenCV center of contour 中看到了给定的方法。将其总结如下,便于以后的应用。
1.1 形状检测和分析
今天我们开启一个新的三联示例程序,用于形状检测和分析。通过这个系列,我们可以:
1. 计算边界、形状的中心点;
2. 识别不同的形状,比如圆形、方形,举行,三角形,五边形。这些仅仅根据边界的性质就可以进行识别;
3. 标示形状的颜色。
相比于PyImageSearch网文来说,这个话题比较基础,但是为了回应下面我所遇到的提问:
我如何能够使用Python和OpenCV计算边界的中心点?
今天的博文中,我将回答上面的问题。
在这个系列的上一篇博文中,我们基于已经知晓了物体的边界然后来识别图像中的形状。
1.2 利用OpenCV寻找边界中心点
在上面的图像中,你可以看到一系列从建筑纸张材料切割下来的不同形状,也注意到他们并不是完美的多边形,也就是长方形并不是严格的长方形,圆形也不是那么的圆。毕竟它们是人徒手绘制出并切割下来的形状,所以包含了不同的变形。
记住这一点,今天的教程的目的是:
检测图片中各种形状的外轮廓;
接着计算所有形状的中心点,也称为区域的中心;
为了实现这个目标,我们需要进行一些图像处理,包括:
将图片转换成灰度图;
进行模糊化来提高轮廓检测精度;
将图像进行二值化;采用经典的边缘检测和阈值处理完成二值化。这里采用阈值处理的方式。
在开始正式编程之前,你需要先保证在你的系统中已经安装了 imutils Python Packages :
pip install --upgrade imutils
1
现在我们可以开始编程了。
建立一个新的文件,命名为: center_of_shape.py,下面是相应的代码:
# import the necessary packages import argparse import imutils import cv2 # construct the argument parse and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to the input image") args = vars(ap.parse_args()) # load the image, convert it to grayscale, blur it slightly, # and threshold it image = cv2.imread(args["image"]) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2 - 4 行为输入相应的软件包,接着对于命令行参数进行分析。 我们只需要单开关量 ---image ,这是给出我们需要处理的图片在磁盘上的路径。
我们将该图像从磁盘上载入到及其内存,使用灰度转换进行预处理。采用5×5尺寸的高斯核完成图像平滑,最后进行阈值处理。
输出的图像如下图所示:
可以注意到,经过阈值处理,各类形状为白色,背景为黑色。
下一步就是找到这些区域的边缘:
# find contours in the thresholded image cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts)
1
2
3
4
在程序中的20 - 21 行,调用 cv2.findContours 返回形状的轮廓,对应的图片中白色大块区域的边缘。 根据所使用的OpenCV的版本不同, 2.4.3,2.3.4 行22 使用恰当的元组参数。你可以在 这个链接 看到关于不同OpenCV版本在 cv2.findContours 函数返回的不同参数。
下面我们开始处理每一个轮廓:
# loop over the contours for c in cnts: # compute the center of the contour M = cv2.moments(c) cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) # draw the contour and center of the shape on the image cv2.drawContours(image, [c], -1, (0, 255, 0), 2) cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1) cv2.putText(image, "center", (cX - 20, cY - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) # show the image cv2.imshow("Image", image) cv2.waitKey(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
程序行 25 是开始一个循环来处理每一个单个轮廓,紧接着 程序行27 计算他们的图像矩( image moments )。
在计算机视觉和图像处理中,图像矩表征了图像中物体的形状。这些矩给出了 形状的基本统计特征,包括物体的面积,中心(也就是物体中心 ( x , y ) \left( {x,y} \right) (x,y) 的坐标位置),方向以及其他的一些可能用到的特性。
这里我们只对轮廓的中心感兴趣,通过程序行 28 - 29 我们计算获得轮廓的中心点。
从程序行 32-34 进行如下的处理:
通过使用 cv2.drawContours 在当前形状周围绘制轮廓;
在形状中心 (cX, cY) 绘制白色圆圈;
在白色圆圈附近输出字符text。
在计算机命令窗口使用下面的命令运行上述Python程序:
$ python center_of_shape.py --image shapes_and_colors.png
1
下面是显示的运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBoGbgBA-1643421016158)(https://pyimagesearch.com/wp-content/uploads/2016/01/center_of_contour_results.gif#pic_center =560x )]
你可以看到每一个形状都被正确的检测到。
本
文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。
■ 相关文献链接:
OpenCV center of contour
imutils Python Packages
这个链接
image moments
● 相关图表链接:
图1.1.1 下面将要使用到的具有很多不同颜色形状的图片
图1.2.2 将图片进行阈值处理输出二值化的图片,这类形状为白色,背景为黑色
OpenCV Python
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。