- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章opencv 图像轮廓的实现示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
图像轮廓 。
Contours:轮廓 轮廓是将没有连着一起的边缘连着一起。 边缘检测检测出边缘,边缘有些未连接在一起.
注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测。 2.查找轮廓需要更改原始图像,通常使用原始图像的一份进行拷贝。 3.在opencv里,是从黑色背景里找白色。因此对象必须是白色,背景为黑色.
方法 。
通过cv2.findContours() 查找轮廓在哪里,再通过 cv2.drawContours()将查找的轮廓绘制出来.
contours,hierarchy=cv2.findContours(image,mode,method) contours:轮廓 hierarchy:图像的拓扑信息(轮廓层次)(存储上一个轮廓,父轮廓…) image:原始图像 mode:轮廓检索方式 method:轮廓的近似方法 。
1
|
r
=
cv2.drawContours(image, contours, contourIdx, color[, thickness])
|
r:目标图像 image:原始图像 contours: 所有的输入轮廓边缘数组 contourIdx :需要绘制的边缘索引,如果全部绘制为-1。如果有多个目标,可以绘制第一个目标0,第二个目标1,第三个目标2.。。 color:绘制的颜色,为BGR格式的SCalar thickness:可选,绘制的密度,即轮廓的画笔粗细 。
1
2
3
4
5
6
7
8
9
10
11
|
import
cv2
import
numpy as np
o
=
cv2.imread(
'lena256.bmp'
)
gray
=
cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
#BGR-灰度
ret, binary
=
cv2.threshold(gray,
127
,
255
,cv2.THRESH_BINARY)
#二值图像
contours, hierarchy
=
cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
co
=
o.copy()
#对原始图像进行绘制
r
=
cv2.drawContours(co,contours,
-
1
,(
0
,
127
,
127
),
4
)
#co为复制图像,轮廓会修改原始图像
cv2.imshow(
"original"
,o)
cv2.imshow(
"contours"
,r)
cv2.waitKey()
|
cv2.cvtColor(input_image, flag)用于颜色空间转换。 input_image:需要转换的图像 flag:转换类型 cv2.COLOR_BGR2GRAY : BGR -灰度 cv2.COLOR_BGR2RGB:BGR-RGB cv2.COLOR_BGR2HSV:BGR-HSV 。
最小外接圆 。
函数cv2.minEnclosingCircle() 可以帮我们找到一个对象的外切圆。它是所有能够包括对象的圆中面积最小的一个.
案例:现有下面这样一张图片,要求将图片中心的花朵标记出来.
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import
numpy as np
import
cv2 as cv
img
=
cv.imread(
"image.jpg"
,
0
)
#为了显示方便,这里将图片进行缩放
x,y
=
img.shape
img
=
cv.resize(img,(y
/
/
2
,x
/
/
2
))
#将图片二值化,由于前景物体是黑色的,因此在二值化时采用cv.THRESH_TOZERO_INV这种方式
ret,thresh
=
cv.threshold(img,
127
,
255
,cv.THRESH_TOZERO_INV)
#寻找图片中的轮廓,mode=cv.RETR_EXTERNAL,这是为了寻找最外层的轮廓
im,contour,hierarchy
=
cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
#cv.minEnclosingCircle函数的参数要求是ndarray类型,因此这里将找到的
# 轮廓中的所有的点存放在一个列表中,然后使用这个列表创建数组
point_list
=
[]
for
i
in
contour:
for
j
in
i:
point_list.append(j[
0
])
point_array
=
np.array(point_list)
#使用最小外接圆函数,返回值为这个圆的圆心坐标和圆半径长度
(x,y),radius
=
cv.minEnclosingCircle(point_array)
#图片上的坐标均为整数,圆的半径也要求是整数,因此将它们强制转换为int类型
center
=
(
int
(x),
int
(y))
color
=
cv.cvtColor(img,cv.COLOR_GRAY2BGR)
color
=
cv.circle(color,center,radius
=
int
(radius),color
=
(
0
,
0
,
255
),thickness
=
2
)
#显示图片
cv.imshow(
"color"
,color)
cv.waitKey(
0
)
cv.destroyAllWindows()
|
程序结果:
凸包 。
凸包与轮廓近似相似,但不同,虽然有些情况下它们给出的结果是一样的。函数cv2.convexHull() 可以用来检测一个曲线是否具有凸性缺陷,并能纠正缺陷。一般来说,凸性曲线总是凸出来的,至少是平的。在opencv中使用函数cv.convexhull来寻找轮廓的凸包,该函数的定义为:
hull=cv.convexHull( points[, hull[, clockwise[, returnPoints]]]) 。
这个函数的参数如下:
Points:我们需要传入的轮廓 。
Hull:输出,通常不需要 。
clockwise: 取向标志,如果为True,凸包的方向是顺时针方向,否则为逆时针方向; 。
returnPoints: 默认为True. 它会返回凸包上点的坐标。如果设置为False,就会返回与凸包点对应的轮廓上的点.
还是上面的这副图片,我们对上面的代码稍加修改,可以得到凸包的形状,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import
numpy as np
import
cv2 as cv
img
=
cv.imread(
"image.jpg"
,
0
)
#为了显示方便,这里将图片进行缩放
x,y
=
img.shape
img
=
cv.resize(img,(y
/
/
2
,x
/
/
2
))
#将图片二值化,由于前景物体是黑色的,因此在二值化时采用cv.THRESH_TOZERO_INV这种方式
ret,thresh
=
cv.threshold(img,
127
,
255
,cv.THRESH_TOZERO_INV)
#寻找图片中的轮廓,mode=cv.RETR_EXTERNAL,这是为了寻找最外层的轮廓
im,contour,hierarchy
=
cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
#cv.minEnclosingCircle函数的参数要求是ndarray类型,因此这里将找到的
# 轮廓中的所有的点存放在一个列表中,然后使用这个列表创建数组
point_list
=
[]
for
i
in
contour:
for
j
in
i:
point_list.append(j[
0
])
point_array
=
np.array(point_list)
#寻找凸包,返回值是凸包上的点
hull
=
cv.convexHull(point_array,returnPoints
=
True
)
color
=
cv.cvtColor(img,cv.COLOR_GRAY2BGR)
#将凸包绘制出来,需要注意的是:这里需要将凸包上点的坐标写成一个
#列表传入函数cv.ploylines,否则绘制出来的只是凸包上的一系列点
color
=
cv.polylines(color,[hull],
True
,(
0
,
0
,
255
),
2
)
#显示图片
cv.imshow(
"color"
,color)
cv.waitKey(
0
)
cv.destroyAllWindows()
|
程序运行结果为:
图像掩模和像素点 。
有时我们需要构成对象的所有像素点,我们可以将图像的所有轮廓提取出来,然后使用函数cv.drawContours()将轮廓内的区域填充为指定的颜色。然后使用cv.findNonZeros()函数将非零像素点的坐标提取出来,这样就得到了构成对象的像素点。我们还是在上面的图片上进行操作,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import
numpy as np
import
cv2 as cv
img
=
cv.imread(
"image.jpg"
,
0
)
#为了显示方便,这里将图片进行缩放
x,y
=
img.shape
img
=
cv.resize(img,(y
/
/
2
,x
/
/
2
))
#将图片二值化,由于前景物体是黑色的,因此在二值化时采用cv.THRESH_TOZERO_INV这种方式
ret,thresh
=
cv.threshold(img,
127
,
255
,cv.THRESH_TOZERO_INV)
#寻找图片中的轮廓,mode=cv.RETR_EXTERNAL,这是为了寻找最外层的轮廓
im,contour,hierarchy
=
cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
#创建一个填充轮廓内像素点的画板,背景颜色为黑色,这里我们使用numpy创建一个全零的二维数组
mask
=
np.zeros(img.shape,dtype
=
np.uint8)
#将参数thickness设置为-1,这样cv.drawContours函数就会将轮廓内的像素点填充为指定的颜色
mask
=
cv.drawContours(mask,contour,contourIdx
=
-
1
,color
=
(
255
,
255
,
255
),thickness
=
-
1
)
#寻找mask内非零像素点,将其存放为一个numpy数组
NonZeroPoints
=
np.array(cv.findNonZero(mask))
#形状变换,将其改变为一个二维数组,数组的每一行存放一个非零像素点的坐标
NonZeroPoints
=
NonZeroPoints.reshape((
-
1
,
2
))
#验证我们提取出来的像素点坐标是否正确,我们使用变量
#column和row分别存放非零像素点在图像中坐标的列数和行数
column
=
NonZeroPoints[:,
0
]
row
=
NonZeroPoints[:,
1
]
#在新的画板上将这些点绘制出来,将这些坐标对应的像素点的值设为255
mask1
=
np.zeros(img.shape)
mask1[row,column]
=
255
#显示结果
cv.imshow(
"mask"
,mask)
cv.imshow(
"mask1"
,mask1)
cv.waitKey(
0
)
cv.destroyAllWindows()
|
程序运行结果:
通过上面两幅图的对比结果,我们可以看到:对象的组成像素点被正确地提取出来了.
到此这篇关于opencv 图像轮廓的实现示例的文章就介绍到这了,更多相关opencv 图像轮廓内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/kobeyu652453/article/details/107164978 。
最后此篇关于opencv 图像轮廓的实现示例的文章就讲到这里了,如果你想了解更多关于opencv 图像轮廓的实现示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试学习 Knockout 并尝试创建一个照片 uploader 。我已成功将一些图像存储在数组中。现在我想回帖。在我的 knockout 码(Javascript)中,我这样做: 我在 Jav
我正在使用 php 编写脚本。我的典型问题是如何在 mysql 中添加一个有很多替代文本和图像的问题。想象一下有机化学中具有苯结构的描述。 最有效的方法是什么?据我所知,如果我有一个图像,我可以在数据
我在两个图像之间有一个按钮,我想将按钮居中到图像高度。有人可以帮帮我吗? Entrar
下面的代码示例可以在这里查看 - http://dev.touch-akl.com/celebtrations/ 我一直在尝试做的是在 Canvas 上绘制 2 个图像(发光,然后耀斑。这些图像的链接
请检查此https://jsfiddle.net/rhbwpn19/4/ 图像预览对于第一篇帖子工作正常,但对于其他帖子则不然。 我应该在这里改变什么? function readURL(input)
我对 Canvas 有疑问。我可以用单个图像绘制 Canvas ,但我不能用单独的图像绘制每个 Canvas 。- 如果数据只有一个图像,它工作正常,但数据有多个图像,它不工作你能帮帮我吗? va
我的问题很简单。如何获取 UIImage 的扩展类型?我只能将图像作为 UIImage 而不是它的名称。图像可以是静态的,也可以从手机图库甚至文件路径中获取。如果有人可以为此提供一点帮助,将不胜感激。
我有一个包含 67 个独立路径的 SVG 图像。 是否有任何库/教程可以为每个路径创建单独的光栅图像(例如 PNG),并可能根据路径 ID 命名它们? 最佳答案 谢谢大家。我最终使用了两个答案的组合。
我想将鼠标悬停在一张图片(音乐专辑)上,然后播放一张唱片,所以我希望它向右移动并旋转一点,当它悬停时我希望它恢复正常动画片。它已经可以向右移动,但我无法让它随之旋转。我喜欢让它尽可能简单,因为我不是编
Retina iOS 设备不显示@2X 图像,它显示 1X 图像。 我正在使用 Xcode 4.2.1 Build 4D502,该应用程序的目标是 iOS 5。 我创建了一个测试应用(主/细节)并添加
我正在尝试从头开始以 Angular 实现图像 slider ,并尝试复制 w3school基于图像 slider 。 下面我尝试用 Angular 实现,谁能指导我如何使用 Angular 实现?
我正在尝试获取图像的图像数据,其中 w= 图像宽度,h = 图像高度 for (int i = x; i imageData[pos]>0) //Taking data (here is the pr
我的网页最初通过在 javascript 中动态创建图像填充了大约 1000 个缩略图。由于权限问题,我迁移到 suPHP。现在不用标准 标签本身 我正在通过这个 php 脚本进行检索 $file
我正在尝试将 python opencv 图像转换为 QPixmap。 我按照指示显示Page Link我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/2
我试图在这个 Repository 中找出语义分割数据集的 NYU-v2 . 我很难理解图像标签是如何存储的。 例如,给定以下图像: 对应的标签图片为: 现在,如果我在 OpenCV 中打开标签图像,
import java.util.Random; class svg{ public static void main(String[] args){ String f="\"
我有一张 8x8 的图片。 (位图 - 可以更改) 我想做的是能够绘制一个形状,给定一个 Path 和 Paint 对象到我的 SurfaceView 上。 目前我所能做的就是用纯色填充形状。我怎样才
要在页面上显示图像,你需要使用源属性(src)。src 指 source 。源属性的值是图像的 URL 地址。 定义图像的语法是: 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。此
**MMEditing是基于PyTorch的图像&视频编辑开源工具箱,支持图像和视频超分辨率(super-resolution)、图像修复(inpainting)、图像抠图(matting)、
我正在尝试通过资源文件将图像插入到我的程序中,如下所示: green.png other files 当我尝试使用 QImage 或 QPixm
我是一名优秀的程序员,十分优秀!