Python中如何计算图片中物体的长宽?有什么好的思路吗?
示例图片如下:
![]()
我想计算大肠杆菌的长宽(图片有像素和尺寸换算比例),有什么好的思路么。
我用mahotas只能算周长。
现在知道的一个笨方法就是用ImageJ进行一个一个计算,但是有上千个,感觉压力好大。所以想请问一下有什么好的思路或者模块可以实现么,谢谢~
Python中如何计算图片中物体的长宽?有什么好的思路吗?
ImageJ 是手工算的吗?
可以试一下:
取个阈值把细菌给分割出来,然后长宽就大致取个内切和外接圆的直径…
用OpenCV找轮廓然后算最小外接矩形是个直接的办法。关键代码就这几步:
import cv2
import numpy as np
# 1. 读图转灰度
img = cv2.imread('your_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2. 二值化(根据图片调整阈值)
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 3. 找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 4. 对每个轮廓计算最小外接矩形
for cnt in contours:
rect = cv2.minAreaRect(cnt) # 返回(中心点, (宽,高), 旋转角度)
box = cv2.boxPoints(rect) # 获取四个顶点
box = np.int0(box)
width, height = rect[1] # 这里宽高可能根据旋转角度互换
# 统一处理:长边为length,短边为width
length = max(width, height)
width = min(width, height)
print(f"物体尺寸: 长={length:.1f}px, 宽={width:.1f}px")
# 可视化(可选)
cv2.drawContours(img, [box], 0, (0,255,0), 2)
cv2.imshow('result', img)
cv2.waitKey(0)
注意几个实际细节:1)二值化效果直接影响结果,复杂背景可能需要用自适应阈值或边缘检测;2)minAreaRect返回的宽高可能互换,需要按实际长宽区分;3)像素尺寸转实际尺寸需要标定,放个参照物就行。
简单说就是:二值化找轮廓,用最小外接矩形算尺寸。
这样一次就能做完,但是准确多不敢保证…你可以把效果图用 matplotlib 或者 opencv 画出来看一下
ppm
不懂计算机图形学
分离红色通道,然后边缘特征提取
灰度化,然后找跟目的颜色 ± xx 的像素点不行吗?
可以,但是这个只是画出轮廓,现在关键步数就是不知道怎么计算到长宽···
边缘提取分割出子区域,长宽有明显分界线算子像素距离就好了,或者直接数灰度超过多少的像素面积,用长度或者宽度反求,异常的图片保存下来人工处理呗
至少这个图红色通道特征还是蛮明显的,边缘特征感觉用阈值就可以了
最小包围矩形,MinAreaRect,把每个大肠杆菌的轮廓带进去就行了
pixel per square meter
每平米像素数量
试试 Halcon?
很久前用其他语言调 Halcon 做过类似的事情。
好的,非常感谢
老哥你是学生物的?
如果你会用 python 的话,我推荐你一个方法,主要使用一个叫 skimage 的包。
先把图片滤波,把噪声去掉。
然后把边缘提取出来,删掉不完整的。Label 之后再 regionprops,得到边缘的坐标和质心坐标。
距离质心最长的就是半长轴,最短的就是半短轴,翻倍之后就是长和宽。
嗯嗯,是的
好的,我就是用这种方法做了,谢谢您~

