1 背景介绍
我们的实验对象是一种小型昆虫,不同的处理可能引起其翅面积的改变,因此我们需要测量不同处理下该昆虫的翅面积。
之前用的方法是在PS软件下,数每个翅的像素点,然后与标准物相比较,算的昆虫翅面积,但这一过程耗时太长。
这里介绍一种快速测量昆虫翅面积的方法,原理也是数像素点,但这一过程由python完成,能节省大量时间。
2 图片准备
由于昆虫翅太小,我们将同一个处理下的昆虫翅摆于显微镜下拍摄,请确保镜头与翅面保持垂直,以减少误差。
在PS软件下将所有翅选中,并填充为黑色,背景也可填充为白色,以便更好的区分翅与背景。
以下是一张处理后的效果图,我们将翅填充为黑色,而对背景未做修改。

3 翅面积测量
1)实现原理
本例采用opencv库的findContours函数进行轮廓识别和翅面积计算。
具体的实现过程不难,我们只需要根据自己的图像,将其转为二值图像即可,一般是将背景填充为黑色(灰度值为0),而目标物填充为白色(灰度值255)。
2)本例代码
import cv2 as cv
import numpy as np
from PIL import Image
# 输入图片路径
path = r'D:\users\Desktop\5mg-chi-124.tif'
# 转为灰度图像,读取信息
img = np.array(Image.open(path).convert('L'))
# 转为二值图像,便于识别轮廓
rows, cols = img.shape
for i in range(rows):
for j in range(cols):
# 将灰度值小于50的像素改为1,其他的改为0
if (img[i, j] < 50):
img[i, j] = 1
else:
img[i, j] = 0
# 轮廓识别
contours, hierarchy = cv.findContours(img, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
# 翅面积测量
area = []
for i in contours:
# 过滤面积小于100的轮廓
if (cv.contourArea(i) < 100):
continue
else:
area.append(cv.contourArea(i))
# 计算翅面积平均值
averageArea = np.mean(area)
# 打印翅面积信息
print(area)
print(len(area))
print('平均值为:' + str(averageArea))
3) 测量结果
成功识别图中29个翅的翅面积,并得到这个处理下昆虫翅面积的平均值。

4 额外说明
本方法可用于实现对昆虫翅面积的批量测量,节省大量时间;
测量结果为翅所占的像素点数量,可用于相对定量;
若要获得真实的翅面积,可在显微镜下拍摄一张标准物,用同样方法测量其像素点数量,将目标物与标准物比较获得真实面积。

本文介绍了一种利用Python和OpenCV库快速测量昆虫翅面积的方法,通过将图像转化为二值图像并识别轮廓,实现了对昆虫翅面积的批量测量,大大提高了效率。
479

被折叠的 条评论
为什么被折叠?



