image-processing - 通过 find_contour 获取每个标志的 1 个轮廓并在

通过在此图像中应用 find_contour(opencv 模块)可能只获得 5 个对象(每个符号一个):https://docs.google.com/file/d/0ByS6Z5WRz-h2WHEzNnJucDlRR2s/edit ?
现在我获得了 64 个对象

之后,我想检索 Humoments 并与其他图像进行比较。
现在我只尝试对相同的图像进行一点翻译,为了测试它返回它们是相同的。

我的问题是我如何才能只获得 5 个对象来应用体量,或者是否有其他解决方案来计算图像的体量?

import cv2
im = cv2.imread('Sassatelli 1984 n. 165 mod1.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(imgray, (0,0), 5) 
cv2.imshow('Blur', blur)
cv2.waitKey()
th = 20
edges = cv2.Canny(blur, th, th*3)
cv2.imshow('canny',edges)
cv2.waitKey()
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print('objects found')
print(len(contours))
cnt = contours[0]
cv2.drawContours(blur,contours,-1,(0,255,0),3)
cv2.imshow('draw contours',blur)
cv2.waitKey()
moments = cv2.moments(cnt)

最佳答案

案例一:图片保存为jpg格式的问题
当您以 jpg 格式保存仅黑白(即仅像素值 0 和 255)图像时,存在有损压缩,这会改变像素值。如果你想看,创建这样的图像,将其保存为 jpg,打开保存的图像并缩放到黑白边缘。您可以看到像素值的变化。

所以当你找到轮廓时,你期望只有白色的物体,但实际上,也有一些中间值,这也被认为是轮廓。它增加了轮廓的数量。

所以为了避免这个问题,

  • 更好地将图像保存为 png 或任何其他无损格式等。
  • 在找到轮廓之前应用一个阈值(值为 127 或您喜欢的值)以使图像成为真正的二进制值。

  • 这里有更多解释:What does result of 'list(contour)' denote?

    案例2:白色背景问题

    OpenCV findcontours() 旨在在黑色背景中查找白色对象。因此,如果您的背景是白色的,它也被视为一个对象。所以在找到轮廓之前反转图像。

    案例 3:对象中的孔问题

    如果您的对象中有孔,它也被视为对象。因此,如果您只想要对象的外部边界,请使用 cv2.RETR_EXTERNAL findcontours() 函数的标志。

    示例代码:
    import cv2
    import numpy as np
    img = cv2.imread('sof.jpg')
    gray = cv2.imread('sof.jpg',0)
    ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
    

    阈值和倒置图像 :



    现在找到轮廓,绘制它,检查轮廓的数量:
    cv2.drawContours(img,contours,-1,(0,255,0),2)
    cv2.imshow('img',img),cv2.waitKey(0),cv2.destroyAllWindows()
    

    结果:



    注意:

    在这里,我只拍摄了外部轮廓。如果要从这些对象中删除内部空洞,则需要使用 cv2.RETR_TREE 或 cv2.RETR_CCOMP 标志,并检查它们的层次结构并删除它们。在这个链接中有解释:Contours 5 : Hierarchy

    关于image-processing - 通过 find_contour 获取每个标志的 1 个轮廓并在 cv2 中检索其 Humoments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14430932/

    相关文章:

    opencv - OpenCV Codebook方法-背景模型

    image-processing - 使用 openCV 检测图案区域

    opencv - 在OpenCV中编译

    python - 用于在 python 中存储多个图像的高效数据结构

    opencv - 最大颜色数和最大深度

    c++ - 负 RGB 值

    opencv - "cache"cv Warp透视图

    image - GUI,可在ubuntu12.04中使用OpenCV查看图像中的值

    python - opencv-python:不是一个numpy数组

    eclipse - fatal error : opencv2/core/core_c. h:没有这