首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV:在二进制图像中绘制对象的轮廓

OpenCV:在二进制图像中绘制对象的轮廓
EN

Stack Overflow用户
提问于 2017-06-06 05:38:52
回答 2查看 11.5K关注 0票数 3

按照http://docs.opencv.org/trunk/d4/d73/tutorial_py_contours_begin.html提供的一个示例,我在Spyder环境中使用python在二进制图像中绘制检测到的组件的轮廓。我的代码如下:

代码语言:javascript
运行
复制
im = cv2.imread('test.jpg') #raw RGB image
im2 = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #gray scale image
plt.imshow(im2,cmap = 'gray')

如下图所示:

然后,

代码语言:javascript
运行
复制
thresh, im_bw = cv2.threshold(im2, 127, 255, cv2.THRESH_BINARY) #im_bw: binary image
im3, contours, hierarchy = cv2.findContours(im_bw,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(im2, contours, -1, (0,255,0), 3)
plt.imshow(im2,cmap='gray')  #without the code, only an array displayed in the console

由于某些原因,这些代码不会给出带有等高线的图形。但是如果我修改最后两行代码,如下所示:

代码语言:javascript
运行
复制
cv2.drawContours(im, contours, -1, (0,255,0), 3)
plt.imshow(im,cmap='gray')

它产生一个带有轮廓的图形:

我对这些代码是如何工作的感到困惑?Cv2.drawCoutour是否仅适用于GRB图像?希望不是。此外,值得注意的是,轮廓提供了一个3D数组:

代码语言:javascript
运行
复制
idx = contours[0]
print idx.shape

(392L, 1L, 2L)

idx应该存储所有轮廓点的像素坐标。但是如何解释每个维度表示的内容,并从中获取每个轮廓点的像素坐标呢?然后,我可以使用这些坐标来绘制等高线,而不需要求助于cv2.drawContours.

EN

回答 2

Stack Overflow用户

发布于 2017-06-06 10:05:40

Cv2.findContour和cv2.drawContour都是破坏性的方法,修改了原始的输入图像,后者只适用于用于绘图的RBG图像,这解释了绘制的灰度图像中没有显示可见的轮廓。

除了cv2.drawContour之外,还可以使用存储在cv2.findContour获得的“contour”(在上面的代码中)中的边界像素的索引轻松地绘制轮廓。

票数 2
EN

Stack Overflow用户

发布于 2021-06-06 11:15:45

造成混淆的原因是,cv2.findContour只能应用于二进制图像,而cv2.drawContour只能应用于RGB。这就是为什么要绘制轮廓,您需要将im2转换为RGB,然后绘制轮廓,然后再次将im2转换为二进制(灰度)。但真正可怕的是,结果看起来不会像您预期的那样:您的轮廓像素看起来是灰色而不是白色(这意味着它们的值在150-170之间,而不是255)。它可以很容易地补救: im2im2!=0=255。

代码语言:javascript
运行
复制
im_gray = cv2.imread('test.jpg',0)
im_color=cv2.imread('test.jpg',1)
im3, contours, hierarchy = 
cv2.findContours(im_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cv2.drawContours(im_color, contours, -1, (0,255,0), 3)
im = cv2.cvtColor(im_color, cv2.COLOR_BGR2GRAY)
# if you plot im now you will see grey contours not white
im[im!=0]=255
# all contours are white now!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44378099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档