0

通过在此图像中应用 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)
4

1 回答 1

2

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

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

所以为了避免这个问题,

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

此处对此进行了更多解释:“列表(轮廓)”的结果表示什么?

案例 2:白色背景问题

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

案例 3:对象中的孔问题

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

示例代码:

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

于 2013-01-21T11:00:21.090 回答