如何通过照片找到物体的面积?

How can i find area of an object by photo?

我需要求一个不规则物体的面积,比如这张柠檬素描的面积。 这是我的算法

  1. 在附近放一枚硬币
  2. 以像素为单位测量其半径,
  3. 知道它的实际半径计算像素与毫米的比率。
  4. 以某种方式从草图中删除背景
  5. 以像素为单位计算其面积(只需计算它们)
  6. 乘以已知的比值得到它的实际面积。

我发现了一些问题:

  1. 当附近有其他物体时,cv2 houghcircles 方法不起作用
  2. Remove.bg API 仅处理完全着色的对象,因此它删除了笔画之间的空格。

能否请您提出任何其他方法,或者帮助我实现这类东西。示例图片和我设法编写的一些代码将在下面。

霍夫圆

import cv2
import numpy as np

img = cv2.imread('thresh.png',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=99,minRadius=100,maxRadius=500)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
    print(f"Radius: {i[2]}")
cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

Remove.bg API

def clean(path):
    import requests
    response = requests.post(
        'https://api.remove.bg/v1.0/removebg',
        files={'image_file': open('imagepath.png', 'rb')},
        data={'size': 'auto'},
        headers={'X-Api-Key': 'my Api key'},
    )
    if response.status_code == requests.codes.ok:
        with open('no-bg.png', 'wb') as out:
            out.write(response.content)
    else:
        print("Error:", response.status_code, response.text)

谢谢!

隔离硬币: HoughCircles 是一个很好的方法,尽管从角度来看硬币可能不是一个完美的圆。您也可以尝试 watershed 算法来分割所有对象,然后根据颜色或圆度检测哪个对象是硬币(例如,哪个对象的质心和不同边缘点之间的距离最相似) .

隔离绘图: 如果图画是除硬币外唯一剩下的物体,请屏蔽硬币和阈值(例如使用 Otsu)以将图像转换为二进制。绘图中仍然会有孔,您可以使用 opening.

消除这些孔